Pointnet語義分割任務S3DIS數據集上的注意點

前言

Pointnet的網絡結構和源碼解釋,已在之前寫了次總結,本次主要針對論文中的數據集以.h5爲TensorFlow的輸入格式進行解釋,記錄如何製作H5文件,以提供給TensorFlow,PyTorch框架中進行訓練。
首先,Pointnet一文中針對3個不同的任務使用到了三個數據集,分別爲:

  • 點雲分類(3D Object Classification)——ModelNet40,下載命令在provider.py中,運行python train.py後便會自動下載(416MB)到**data/**文件夾下,每個點雲包含從形狀表面均勻採樣的2048個點。每個雲均值爲零,並歸一到單位球面。data/modelnet40_ply_hdf5_2048在h5文件中還指定文本ID的文本文件。
  • 點雲部分分割(3D Object Part Segmentation)——ShapeNetPart ,下載命令在part_seg/download_data.sh
    瀏覽器點擊下載:
    ShapeNet原始點雲數據(約1.08GB)
    ShapeNet-製作好的hdf5文件(約346MB)
    或者直接在終端手動下載數據集:
    cd part_seg
    sh download_data.sh
    
    執行腳本後將下載上面對應的兩個數據集,腳本會自動解壓到項目目錄下。接下來直接運行train.py和test.py進行訓練和測試即可。
  • 語義分割(Semantic Segmentation in Scenes)—— Stanford Large-Scale 3D Indoor Spaces Dataset
    對S3DIS數據集進行簡單說明:在6個區域的271個房間,使用Matterport相機(結合3個不同間距的結構光傳感器),掃描後生成重建3D紋理網格,RGB-D圖像等數據,並通過對網格進行採樣來製作點雲。對點雲中的每個點都加上了1個語義標籤(例如椅子,桌子,地板,牆等共計13個對象)。
    在這裏插入圖片描述
    用於訓練的數據會按照房間來劃分點集,將房間的點雲數據劃分爲1m×1m1m×1m的塊,然後再對每個塊預測其中每個點的語義標籤。每個點由一個9-dim向量表示,分別爲:X, Y, Z, R, G, B, X`,Y`,Z` ——標準化後的每個點相對於所在房間的位置座標( 值爲0 - 1)。在訓練時,從每個塊中隨機採樣4096個點,使用K折交叉驗證(github中是6折,論文中是3折)
  • k-fold交叉驗證:6-fold:訓練集5個區域,測試集1個區域,3-fold:訓練集4個區域,測試集2個區域,防止過擬合的常用手段。

注意: 這裏有一個有意思的問題,對於分割網格進行訓練,如果採用這種切分塊式樣的預處理方式作爲輸入,會影響到最後的結果,比如一張桌面出現兩種不同的錯誤分割,這一點在RandLA-Net(2019)一文中進行了說明。因此那篇文章說道在做大場景點雲分割的時候不能直接使用pointnnet這種方式,因爲網絡難以有效地學習到一個物體的整體幾何結構,也是大場景點雲分割的改進點。

數據集準備

1.如果沒有最後的可視化要求,即只評價模型的分割準確度,不進行更多測試,那可以下載製作好的hdf5格式文件,不會在訓練後生成.obj文件:
在瀏覽器中點擊下載作者準備好的S3DIS-hdf5文件(大約1.6G)
或者在終端運行:

	cd sem_seg
	sh download_data.sh

腳本會自動解壓得到一個indoor3d_sem_seg_hdf5_data 文件夾,其中包含ply_data_all_0.h5~ply_data_all_23.h5 共24個.h5結尾的數據文件,每個文件都包含data和 label數據。除最後一個爲585行數據以外,這24個文件共有23×1000+585=23585行,每行對應一個切分爲1m×1m1m×1m的Block,表示4096個點,每個點對應9個維度。
all_files.txt 中保存24個數據文件名,room_filelist.txt中數據爲23585 行,對應每行的Block所對應的採集area和room。

2.如果想要進行測試和可視化,需要下載3D室內解析數據集(S3DIS Dataset數據集介紹進行模型的測試和可視化工作。作者實驗用的是Stanford3dDataset_v1.2_Aligned_Version數據集,填寫信息進行下載下載鏈接。第一個是谷歌雲平臺存儲的地址,第二個是一個共享文件形式,如果可以用谷歌雲的話可能會方便很多。
在這裏插入圖片描述
在.txt文件中的保存的點雲數據(XYZ,RGB),解壓後文件夾大小爲16.8GB
注意: 在執行 collect_indoor3d_data.py應該會出現類似於下面的錯誤:

D:\pointnet\data\Stanford3dDataset_v1.2_Aligned_Version\Area_5/hallway_6/Annotations
D:\pointnet\data\Stanford3dDataset_v1.2_Aligned_Version\Area_5/hallway_6/Annotations ERROR!!

作者提示Area_5/hallway_6中多了一個額外的字符,不符合編碼規範,需要手動刪除。經查找具體位置爲:Stanford3dDataset_v1.2_Aligned_Version\Area_5\hallway_6\Annotations\ceiling_1.txt中的第180389行數字185後。windows下建議使用EmEditor打開文件,會自動跳轉到該行,數字185後面有一個類似空格的字符,實際上不是空格,刪掉然後重新打一個空格就可以了。linux下直接使用gedit或vim跳轉到該行修改即可。保存後再次使用編輯器嘗試打開該文件,不提示出現問題說明已經修改完成。
對應修改位置如下:
在這裏插入圖片描述
如果要將數據轉換爲模型所需的hdf5格式,首先需要在Python中安裝h5py,如果是Anaconda環境應該已默認安裝,通過import h5py測試檢查是否安裝,沒有安裝的話可以使用下面命令進行快速安裝:

sudo apt-get install libhdf5-dev # 安裝h5py開發庫,必要!
sudo pip install h5py

接下來準備自己的HDF5數據,下載好數據集後,分別運行該sem_seg/下的兩個python腳本來生成hdf5數據文件。

  • python collect_indoor3d_data.py用於數據的重組,轉換爲.npy格式文件,比如Area_1_hallway_1.npy(.npy爲Numpy專用的二進制格式)。
  • python gen_indoor3d_h5.py 將.npy文件批量轉爲HDF5文件。

訓練:

使用準備好的HDF5數據文件(處理好的或自己轉換的數據),即可開始模型訓練,模型默認使用Vanilla PointNet進行訓練,指定區域1用作測試集,作者給出的是區域6作測試集:

python train.py --log_dir log1 --test_area 1

得到在log1文件夾下關於訓練模型和日誌model.ckpt文件。

測試:

訓練結束後,可以進行測試,需要對於測試集數據進行簡單處理:

  • batch_inference.py 對測試集中的房間進行細分。

作者實驗中使用6折交叉訓練來訓練獲得6個模型。比如:對於model1,將區域2-6用作訓練集,區域1用作測試集;對於模型2,區域1,3-6被用作訓練集,區域2被用作測試集以此類推,請注意,論文使用了不同的3折交叉訓練。
加入我們想使用model1進行測試,並獲得一個obj文件用於可視化,那麼測試集爲區域1,可以運行如下代碼,作者README中給出的是model6作爲測試,即以區域6位測試集測試工作和可視化:

python batch_inference.py --model_path log1/model.ckpt --dump_dir log1/dump --output_filelist log1/output_filelist.txt --room_data_filelist meta/area1_data_label.txt --visu

測試執行完畢後。將會在log1/dump下創建一些OBJ文件,可以使用CloudCompare,MeshLab等軟件來進行區域1—會議室1的預測結果的可視化。
在這裏插入圖片描述

分割效果評價

最後是評估整體分割的準確性,作者依次評估了6個模型,並用於eval_iou_accuracy.py產生點的分類準確性和IoU,結果最終除以13,得到一個分割的平均交併比mIOU。
參考論文中作者的結果:
在這裏插入圖片描述
表3爲S3DIS數據集上場景分割任務的實驗結果 ,表4爲該數據集上的3D目標檢測任務結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章