オブジェクトのPose Estimation!? OnePoseを試す
今回試すのは、OnePose: One-Shot Object Pose Estimation without CAD Models ということで、オブジェクトのPoseって何??という感じではありますがデモ映像を見ていただくとわかりやすいかと思います。
直接リンクするのも…と思ったのでgithubより動作イメージをダウンロードして使わせていただきました
要はCADモデルを使わず物体の特徴量をベースに物体を囲む直方体の頂点座標を出力してくれるというライブラリのようで、物体の向きを知るのに使えそうです。
そして、本記事を書き始めている時点では、一応動くところまで行ったというだけでまだ動作を完全に理解できていないまま書いています。
というのも、セットアップ自体にいろいろなハマりポイントがあったため、忘れないうちに記載しておこうと思ったためです。
間違いがあるかもしれませんが、ご了承ください。
OnePoseを動かすための環境構築
公式にはCondaを使って環境を作る記載がありますが、私はdockerコンテナを作りました
PyTorchベースのため、まずはOpenCVとPyTorchを入れます(この部分の詳細は割愛します)
あとはenvironment.yamlとrequirements.txtに従い、必要なものを入れていきます。
私が入れたものは以下のとおりです。
pip3 install pycocotools pip3 install loguru pip3 install h5py pip3 install einops pip3 install yacs pip3 install trimesh pip3 install transforms3d pip3 install cherrypy pip3 install -i https://test.pypi.org/simple/ wis3d pip3 install hydra pip3 install hydra-core pip3 install natsort pip3 install pytorch_lightning
OnePoseのセットアップ
OnePose本体はgithubからcloneし、インストールを行います
2D feature detectionとマッチングにSuperPointとSuperGlueを使用しますが、ライセンス要件のため用意されているスクリプトを使用してダウンロードします
git clone https://github.com/zju3dv/OnePose.git cd OnePose sh ./scripts/prepare_2D_matching_resources.sh
COLMAPのインストール
Structure-from-MotionにCOLMAPが使われるとのことで、COLMAPをインストールしておきます。
COLMAP公式のインストール情報を見ると、Pre-buildバイナリはWindows用とMac用しか用意されていません。
私の環境はUbuntuのコンテナなので、自力でソースからビルドします。
まずは必要なモジュールをインストールします。
公式に書かれたものから、既に自分の環境に入っているものは除外しています。
sudo apt-get install \ libboost-program-options-dev \ libboost-filesystem-dev \ libboost-graph-dev \ libboost-system-dev \ libboost-test-dev \ libeigen3-dev \ libsuitesparse-dev \ libfreeimage-dev \ libmetis-dev \ libgoogle-glog-dev \ libgflags-dev \ libglew-dev \ qtbase5-dev \ libqt5opengl5-dev \ libcgal-dev
Ceres Solverをインストールします
sudo apt-get install libatlas-base-dev libsuitesparse-dev # ソースを取得するためどこか別ディレクトリに移動 git clone https://ceres-solver.googlesource.com/ceres-solver cd ceres-solver git checkout $(git describe --tags) mkdir build && cd build cmake .. -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF make -j sudo make install
COLMAPをインストールします
# ソースを取得するためどこか別ディレクトリに移動 git clone https://github.com/colmap/colmap.git cd colmap git checkout dev mkdir build && cd build cmake .. make -j sudo make install
OnePoseデータセットの学習と評価(Train and Eval)
Readmeからリンクされているデータセットをダウンロードし、data/onepose_datasets に展開します
Readmeでは任意のディレクトリにonepose_datasetsディレクトリを作って展開し、data配下にシンボリックリンクで持ってくるような書き方になっていますが、おそらくかなり容量が大きいためかと思われます。
私は直接data/onepose_datasets配下に展開しました。
いや、でかいよ。。中身を考えるとわからなくもないけど、さすがにでかすぎるでしょ…
何が含まれるのかわからず全部展開してみましたが、結論を書いてしまうとちょっと試すだけであればsample_dataのみで大丈夫そうです。
Structure-from-Motionを実行し、オブジェクトポイントクラウドを再構築します。
上記記載のとおり、sampleのみ行いました。
このとき、configs/preprocess/内にあるyamlファイルの中身のredoをTrueに書き換えておかないと、
[Errno 2] No such file or directory data/sfm_model/0501-matchafranzzi-box/outputs_superpoint_superglue/sfm_ws/model/cameras.bin
というエラーが発生します。
このあたり、Issueに上がっています。
ということで、書き換えてから実行します。
python3 run.py +preprocess=sfm_spp_spg_sample.yaml
OnePoseでの推論実行
Readmeからリンクされているpretrained modelをダウンロードして配置します。
data/model/checkpoints/onepose/GATsSPG.ckpt
2Dオブジェクト検出を実行します。
ここはReadmeに書かれているとおり実行すると、すべてのデータセットに対して行うように書かれています。
まずはconfigs/experimentobject_detector.yamlをコピーしてsampleのみに限定して実行するようなobject_detector_sample.yamlを作成します。
scan_data_dirをsample_dataに書き換え、inputの使用するデータをsampleに含まれる0501-matchafranzzi-boxのみ残します。
# 前半部分 略 scan_data_dir: ${data_dir}/onepose_datasets/sample_data sfm_model_dir: ${data_dir}/sfm_model input: data_dirs: - ${scan_data_dir}/0501-matchafranzzi-box matchafranzzi-4 sfm_model_dirs: - ${sfm_model_dir}/0501-matchafranzzi-box
python3 feature_matching_object_detector.py +experiment=object_detector_sample.yaml n_ref_view=15
feature_matchingモードでの推論実行
python3 inference.py +experiment=test_sample.yaml object_detect_mode=feature_matching save_wis3d=False
このとき、save_wis3dをTrueにすると、runs/vis配下に結果のjsonと画像が書き出されます。(処理は遅くなります)