安裝環(huán)境:
作者GitHub上的描述:Python 2.7, TensorFlow 1.0.1, CUDA 8.0 and cuDNN 5.1 on Ubuntu 14.04.此外還需要h5py模塊痴脾。
linux中配置環(huán)境為:Anaconda3.4.0钱雷,Python2.7抑堡,Tensorflow1.4.0以及h5py(安裝主要參考清華鏡像網(wǎng)站+TensorFlow官網(wǎng)安裝介紹)瀑构,CUDA8.0(官網(wǎng)下載普舆,需要事先查看自己的顯卡版本是否支持CUDA8.0)帐萎,cuDNN6.1(需要在nvidia官網(wǎng)上注冊賬號再下載,安裝的時候第一次裝成了5.1敞曹,與tensorflow版本不兼容掉丽,后面換成6.1。tensoflow和cuda异雁、cudnn的對應(yīng)關(guān)系可以在這里找到:https://www.tensorflow.org/install/source)
清華鏡像站tensorflow:https://mirrors.tuna.tsinghua.edu.cn/tensorflow/windows/gpu/
cudnn下載地址:https://developer.nvidia.com/rdp/cudnn-archive
cuda下載地址:https://developer.nvidia.com/cuda-toolkit-archive
實驗室臺式機(jī)的配置是:tensorflow1.1.0(清華鏡像網(wǎng)站下載) + cuda8.0 + cudnn5.1 + python3.5.2(直接安裝在anaconda虛擬環(huán)境中)
代碼運行:
1.分類classification:
1.1 train
python train.py --batch_size=my_size --max_epoch=my_epoch
batch_size和max_epoch都可以自行設(shè)置,設(shè)置的batch_size越小僧须,最后訓(xùn)練的準(zhǔn)確率越低纲刀。如要更改provider.py文件中的DATA_DIR(存放數(shù)據(jù)的文件夾),也一定要同時更新train.py中的TRAIN.FILES以及TEST_FILES担平,因為它們斗魚DATA_DIR有關(guān)
還可以通過TensorBoard分析網(wǎng)絡(luò)結(jié)構(gòu)示绊,監(jiān)測訓(xùn)練的過程:
tensorboard --logdir log
1.2 evaluate
python evaluate.py --visu
2. 語義分割以及識別part segmentation:
首先下載數(shù)據(jù):
cd part_seg
sh download_data
之后運行train.py進(jìn)行訓(xùn)練,運行test.py進(jìn)行測試暂论,得到結(jié)果通危。
3. 代碼分析:
3.1 train.py
train.py主要定義了訓(xùn)練的過程攻柠。前面parser定義了一些默認(rèn)的參數(shù),之后導(dǎo)入model(神經(jīng)網(wǎng)絡(luò)模型)以及確定LOG、TRAIN以及TEST文件夾的位置。
之后定義了獲得學(xué)習(xí)率和衰減的函數(shù):get_learning_rate(batch)?????get_bn_decay(batch)
train函數(shù):設(shè)置loss誊册、model等節(jié)點,和超參數(shù)、place holder一起放在ops里您市。并不真正run,為訓(xùn)練做好準(zhǔn)備役衡,控制每個epoch的訓(xùn)練茵休。
train_one_epoch(sess, ops, train_writer):把下載好的訓(xùn)練文件(TRAIN_FILES文件夾下)先隨機(jī)打亂,之后按照batch的數(shù)目進(jìn)行訓(xùn)練手蝎,其中每一次都要通過旋轉(zhuǎn)和擾動兩個函數(shù)(定義在provider中)擴(kuò)大batched點云榕莺,其實就是對current_data進(jìn)行了處理,并且根據(jù)jittered_data生成feed_dict棵介,最后輸出平均損耗mean loss和準(zhǔn)確率accuracy
eval_one_epoch(sess, ops, test_writer):對于每個測試文件钉鸯,都要把每個batch數(shù)據(jù)喂進(jìn)去,通過sess.run函數(shù)得到每次的summary, step, loss_val, pred_val鞍时,最終輸出 mean loss亏拉,accuracy以及avg class acc(平均識別準(zhǔn)確率)
3.2 models:
models文件夾下,存放了訓(xùn)練所用的三種網(wǎng)絡(luò)結(jié)構(gòu)逆巍,cls(識別)及塘、seg(分割)、T-NET(一種微型網(wǎng)絡(luò)锐极,可以保證點云在經(jīng)過剛體變換之后笙僚,仍然保持語義標(biāo)簽不變。值得一提的是灵再,麻雀雖小五臟俱全肋层,它本身也于大網(wǎng)絡(luò)類似,實現(xiàn)所用到的基礎(chǔ)模塊包括特征抽取層翎迁、最大池化層以及全連接層等)栋猖。所用到的卷積等網(wǎng)絡(luò)結(jié)構(gòu),底層實現(xiàn)部分在utils/tf_uitl.py中汪榔。
網(wǎng)絡(luò)輸入為B*N*3蒲拉。B是batch_size,N是一個樣本中點的個數(shù)痴腌,3是點云維度(三維坐標(biāo))雌团。這里把一個樣本看做了N*3的矩陣,類似二維圖片士聪,之后在其上進(jìn)行卷積等操作锦援。
值得說明的是,網(wǎng)絡(luò)提取的特征不是3這個維度剥悟,這個維度在網(wǎng)絡(luò)開始就被卷成了1灵寺,特征維度是輸入expand出的新維度曼库。
論文中所提及的MLP,在這里也是用卷積實現(xiàn)的替久。
3.3 pointnet_cls.py:
將各種網(wǎng)絡(luò)組織在了一起凉泄,使得結(jié)構(gòu)更加清晰。
get_model定義了網(wǎng)絡(luò)結(jié)構(gòu)蚯根,get_loss定義了損耗后众。
網(wǎng)絡(luò)結(jié)構(gòu)
按照網(wǎng)絡(luò)流程,將整個網(wǎng)絡(luò)分為以下幾個階段颅拦。
網(wǎng)絡(luò)輸入:[B,N,3,1]蒂誉。
1. Input Transform Net與原始輸入相乘
2.特征提取
這部分使用的都是2d-conv。
首先用[1,3]的卷積核將點云的寬卷成1距帅,使用64個卷積核右锨,得到輸出維度[B,N,1,64]。再接一個[1,1]的卷積核碌秸,再次提取特征绍移。
3. Feature Transform-Net與抽取出的特征相乘
這個部分看做子網(wǎng)絡(luò),單獨使用model/transform_net.py實現(xiàn)讥电。
實現(xiàn)過程中蹂窖,先用幾次[1,1]的卷積將特征升維,得到[B,N,1,1024]恩敌。然后在N維度上使用max pooling瞬测,reshape得到[B,1024]。在經(jīng)過FC進(jìn)行特征降維纠炮,得到[B,256]月趟。再生成一個[256,64*64]的T-NET,相乘后得到[B,4096]恢口,reshape成[B,64,64]孝宗。
T-NET和原輸入tensor做張量乘法,expand第二維耕肩,得到STN的輸出[B,N,1,64]碳褒。
4.特征整合
又是一系列的[1,1]卷積,將特征升維到[B,N,1,1024]看疗。
5.對稱操作(Symmetry Function )
在N維度上使用max pooling,再reshape掉為1的維度睦授,得到[B,1024]两芳。
6.預(yù)測結(jié)果
接續(xù)幾個全連接和drop out,降維到40去枷,得到結(jié)果[B,40]怖辆。
loss設(shè)計
loss分為三部分:
classify_loss:分類的交叉熵?fù)p失是复。
mat_diff_loss:這個用于強(qiáng)迫T-NET把自己學(xué)的很正交。
reg_weight:正則項竖螃。
參考原文:https://blog.csdn.net/pikachu_777/article/details/83541115?