VoteNetを使った3D点群データの物体認識がすごそうなので早速動かしてみた

# はじめに
VoteNet は　3D点群の物体検出をするすごいAIフレームワークです。
従来までは、3Dを2Dに変換してCNNで検出したりとかをしていたと思うのですが、VoteNetでは3Dのまま3Dバウンディングボックスで物体検出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508288/97af0697-5f87-120f-5bef-e5032ed51e02.png)

詳しい説明は、下記リンクを参照してください。とてもわかりやすいです。
https://ai-scholar.tech/treatise/deephaf-ai-129/

この投稿では、実際に動かしてみるところに重きをおいています。

# 今回動作対象のものがある場所
下記リンクです。facebookresearchさんのGitHubです。
https://github.com/facebookresearch/votenet

# 環境
docker上に環境を構築しますが、そのホストの環境です。
ubuntu 18.04
NVIDIA GeForce RTX2080

# インストール
### docker環境の構築
別にdockerでなくてもいいのですが、GPU版のpytorchを使うのでCUDAやらcuDNNやらのバージョンがなんちゃらかんちゃらなので、dockerで作成します。

dockerは、GPUを使用するので、nvidia-docker-toolkitを使っています。下記のURLを参考にインストール済みです。
https://github.com/NVIDIA/nvidia-docker

GPUを使いたいので、pytorchが対応するCUDAやらのバージョンを確認します。
https://pytorch.org/
上記URLを参照すると、pytorchとその対応するCUDAやpythonのバージョンの組み合わせとインストール用のコマンドが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508288/9bd241e5-4a4f-6c2d-d0e8-d8ad2899b004.png)

CUDAは10.1を入れればいいようなので、下記コマンドでプルします。

```
# docker pull nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04
```
プルが終わったら、起動します。

```
# docker run --gpus all -it --name pytorchgpu -p 8888:8888 -v ~/workspace/jupyter:/jupyter nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04
```
GPUを使用するので、`--gpus all`をつけて起動します。`-p 8888:8888` はjupyterの実行を見越しています。


### pythonのインストール
出来上がった環境でPythonのバージョンを確認すると、

```
# python --version
bash: python: command not found
```
ってなって、pythonがデフォでインストールされていないようです。
ということで、pythonをインストールしましょう。

pythonは3.7をインストールします。venvを使用するので、それもインストールします。

```
# apt update
# apt install python3
# apt install python3-venv
# apt install python3.7
# apt install python3.7-venv
# apt install python3.7-dev
```
上記コマンドを実行しました。
後ほどのために、`python3.7-dev`もインストールしておきましょう。
インストールが終わったらvenvで仮想の環境を作り、そこにpytorchをインストールします。

```
# cd ~
# mkdir env
# cd env
# python3.7 -m venv pytorch
```
作った仮想の環境にはいります。

```
# source pytorch/bin/activate
# python --version
Python 3.7.5
```
pytorchをインストールします。

```
# pip install torch
```

### VoteNetインストール
gitコマンドでソースコードを取得します。

```
# git clone https://github.com/facebookresearch/votenet.git
```
必要なライブラリをインストールしておきます。numpyやplyfileなどが必要です。
trimesh は <2.35.40 である必要があるので、バージョンを指定しています。

```
# pip install numpy
# pip install wheel
# pip install plyfile
# pip install trimesh==2.35.39
# pip install matplotlib
# pip install opencv-python
```

opencvをインストールします。

```
# apt install libopencv-dev
# pip install opencv-python
```

セットアップします

```
# cd votenet/pointnet2/
# python setup.py install
```
セットアップに成功すると、下記のようなメッセージが表示されます。

```
Installed /root/env/pytorch/lib/python3.7/site-packages/pointnet2-0.0.0-py3.7-linux-x86_64.egg
Processing dependencies for pointnet2==0.0.0
Finished processing dependencies for pointnet2==0.0.0
```

# デモンストレーション
デモンストレーション用のファイルを下記からダウンロードします。

https://drive.google.com/file/d/1oem0w5y5pjo2whBhAqTtuaYuyBu1OG8l/view?usp=sharing

`votenet_pretrained_models.zip`というファイルが、取得できます。
解凍して、votenetフォルダに配置します。unzipコマンドは適宜aptでインストールしてください。

```
# cd ..
# unzip [ZIP配置ディレクトリ]/votenet_pretrained_models.zip  -d .
```
デモンストレーションを実行します。

