1枚の画像から3次元に復元できる3D Semantic Scene Completion (SSC) 技術に触れてみました。
TeslaAI day 2022のプレゼン曰く(01:12:00~くらい)、Tesla車には似たような推論モデルが使われてるっぽいので、多分ホットな手法()デス
Trainingを行うので、低スぺのグラボだと厳しそうです。
CUDAは構築してないと動かないと思います。
※この記事は、2023年10月現在のものです。
Githubはこちら↓
- MonoScene
論文を読む限り、深度データは必要なくRGB画像があればボクセル表現できてしまうらしい。
つよつよPCスペック
やはり、要求されているPCスペックはかなり高そうです。
以下に、今回構築したPCのスペックを記載します。
-
OS:Ubuntu22.04.3LTS
-
CPU:13th Gen IntelⓇ core™ i7-13700K×24 (←強い)
-
RAM:64GB(←強い)
-
GPU:NVIDIA GeForce RTX 4090(←強い)
-
必要ストレージ:最低30GBほど。データセットを一通り試すなら200GBは必要
-
前提構築済
CUDA11.8
Anaconda3のインストール
一応condaベースの構築なのでanaconda3のインストールから。入ってる人は飛ばしてください。
- Anaconda3
bash Anaconda3-2-23.09-0-Linux-x86_64.sh(例)
yes
yes
yes
ダウンロードしたshファイルを実行し、全部yesで進みます。(enter連打だとnoが選択され、インストールされなくなってしまうので注意)
名前の前に(base)がつくようになっていれば成功。前準備おわり。
MonoSceneの構築
すべてHome直下に置いています。(パス内のuser
はユーザーネームのことです。)
conda create -y -n monoscene python=3.7
conda activate monoscene
conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=10.2 -c pytorch
git clone https://github.com/astra-vision/MonoScene.git
cd MonoScene/
pip install -r requirements.txt
conda install -c bioconda tbb=2020.2
pip install torchmetrics==0.6.0
pip install -e ./
データセットの設定(NYUv2)
学習に必要なデータセットを準備します。Semantic KITTI,NYUv2,KITTI-360と3種類用意されていますが、今回はNYUv2を使用します。(他のデータセットはとんでもなく容量を食います。Semantic KITTIは後述)
- NYUv2のデータセットは下記リンクからダウンロードできます(1.6GB)↓
https://www.rocq.inria.fr/rits_files/computer-vision/monoscene/nyu.zip
解凍した後、Home直下に置きました。
また、Pretrained modelsが準備されています。
/path/to/MonoScene/trained_models
に配置することで、すぐにEvaluatingが可能になります。
NYUv2のPretrained modelsはこちらからダウンロードできます。↓
https://www.rocq.inria.fr/rits_files/computer-vision/monoscene/monoscene_nyu.ckpt
cd
export NYU_PREPROCESS=/home/user/NYU_dataset
export NYU_ROOT=/home/user/NYU_dataset/depthbin
cd MonoScene/
python monoscene/data/NYU/preprocess.py NYU_root=$NYU_ROOT NYU_preprocess_root=$NYU_PREPROCESS
Training
めちゃくちゃ時間がかかります。GPUを複数搭載している方が良いもかもしれません。2023現在最強のグラボRTX4090だと、デフォルト設定で5時間弱で終わりました。
最後のGPU数などはPCに合わせてください。epoch数はデフォルトで29ですが、変更することもできます。
cd
export NYU_LOG=/home/user/NYU_dataset
cd MonoScene/
python monoscene/scripts/train_monoscene.py dataset=NYU NYU_root=$NYU_ROOT NYU_preprocess_root=$NYU_PREPROCESS logdir=$NYU_LOG n_gpus=1 batch_size=1
Evaluating
python monoscene/scripts/eval_monoscene.py dataset=NYU NYU_root=$NYU_ROOT NYU_preprocess_root=$NYU_PREPROCESS n_gpus=1 batch_size=1
Inference
export MONOSCENE_OUTPUT=/home/user/MonoScene/outputs
python monoscene/scripts/generate_output.py +output_path=$MONOSCENE_OUTPUT dataset=NYU NYU_root=$NYU_ROOT NYU_preprocess_root=$NYU_PREPROCESS n_gpus=1 batch_size=1
Visualization
推論した形状を可視化します。今回はmayaviを使用しましたが、Open3Dを使用する方法もgithubでは紹介されています。
pip install tqdm
pip install omegaconf
pip install hydra-core
いざVisualizationを実行しようとすると以下のエラーが出ました。
(monoscene) user@Ubuntu:~/MonoScene$ python monoscene/scripts/visualization/NYU_vis_pred.py +file=/home/user/MonoScene/outputs/NYU/NYU0001_0000.pkl
Traceback (most recent call last):
File "monoscene/scripts/visualization/NYU_vis_pred.py", line 6, in <module>
from mayavi import mlab
ModuleNotFoundError: No module named 'mayavi'
モジュールがインストールされていないようでした。
下記を実行しました。
conda install cython
pip install vtk mayavi
それでもまたエラーです。
(monoscene) user@Ubuntu:~/MonoScene$ python monoscene/scripts/visualization/NYU_vis_pred.py +file=/home/user/MonoScene/outputs/NYU/NYU0001_0000.pkl
monoscene/scripts/visualization/NYU_vis_pred.py:23: DeprecationWarning: `np.float` is a deprecated alias for the builtin `float`. To silence this warning, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
coords_grid = coords_grid.astype(np.float)
Traceback (most recent call last):
File "monoscene/scripts/visualization/NYU_vis_pred.py", line 151, in main
d=0.75,
File "monoscene/scripts/visualization/NYU_vis_pred.py", line 79, in draw
figure = mlab.figure(size=(1600, 900), bgcolor=(1, 1, 1))
File "/home/user/anaconda3/envs/monoscene/lib/python3.7/site-packages/mayavi/tools/figure.py", line 64, in figure
engine = get_engine()
File "/home/user/anaconda3/envs/monoscene/lib/python3.7/site-packages/mayavi/tools/engine_manager.py", line 94, in get_engine
return self.new_engine()
File "/home/user/anaconda3/envs/monoscene/lib/python3.7/site-packages/mayavi/tools/engine_manager.py", line 139, in new_engine
check_backend()
File "/home/user/anaconda3/envs/monoscene/lib/python3.7/site-packages/mayavi/tools/engine_manager.py", line 42, in check_backend
raise ImportError(msg)
ImportError: Could not import backend for traitsui. Make sure you
have a suitable UI toolkit like PyQt/PySide or wxPython
installed.
Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace.
要約するとまだモジュールが足りないみたいですね。
下記を実行しました。
pip install pyqt5
やっとこさ、です。下記を実行します。.pkl
の可視化したい画像は任意です。
python monoscene/scripts/visualization/NYU_vis_pred.py +file=/home/user/MonoScene/outputs/NYU/NYU0001_0000.pkl
追記:データセットの設定(Semantic KITTI)
容量が多そうで避けていましたが、Semantic KITTIも一応試してみました。
基本的にNYUv2一緒ですが、データセットの準備に一癖ありました。
下記から、データセットをダウンロードします。
https://www.cvlibs.net/datasets/kitti/eval_odometry.php
このダウンロードには、サイトへのログインが必要です。
所属やら何で使うのかを明記する必要があったと思うので、お気をつけて。
ここからはDownload odometry data set (color, 65 GB)
をダウンロードしてください。
次に下記からvoxel dataをダウンロードします。
http://www.semantic-kitti.org/dataset.html#download
SemanticKITTI voxel data (700 MB)
が今回使用するものです。
この2つを組み合わせることでデータセットが完成するハズでした。
後述しますが、これだけでは動きませんでした。
- データセットの作成
先ほどダウンロードした二つを組み合わせます。odometry data set
のファイルの中に00~21の番号があります。同様にvoxel data set
に対応する番号のフォルダがあると思いますので、全部コピペしましょう。対応関係は以下の通りです。
/kitti/dataset/
└── sequences/
│ ├── 00/
│ │ ├── times.txt
│ │ ├── calib.txt
│ │ ├── image_2/
│ │ ├── image_3/
│ | ├── voxels/ ←コレをコピペ
│ ├── 01/
│ ├── 02/
│ .
│ .
│ .
│ └── 21/ #ここまで全部やる
ここから先は基本的にNYUv2と一緒ですが、一応記載してい置きます。
cd
export KITTI_PREPROCESS=/home/user/kitti/dataset/sequences
export KITTI_ROOT=/home/user/kitti
以下を実行すると、エラーが出てしまいました。
cd MonoScene/
python monoscene/data/semantic_kitti/preprocess.py kitti_root=$KITTI_ROOT kitti_preprocess_root=$KITTI_PREPROCESS
Traceback (most recent call last):
File "monoscene/scripts/train_monoscene.py", line 169, in main
trainer.fit(model, data_module)
File "/home/user/anaconda3/envs/monoscene/lib/python3.7/site-packages/pytorch_lightning/trainer/trainer.py", line 552, in fit
self._run(model)
File "/home/user/anaconda3/envs/monoscene/lib/python3.7/site-packages/pytorch_lightning/trainer/trainer.py", line 864, in _run
self._call_setup_hook(model) # allow user to setup lightning_module in accelerator environment
File "/home/user/anaconda3/envs/monoscene/lib/python3.7/site-packages/pytorch_lightning/trainer/trainer.py", line 1177, in _call_setup_hook
self.datamodule.setup(stage=fn)
File "/home/user/anaconda3/envs/monoscene/lib/python3.7/site-packages/pytorch_lightning/core/datamodule.py", line 428, in wrapped_fn
fn(*args, **kwargs)
File "/home/user/MonoScene/monoscene/data/semantic_kitti/kitti_dm.py", line 34, in setup
color_jitter=(0.4, 0.4, 0.4),
File "/home/user/MonoScene/monoscene/data/semantic_kitti/kitti_dataset.py", line 54, in __init__
os.path.join(self.root, "dataset", "sequences", sequence, "calib.txt")
File "/home/user/MonoScene/monoscene/data/semantic_kitti/kitti_dataset.py", line 199, in read_calib
calib_out["Tr"][:3, :4] = calib_all["Tr"].reshape(3, 4)
KeyError: 'Tr'
Set the environmexport KITTI_LOG=/home/user/kittient variable HYDRA_FULL_ERROR=1 for a complete stack trace.
Tr
ってなんぞや。と言われてしまいました。
おかしいな、と思いcalib.txt
を確認してみると、なんとTr
の行がありませんでした。
アップデートで消されてしまったんですかね?
色々調べると、Tr
が含まれているcalib.txt
データを発見しました。
下記からダウンロードできます。
https://www.cvlibs.net/download.php?file=data_odometry_calib.zip
二度手間ですがこのcalib.txt
を、00~21のフォルダ毎に全部コピペしましょう。
再度python monoscene/data/semantic_kitti/preprocess.py kitti_root=$KITTI_ROOT kitti_preprocess_root=$KITTI_PREPROCESS
を実行したら無事通過しました。
※ここから先は基本的にNYUv2と一緒です。
Training(kitti)
epoch数は29、RTX4090で実行した結果、30時間強かかりました。
epoch数を変えるか、Pretrained modelsの使用をお勧めします。
Semantic KITTIのPretrained modelsは以下のURLからダウンロードできます。
https://www.rocq.inria.fr/rits_files/computer-vision/monoscene/monoscene_kitti.ckpt
最後のGPU数などはPCに合わせてください。
cd
export KITTI_LOG=/home/user/kitti
cd MonoScene/
python monoscene/scripts/train_monoscene.py \dataset=kitti \enable_log=true \kitti_root=$KITTI_ROOT \kitti_preprocess_root=$KITTI_PREPROCESS\kitti_logdir=$KITTI_LOG \n_gpus=1 batch_size=1
Evaluating(kitti)
python monoscene/scripts/eval_monoscene.py \dataset=kitti \kitti_root=$KITTI_ROOT \kitti_preprocess_root=$KITTI_PREPROCESS \ n_gpus=1 batch_size=1
Inference (kitti)
export MONOSCENE_OUTPUT=/home/user/MonoScene/outputs
python monoscene/scripts/generate_output.py \+output_path=$MONOSCENE_OUTPUT \dataset=kitti \kitti_root=$KITTI_ROOT \kitti_preprocess_root=$KITTI_PREPROCESS \n_gpus=1 batch_size=1
Visualization(kitti)
generate_output.py
を実行した日時でファイル名が変わるのでコピペの際は注意
python monoscene/scripts/visualization/kitti_vis_pred.py +file=/home/user/MonoScene/outputs/2023-10-18/12-02-51/kitti/08/000000.pkl +dataset=kitti
おわりに
ひとまず構築して、動作確認程度はできました。
もうちょっと触ってみて、進展があれば追記していこうと思います。
追記:2023/11/13 Semantic kittiデータセットでの実行