これは、次の論文のコードの開発バージョンです。
Bugra Tekin、Sudipta N. Sinha、Pascal Fua、「リアルタイム シームレス シングル ショット 6D オブジェクト ポーズ予測」、CVPR 2018。
上記の論文のコードベースの元のリポジトリは、次のリンクにあります。
複数の段階を必要としたり、複数の仮説を検討したりすることなく、RGB 画像内のオブジェクトの検出とその 6D 姿勢の予測を同時に行うためのシングルショット アプローチを提案します。私たちのメソッドの主要なコンポーネントは、オブジェクトの 3D バウンディング ボックスの投影された頂点の 2D 画像の位置を直接予測する YOLO ネットワーク設計に触発された新しい CNN アーキテクチャです。次に、PnP アルゴリズムを使用してオブジェクトの 6D 姿勢が推定されます。論文、arXiv
このコードを使用する場合は、以下を引用してください
@inproceedings{tekin18,
TITLE = {{リアルタイムのシームレスなシングルショット 6D オブジェクトの姿勢予測}}、著者 = {Tekin、Bugra および Sinha、Sudipta N. および Fua、Pascal}、
ブックタイトル = {CVPR}、
年 = {2018}
}
SingleShotPose は MIT ライセンスに基づいてリリースされています (詳細については、LICENSE ファイルを参照してください)。
コードは、CUDA v8 および cudNN v5.1 を使用してWindowsでテストされています。実装は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座標) 1番目の角)、5番目の番号:y1(1番目の角のy座標)、...、18番目の番号:x8(8番目の角のx座標)、19番目の番号:y8(8番目の角のy座標) , 20番目の数値:xの範囲、21番目の数値:yの範囲。
座標は画像の幅と高さ ( x / image_width
およびy / image_height
によって正規化されます。これは、座標回帰タスクとオブジェクト分類タスクに同様の出力範囲を設定する場合に便利です。
アプローチを検証するために、BB8 メソッドと同じトレーニング/テスト分割を使用して、LINEMOD データセット上でモデルをトレーニングおよびテストします。独自のデータセットでモデルをトレーニングしたい場合は、提供された LINEMOD データセットと同じフォルダー構造を作成し、cfg/[OBJECT].data、[DATASET]/[OBJECT]/train.txt、および[DATASET]/[OBJECT]/test.txt ファイル。各オブジェクトのフォルダーには次のものが含まれている必要があります。
(1) 画像ファイルを含むフォルダー、
(2) ラベル ファイルを含むフォルダー (ラベルの作成方法の詳細については、このリンクを参照してください。6D オブジェクトの姿勢推定のためのグラウンド トゥルース ラベルの作成に役立つサードパーティの ObjectDatasetTools ツールボックスも見つかります)、
(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 までお問い合わせください。