```
# python demo.py
```
以下のエラーが発生しました。

```
Traceback (most recent call last):
  File "demo.py", line 101, in <module>
    MODEL.dump_results(end_points, dump_dir, DC, True)
  File "/root/work/votenet/models/dump_helper.py", line 86, in dump_results
    pc_util.write_oriented_bbox(obbs[objectness_prob>DUMP_CONF_THRESH,:], os.path.join(dump_dir, '%06d_pred_confident_bbox.ply'%(idx_beg+i)))
  File "/root/work/votenet/utils/pc_util.py", line 421, in write_oriented_bbox
    mesh_list = trimesh.util.concatenate(scene.dump())
  File "/root/env/pytorch/lib/python3.7/site-packages/trimesh/scene/scene.py", line 499, in dump
    for node_name in self.graph.nodes_geometry:
  File "/root/env/pytorch/lib/python3.7/site-packages/trimesh/caching.py", line 88, in get_cached
    value = function(*args, **kwargs)
  File "/root/env/pytorch/lib/python3.7/site-packages/trimesh/scene/transforms.py", line 224, in nodes_geometry
    'geometry' in self.transforms.node[n]):
AttributeError: 'EnforcedForest' object has no attribute 'node'
```

このエラーは、`networkx`のバージョンが2.3未満でないと出力されるようですので、一旦削除して、バージョン指定してインストールしなおします。

```
# python
>>> import networkx
>>> print(networkx.__version__)
2.4
```
で、バージョン確認後アンインストールしt、下記のようにインストールします。

```
# pip uninstall networkx
# pip install networkx==2.2
```
もう一度実行してみましょう。

```
# python demo.py
Constructed model.
Loaded checkpoint /root/work/votenet/demo_files/pretrained_votenet_on_sunrgbd.tar (epoch: 180)
Loaded point cloud data: /root/work/votenet/demo_files/input_pc_sunrgbd.ply
Inference time: 0.078056
Finished detection. 9 object detected.
Dumped detection results to folder /root/work/votenet/demo_files/sunrgbd_results
```
今度は成功しました。`demo_files/sunrgbd_results`に結果が出力されます。

```
# ls -al demo_files/sunrgbd_results/
total 1512
drwxr-xr-x 2 root root    4096 Jan 28 13:12 .
drwxrwxr-x 3 root root    4096 Jan 28 11:58 ..
-rw-r--r-- 1 root root   16077 Jan 28 13:12 000000_aggregated_vote_pc.ply
-rw-r--r-- 1 root root    7057 Jan 28 13:12 000000_confident_proposal_pc.ply
-rw-r--r-- 1 root root 1253931 Jan 28 13:12 000000_pc.ply
-rw-r--r-- 1 root root   64721 Jan 28 13:12 000000_pred_bbox.ply
-rw-r--r-- 1 root root   28432 Jan 28 13:12 000000_pred_confident_bbox.ply
-rw-r--r-- 1 root root    2474 Jan 28 13:12 000000_pred_confident_nms_bbox.ply
-rw-r--r-- 1 root root   11799 Jan 28 13:12 000000_pred_nms_bbox.ply
-rw-r--r-- 1 root root   15995 Jan 28 13:12 000000_proposal_pc.ply
-rw-r--r-- 1 root root   64226 Jan 28 13:12 000000_seed_pc.ply
-rw-r--r-- 1 root root   63991 Jan 28 13:12 000000_vgen_pc.ply
```
この中で、`000000_pred_confident_nms_bbox.ply`が分類結果のバウンディングボックスです。

結果をCloudCompareで表示してみます。
認識元のファイルは、demo_filesフォルダの直下にある`input_pc_sunrgbd.ply`なので、これと、結果のファイルの二つを表示します。
※CloudCompareは3Dが表示できるフリーのツールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508288/ed61f4b6-600e-0a13-e91e-4aee3ad0861f.png)
バウンディングボックスが塗りつぶされているので、みにくいです。DB TreeのMeshを選択して、Propertiesに表示されたMeshのWireframeのチェックをつけると、以下のような表示になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508288/cbe58163-ede2-b816-284a-9d5e282323e1.png)

椅子と机が認識されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508288/42278b0d-4677-92ba-1b05-cd8d81c25f3b.png)
大成功です！

# つぎは
学習させたいけど、アノテーションが大変そうです・・。
がんばります。