オブジェクトのPose Estimation!? OnePoseを試す

オブジェクトのPose Estimation!? OnePoseを試す

今回試すのは、OnePose: One-Shot Object Pose Estimation without CAD Models ということで、オブジェクトのPoseって何??という感じではありますがデモ映像を見ていただくとわかりやすいかと思います。
OnePose動作イメージ
直接リンクするのも…と思ったので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配下に展開しました。

OnePose データセット
いや、でかいよ。。中身を考えるとわからなくもないけど、さすがにでかすぎるでしょ…

何が含まれるのかわからず全部展開してみましたが、結論を書いてしまうとちょっと試すだけであれば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と画像が書き出されます。(処理は遅くなります)

OnePose推論結果

オブジェクトのPose Estimation!? OnePoseを試すにコメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です