1枚の写真から三次元ボクセル表現が行えるMonoSceneを構築してみる［Ubuntu22.04］

![画像9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573446/e7f47672-b430-b1bc-38ae-9b72e7dbce18.png)
1枚の画像から3次元に復元できる3D Semantic Scene Completion (SSC) 技術に触れてみました。
TeslaAI day 2022のプレゼン曰く（01:12:00~くらい）、Tesla車には似たような推論モデルが使われてるっぽいので、多分ホットな手法（）デス

https://www.youtube.com/watch?v=ODSJsviD_SU

Trainingを行うので、低スぺのグラボだと厳しそうです。
CUDAは構築してないと動かないと思います。
※この記事は、2023年10月現在のものです。

Githubはこちら↓
+ MonoScene

https://github.com/astra-vision/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

https://www.anaconda.com/download

````
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
````
![snapshot2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573446/74dd7b6b-31ad-978d-fe2c-67c71a6083eb.png)
動きましたー！

# 追記：データセットの設定（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)``が今回使用するものです。

この２つを組み合わせることでデータセットが完成するハズでした。
後述しますが、これだけでは動きませんでした。

+ データセットの作成

先ほどダウンロードした二つを組み合わせます。``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
````
実行すると、画像のようなボクセル描画を確認できました。
![snapshot3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573446/dc8add92-bf9a-141e-a1b2-d6d86c002420.png)

# おわりに
ひとまず構築して、動作確認程度はできました。
もうちょっと触ってみて、進展があれば追記していこうと思います。
追記：2023/11/13　Semantic kittiデータセットでの実行