前回ORB-SLAM3のビルドに成功した事に気をよくしたのでDROID-SLAMにも挑戦しました。
挫折しました。
原因は公式のバージョン指定を無視して構築したcuda周りかなと思います。
WindowsとWSL下のUbuntuどちらでも試してみましたがダメでしたが、リファレンス用に記事を残しておきます。
環境
OS Windows 11 | Ubuntu 22.04[WSL2]
CUDA 11.8 [デフォルト 11.3]
下記はpython環境です。
pythonバージョンは3.10.12ですが、git issueを見ると3.8系で動かしている人が多い印象。
cudatoolkit 11.8 [デフォルト 1.13]
pytorch 2.3.1 [デフォルト 1.10]
pytorch-scatter 2.1.2 [デフォルト 指定なし]
open3d 0.18.0 [デフォルト 指定なし]
tensorboard 2.17.0 [デフォルト 指定なし]
suitesparse 8.2.1 [デフォルト 指定なし]
pyyaml 5.4.1 [デフォルト 指定なし]
scipy 1.13.1 [デフォルト 指定なし]
OpenCV 4.10.0 [デフォルト 指定なし]
tqdm 4.66.4 [デフォルト 指定なし]
matplotlib 3.9.0 [デフォルト 指定なし]
evo 1.29.0 [デフォルト 指定なし]
gdown 5.2.0 [デフォルト 指定なし]
Ubuntu22.04[WSL2]にCUDA11.8,cudatoolkitをインストールする
Windowsの場合は飛ばしてください。
公式のCUDA Toolkit 11.8 Downloadsサイトから環境を選択してBase Installer通り実施します。
私の場合は下記。
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda-repo-wsl-ubuntu-11-8-local_11.8.0-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-11-8-local_11.8.0-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-11-8-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda-11-8
その他メモ
# リンクの確認
update-alternatives --display cuda
# パス通し
export PATH=/usr/local/cuda/bin:${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH}
source ~./bashrc
# バージョンとパス確認
nvcc -V
torchインストール後のチェック
import torch
torch.cuda.is_available()
Getting Started
READMEに従って進めていきます。
プロジェクトのDL。eigenとlietorchを外部から引っ張ってくるのでrecursiveオプションは必須。
git clone --recursive https://github.com/princeton-vl/DROID-SLAM.git
公式ではenvironment.yamlで仮想環境を構築していますが、今回は違うバージョンでやりたいので無視してインストールします。
# conda env create -f environment.yamlの代わりに下記
conda create -n droidenv python=3.10
# pytorchのDL.下記は例なので公式に従ってコマンドを生成
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install torch-scatter open3d tensorboard suitesparse-graphblas PyYAML scipy opencv-python tqdm matplotlib
# 下記は公式通り
pip install evo --upgrade --no-binary evo
pip install gdown
python setup.py install
Windowsの場合はsetup.pyがこけるので、droid_kernels.cu内のlongをint64_tに置換。
デモの準備
- モデルのダウンロード: droid.pth
- demo.pyを引数無しで実行すると87行目で指定されるので、projectのrootに保存。
- サンプルデータのダウンロード。今回は一つだけ手動で落として実施します。
- abandonedfactoryデータをDL
- 解凍したデータはprojectのroot/data/abandonedfactoryフォルダ内に保存
- 実行
- python demo.py –imagedir=data/abandonedfactory –calib=calib/tartan.txt –stride=2
エラー処理
私の場合はimageウィンドウとOpen3Dのウィンドウが表示されるもののキーフレームが登録されずOpen3Dのウィンドウが真っ白のままでした。[Ubuntuでは初期位置のカメラが1つ表示されるだけ]
setup.pyで外部シンボルが未解決でビルド失敗[Winのみ]
droid_kernels.objのコンパイル中に未解決の外部参照が行われエラーでコンパイルが失敗しました。
これはdroid_kernels.cuファイル内で”long”型が使われている為なので、windows用に”int64_t”と置換します。
torchのUserWarningが出る
エラーは下記。
~droidenv\Lib\site-packages\torch/functional.py:512: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at ../aten/src/ATen/native/TensorShape.cpp:2157.)
return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined]
解決方法はstackoverflowからの引用でfunctional.pyの512行目を下記に書き換え。
return _VF.meshgrid(tensors, **kwargs, indexing="ij")
torch.as_tensorの戻り値が無い
この記事の本題です。
下記のエラーが解決出来ずインストールに失敗しました。
Error in inference – not enough values to unpack (expected 2, got 0)
ありがちな原因としてはErrors in inference #13にあるように、デモ用のデータセットのパス間違いですが、私の場合はimageウィンドウにはちゃんと画像が表示されているのでパス間違いではないと思います。
エラーの当該箇所はfactor_graph.pyの374行目で、引数の”es”の値のせいかと思われます。
“es”の値はdepth_video.pyで定義されるself.counter[video.counter]に依存するので、droid_backend.pyやmotion_filter.py辺りで使われる際に上手く動いていないと推測しています。
また、issueにはcudaバージョンのせいなのか、motion_filter.py内の”self.MEAN”,”self.STDV”の値が0になるケースもあるそうですが私の環境では通常動作していました。