這是以下論文程式碼的開發版本:
Bugra Tekin、Sudipta N. Sinha 和 Pascal Fua,“實時無縫單鏡頭 6D 物體姿勢預測”,CVPR 2018。
上述論文程式碼庫的原始儲存庫可以在以下連結中找到。
我們提出了一種單次方法,用於同時檢測 RGB 影像中的物件並預測其 6D 姿態,而無需多個階段或檢查多個假設。我們方法的關鍵組成部分是受 YOLO 網路設計啟發的新 CNN 架構,它直接預測物件 3D 邊界框投影頂點的 2D 影像位置。然後使用 PnP 演算法估計物件的 6D 位姿。論文,arXiv
如果您使用此程式碼,請引用以下內容
@inproceedings{tekin18,
標題 = {{即時無縫單鏡頭 6D 物體姿態預測}},作者 = {Tekin、Bugra 和 Sinha、Sudipta N. 和 Fua、Pascal},
書名 = {CVPR},
年份 = {2018}
}
SingleShotPose 在 MIT 許可證下發布(詳細資訊請參閱 LICENSE 文件)。
程式碼在Windows上使用 CUDA v8 和 cudNN v5.1 進行了測試。該實作基於PyTorch 0.4.1並在Python3.6上進行了測試。此程式碼需要以下可以透過 conda 或 pip 安裝的依賴項:numpy、scipy、PIL、opencv-python。有關與 PyTorch 0.3.1 相容並在 Python2.7 上測試的早期版本,請參閱py2
資料夾。
在主程式碼目錄中,執行以下指令下載並擷取 (1) 預處理的 LINEMOD 資料集,(2) LINEMOD 資料集的訓練模型,(3) OCCLUSION 資料集的訓練模型,(4) 來自 VOC2012 的背景影像分別為數據集。
wget -O LINEMOD.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21135&authkey=AJRHFmZbcjXxTmI"
wget -O backup.tar --no-check-certificate "https://onedrive.live.com/download?cid=0C78B7DE6C569D7B&resid=C78B7DE6C569D7B%21191&authkey=AP183o4PlczZR78"
wget -O multi_obj_pose_estimation/backup_multi.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21136&authkey=AFQv01OSbvhGnoM"
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/darknet19_448.conv.23 -P cfg/
tar xf LINEMOD.tar
tar xf backup.tar
tar xf multi_obj_pose_estimation/backup_multi.tar -C multi_obj_pose_estimation/
tar xf VOCtrainval_11-May-2012.tar
或者,您可以直接訪問上面的鏈接,手動下載並解壓縮相應目錄中的文件。整個下載過程可能需要很長時間(約 60 分鐘)。另請注意,在某些國家/地區對 OneDrive 的存取可能會受到限制。
為了訓練模型運行,
python train.py --datacfg [path_to_data_config_file] --modelcfg [path_to_model_config_file] --initweightfile [path_to_initialization_weights] --pretrain_num_epochs [number_of_epochs to pretrain]
例如
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile cfg/darknet19_448.conv.23 --pretrain_num_epochs 15
如果您想從 ImageNet 初始化權重開始,或者
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
如果您想從 LINEMOD 上已預先訓練的模型開始,以實現更快的收斂。
[datacfg]包含有關訓練/測試分割、3D 物件模型和相機參數的信息
[modelcfg]包含有關網絡結構的信息
[initweightfile]包含初始化權重。 <
在訓練開始時,您將看到以下輸出:
layer filters size input output
0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32
1 max 2 x 2 / 2 416 x 416 x 32 -> 208 x 208 x 32
2 conv 64 3 x 3 / 1 208 x 208 x 32 -> 208 x 208 x 64
3 max 2 x 2 / 2 208 x 208 x 64 -> 104 x 104 x 64
...
30 conv 20 1 x 1 / 1 13 x 13 x1024 -> 13 x 13 x 20
31 detection
這定義了網路結構。在訓練過程中,最佳網路模型被儲存到「model.weights」檔案中。要訓練其他物件的網絡,只需在呼叫訓練函數時更改物件名稱,例如「 python train.py --datacfg cfg/duck.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
」。如果您在訓練時遇到 GPU 記憶體錯誤,您可以嘗試降低批次大小(例如 16 或 8)以適應記憶體。開源版本的程式碼經過了強而有力的重構,此外一些模型還需要重新訓練。我們提供的重新訓練模型與我們提供的初始結果相比沒有太大變化(有時稍差,有時稍好)。
測試模型運行
python valid.py --datacfg [path_to_data_config_file] --modelcfg [path_to_model_config_file] --weightfile [path_to_trained_model_weights]
例如
python valid.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --weightfile backup/ape/model_backup.weights
您也可以使用 valid.ipynb 來測試模型並視覺化結果。
在 multi_obj_pose_estimation/ 資料夾內
測試:
python valid_multi.py cfgfile weightfile
例如
python valid_multi.py cfg/yolo-pose-multi.cfg backup_multi/model_backup.weights
訓練:
python train_multi.py datafile cfgfile weightfile
例如,
python train_multi.py cfg/occlusion.data cfg/yolo-pose-multi.cfg backup_multi/init.weights
我們的標籤檔案包含 21 個真實值。我們預測對應於 3D 物件模型的質心和角點的 9 個點。此外,我們預測每個單元格中的類別。 9x2+1 = 19 分。在多物件訓練中,在訓練過程中,我們將與目前物件大小最相似的錨框指定為負責預測該物件的 2D 座標的錨框。為了對物件的大小進行編碼,我們為 x 維度和 y 維度的範圍增加了 2 個數字。因此,我們有 9x2+1+2 = 21 個數字。
21個數字分別對應以下內容:第1個數字:類別標籤,第2個數字:x0(質心的x座標),第3個數字:y0(質心的y座標),第4個數字:x1(質心的x座標)第5 個數字:y1(第一個角點的y 座標),...,第18 個數字:x8(第八個角點的x 座標),第19 個數字:y8(第八個角點的y 座標) ,第 20 個數字:x 範圍,第 21 個數字:y 範圍。
座標由圖像寬度和高度標準化: x / image_width
和y / image_height
。這對於坐標回歸和物件分類任務具有相似的輸出範圍非常有用。
我們使用相同的訓練/測試分割和 BB8 方法在 LINEMOD 資料集上訓練和測試我們的模型,以驗證我們的方法。如果您想在自己的資料集上訓練模型,您可以使用提供的 LINEMOD 資料集建立相同的資料夾結構,並調整 cfg/[OBJECT].data、[DATASET]/[OBJECT]/train.txt 和[資料集]/[物件]/test.txt 檔案。每個物件的資料夾應包含以下內容:
(1) 包含影像檔案的資料夾,
(2) 包含標籤檔案的資料夾(有關如何建立標籤的詳細說明,請參閱此連結。您也可以找到第三方 ObjectDatasetTools 工具箱,可用於建立用於 6D 物件姿態估計的地面實況標籤),
(3) 包含訓練圖像檔案名稱的文字檔案 ( train.txt
),
(4) 包含測試圖像檔案名稱的文字檔案 ( test.txt
),
(5) 包含3D物體模型的.ply檔案(物體模型的單位以公尺為單位),
(6) 可選的,包含分割蒙版的資料夾(如果您想更改訓練影像的背景,使其對不同的背景更加穩健,這對於更好的泛化能力至關重要),
另請確保根據您的需求調整資料和模型設定檔中的以下值:
diam
”值變更為現有物件模型的直徑。yolo-pose.cfg
檔案中的步驟、尺度、max_epochs 參數)和一些資料增強參數( dataset.py
中的抖動、色調、飽和度、曝光參數)可能還需要進行調整,以便更好地融合資料集。yolo-pose-multi.cfg
) 中指定它。另請確保使用正確的類別數並在yolo-pose-multi.cfg
中指定。fx
、 fy
、 u0
、 v0
、 width
、 height
),其中包含特定於您的資料集的參數。在建立訓練資料集時,對大量視點/距離進行採樣並對照明/遮蔽/背景設定的較大變化進行建模對於提高資料集方法的泛化能力非常重要。如果您想根據自己的目的調整一些模型和損失參數(例如不同損失項的權重因子),您可以在模型設定檔( yolo-pose.cfg
)中進行調整。
該程式碼由 Bugra Tekin 編寫,基於 github 用戶@marvis 的 YOLOv2 實作構建
如有任何問題或錯誤報告,請聯絡 Bugra Tekin