初次用PointCNN的同學,容易看不太懂它的代碼結構。
我們從README.md開始看起。
以分割任務中的Semantic3D數據爲例:
cd data_conversions#
bash download_semantic3d.sh bash un7z_semantic3d.sh mkdir ../../data/semantic3d/val #建了一個驗證集,把四個數據放了進去。
mv ../../data/semantic3d/train/bildstein_station3_xyz_intensity_rgb.* ../../data/semantic3d/train/domfountain_station2_xyz_intensity_rgb.* ../../data/semantic3d/train/sg27_station4_intensity_rgb.* ../../data/semantic3d/train/untermaederbrunnen_station3_xyz_intensity_rgb.* ../../data/semantic3d/val
cd split_data python3 semantic3d_split.py
cd .. python3 prepare_multiChannel_seg_data.py -f ../../data/semantic3d/out_part -c 6
cd ../pointcnn_seg ./train_val_semantic3d.sh -g 0 -x semantic3d_x8_2048_k16
這是一些列linux上的操作:
首先進入‘data_conversions’文件夾;
然後運行‘download_semantic3d.sh’腳本,用來加載數據集;
接着運行‘un7z_semantic3d.sh’解壓;
接着用‘mkdir’命令在這個文件夾中新建子文件夾,用來存放驗證集;
下一行‘mv’是把這幾個東西移動到剛纔建的文件夾中;
再然後,進入'split_data'文件夾,
運行腳本‘semantic3d_split.py’,對原始數據進行切分,因爲原始數據太大,我們先將它們切成小塊,進行處理。
再然後,返回‘data_conversions’文件夾;
運行腳本,把剛纔切分好的數據,轉換成能夠處理的格式;
進入‘pointcnn_seg’文件夾;
運行腳本train_val_semantic3d.sh,設置了兩個參數,分別是‘-g 0 -x semantic3d_x8_2048_k16’。
然後就開始訓練了。
到這裏,我們有必要看看train_val_semantic3d.sh做了什麼。裏面有47行代碼,但我們只要關注最後一行就行。
CUDA_VISIBLE_DEVICES=$gpu python3 ../train_val_seg.py -t ../../data/semantic3d/out_part/train_data_files.txt -v ../../data/semantic3d/out_part/val_data_files.txt -s ../../models/seg -m pointcnn_seg -x $setting > ../../models/seg/pointcnn_seg_$setting.txt 2>&1 &
這行代碼讓系統這麼操作:
使用GPU——用python3來運行代碼——返回上一級文件夾——執行train_val_seg.py代碼,並對其設置了幾個參數。分別是
‘-t’,告訴網絡,訓練數據的ground truth文本是哪個。
‘-v’,驗證數據的ground truth文本。
'-s',保存check points and summary的路徑和文件夾。
'-m',使用哪個模型。
'-x',要使用的設置。
可以說這句話的作用非常強大,把訓練網絡所有需要的東西都告訴代碼了。
如果你看過其他分割任務的sh腳本的話,其實和這個sh結構是一模一樣的。而且對於不同分割任務,用於進行訓練的環節(怎麼取模型、取數據、shuffle等操作)統統用一個公共的train_val_seg.py代碼來做了,這樣代碼的可移植性就非常高。