LIDAR点群の3D物体検出の学習に失敗したメモ

本サイトはアフィリエイト広告を利用しています。
AI

自動車のLIDAR点群データを使った3D物体検出の学習を試してみました。

ただ、Xilinxからサンプルで提供されている学習済のモデル(重み)には勝てず…。

色々と試して失敗した内容含めて紹介します。

 

スポンサーリンク

LIDAR点群の3D物体検出の学習に失敗したメモ

LIDAR点群でPointPillars(3D物体検出)の学習をしてみました。

使用したのは第6回AIエッジコンテストのデータセットです。

nuScenes形式の自動車運転の画像・LIDAR点群の情報を持つデータでした。

 

色々と学習を試したのですが、評価値(スコア)が上手く上がりませんでした。

Xilinxからサンプルで提供されている学習済のモデル(重み)が一番良い結果でした。

(莫大なnuScenes公式のデータを、潤沢な計算資源で学習済のため当然かもしれませんが…)

 

色々学習して試した(失敗した)内容含めて紹介します。

 

実行環境

下記の環境で実行しました。

最終的にはXilinxのFPGAに実装したいため、Vitis AI上の環境で学習しています。

  • Vitis AI 2.5 + nuScenes_PointPillarsのライブラリ
  • 第6回AIエッジコンテストのデータセット

 

PC環境は下記となります。3D物体検出の学習を行うには大分貧弱なPCです。

  • CPU…Core i5 6400
  • GPU…NVIDIA GeForce GTX 1650(メモリ4GB)
  • メモリ…16GB
  • SSD…500GB

 

データセットの準備・前処理は対応済

学習・評価に必要なデータセットの用意・前処理は下記記事で対応済です。

nuScenes formatのLidar点群の前処理をしてみたメモ

nuScenes formatのLidar点群の前処理をしてみたメモ
nuScenes形式のデータセットの学習前の前処理をしてみました。 3D物体検出をするために、LIDAR点群を処理しています。 データセットの入れ方から、プログラムの実行まで紹介します。

 

またnuScenes(mini)の公式のデータでも同様に対応できました。

下記記事でVitis AIのDocker上での実行コマンド含めて紹介しています。

nuScenes miniのdatasetを試してみる

nuScenes miniのdatasetを試してみる
nuScenesのデータセットは数百Gbyteと莫大です。 nuScenes miniならば数Gbyteのため、テストレベルなら簡単に使えます。 ダウンロードして、Vitis AI環境下で簡単に評価まで実施してみました。

 

かなり特殊なLIDAR点群のデータセット

今回のコンテストのデータセットはかなり特殊だったと思います。

データはnuScenesのformatに沿ったものでしたが、nuScenes公式とは仕様が違いました。

  • 画像・LIDAR点群のセンサーは前方のみですが、最終評価は全方向360°が対象
  • 提供されたデータのアノテーションが前方のみと全方向360°が混ざっている

 

下記で(本当に凄い)有識者の方々がコメント・言及されていました。

 https://signate.jp/competitions/732/discussions/operadataset

 https://signate.jp/competitions/732/discussions/20220901232001-40026

 

正直なところ(筆者は)そこまで追いついていませんでした。

一旦デフォルトの前方・全方向360°の混ざったデータで学習させています。

 

Vitis AIの学習済みモデルを評価する

最初にVitis AIのライブラリに用意されている学習済のモデルを確認します。

  • モデル…Vitis AIの学習済のモデル(/float/pointpillars-nus.pth)
  • データセット…第6回AIエッジコンテストのデータセット

 

Vitis AI上では簡単に評価できるようにスクリプトファイル(run_eval.sh)になっています。

自動車(car)はAP_0.665と少しは評価出来ていました。

人(pedestrian)はAP_0.046とほぼ駄目な評価です。car以外は同様な状況でした。

(vitis-ai-pt1_7) Vitis-AI /workspace/pt_pointpillars_nuscenes_40000_64_108G_2.5 > bash run_eval.sh
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 187/187, 1.4 task/s, elapsed: 132s, ETA:     0s
Formating bboxes of pts_bbox
Start to convert detection format...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 187/187, 30.6 task/s, elapsed: 6s, ETA:     0s
Results writes to /tmp/tmpct_xzh2q/results/pts_bbox/results_nusc.json
Evaluating bboxes of pts_bbox
mAP: 0.0914                                                                                                                                                                                                 
mATE: 0.5661
mASE: 0.5572
mAOE: 1.2971
mAVE: 1.4948
mAAE: 0.6287
NDS: 0.1705
Eval time: 7.0s

Per-class results:
Object Class	AP	ATE	ASE	AOE	AVE	AAE
car	0.665	0.226	0.217	0.278	3.834	0.387
truck	0.109	0.548	0.283	0.755	2.388	0.514
bus	0.000	0.613	0.383	2.534	1.633	0.824
trailer	0.000	1.000	1.000	1.000	1.000	1.000
construction_vehicle	0.002	0.725	0.340	1.074	0.583	0.473
pedestrian	0.046	0.152	0.494	1.738	0.899	0.464
motorcycle	0.000	1.000	1.000	1.000	1.000	1.000
bicycle	0.000	0.253	0.318	2.295	0.622	0.366
traffic_cone	0.093	0.143	0.537	nan	nan	nan
barrier	0.000	1.000	1.000	1.000	nan	nan

 

下記のコンテストのリファレンス環境でも、自動車以外はまともに評価出来ていませんでした。

 https://github.com/pometa0507/6th-ai-reference2/blob/master/notebook/1-4_inference.ipynb

環境に色々と差分はありますが、同じデータセットでは同じ評価傾向でした。

  • リファレンス環境… PointPainting(古いSECONDを応用したもの)
  • 今回の環境…    PointPillars(mmdetection3dベースのSECOND)

 

3D物体検出のPointPillarsの学習をする

基本はVitis AIのnuScenes_PointPillarsのデフォルト設定で学習させています。

Vitis AI上では学習もスクリプトファイル(run_train.sh)になっています。

 

GPUメモリ不足のエラーを回避する

デフォルトの学習設定だと、GPU_4GBメモリでは直ぐメモリ不足になります。

RuntimeError: CUDA out of memory. Tried to allocate 1.14 GiB (GPU 0; 3.82 GiB total capacity; 2.54 GiB already allocated; 399.44 MiB free; 2.60 GiB reserved in total by PyTorch)

(vitis-ai-pt1_7) Vitis-AI /workspace/pt_pointpillars_nuscenes_40000_64_108G_2.5 > bash run_train.sh
~~~~~~~~~~~~~~~~~~~~~
RuntimeError: CUDA out of memory. Tried to allocate 1.14 GiB (GPU 0; 3.82 GiB total capacity; 2.54 GiB already allocated; 399.44 MiB free; 2.60 GiB reserved in total by PyTorch)
Traceback (most recent call last):
  File "/opt/vitis_ai/conda/envs/vitis-ai-pt1_7/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/opt/vitis_ai/conda/envs/vitis-ai-pt1_7/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/opt/vitis_ai/conda/envs/vitis-ai-pt1_7/lib/python3.7/site-packages/torch/distributed/launch.py", line 260, in <module>
    main()
  File "/opt/vitis_ai/conda/envs/vitis-ai-pt1_7/lib/python3.7/site-packages/torch/distributed/launch.py", line 256, in main
    cmd=cmd)
subprocess.CalledProcessError: Command '['/opt/vitis_ai/conda/envs/vitis-ai-pt1_7/bin/python', '-u', './code/mmdetection3d/tools/train.py', '--local_rank=0', 'float/hv_pointpillars_secfpn_sbn-all_4x4_2x_nus-3d.py', '--launcher', 'pytorch', '--work-dir', 'workspace']' returned non-zero exit status 1.

 

設定ファイル(/float/nus-3d.py)のGPUの設定数を変更して対応しました。

samples_per_gpu=4 → samples_per_gpu=1

workers_per_gpu=4 → workers_per_gpu=1

data = dict(
    samples_per_gpu=1,
    workers_per_gpu=1,
    train=dict(

 

GPUの設定変更後は学習が動作しました。丁度GPUのメモリ4GB程度でした。

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 465.19.01    Driver Version: 465.19.01    CUDA Version: 11.3     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  On   | 00000000:01:00.0 Off |                  N/A |
| 30%   48C    P2    N/A /  75W |   3531MiB /  3910MiB |     95%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A       912      G   /usr/lib/xorg/Xorg                  9MiB |
|    0   N/A  N/A      1270      G   /usr/bin/gnome-shell                6MiB |
|    0   N/A  N/A      8185      C   ...vitis-ai-pt1_7/bin/python     3461MiB |
|    0   N/A  N/A     29268      C   /usr/bin/python                    49MiB |
+-----------------------------------------------------------------------------+

 

Vitis AIのデフォルトの設定

デフォルト(epoch数24)の設定で学習させて、入手したモデル(.pth)を評価しました。

※72epochも試したが、GPUメモリ4GBでは足りず27epochで止まりました。

自動車(car)のAP_0.373の結果でした。サンプルのモデル(AP_0.665)より低い形です。

(vitis-ai-pt1_7) Vitis-AI /workspace/signate_pt_pointpillars_nuscenes_40000_64_108G_2.5 > bash run_eval.sh
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 187/187, 3.3 task/s, elapsed: 57s, ETA:     0s
Formating bboxes of pts_bbox
Start to convert detection format...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 187/187, 124.7 task/s, elapsed: 2s, ETA:     0s
Results writes to /tmp/tmp8v9aw4z0/results/pts_bbox/results_nusc.json
Evaluating bboxes of pts_bbox
mAP: 0.0451                                                                                                                                                                                                 
mATE: 0.8120
mASE: 0.7965
mAOE: 1.0586
mAVE: 1.6317
mAAE: 0.7771
NDS: 0.0840
Eval time: 3.3s

Per-class results:
Object Class	AP	ATE	ASE	AOE	AVE	AAE
car	0.373	0.335	0.227	0.600	5.489	0.312
truck	0.021	0.496	0.349	1.170	1.640	0.415
bus	0.000	1.000	1.000	1.000	1.000	1.000
trailer	0.000	1.000	1.000	1.000	1.000	1.000
construction_vehicle	0.000	1.000	1.000	1.000	1.000	1.000
pedestrian	0.057	0.289	0.388	1.758	0.925	0.490
motorcycle	0.000	1.000	1.000	1.000	1.000	1.000
bicycle	0.000	1.000	1.000	1.000	1.000	1.000
traffic_cone	0.000	1.000	1.000	nan	nan	nan
barrier	0.000	1.000	1.000	1.000	nan	nan

 

パラメータを弄ってみる

正直、筆者は3D物体検出のパラメータ調整などしたことがないです。

適当に不必要そうなパラメータなど消して試してみます。

※今回のコンテストでは自動車(car)と人(pedestrian)のみが評価対象です。

 

それ以外のトラック(truck)、自転車(bicycle)パラメータを消してみました

「/float/hv_pointpillars_secfpn_sbn-all_4x4_2x_nus-3d.py」箇所です。

自動車(car)のAP_0.407と少し上がりましたが、人は下がっているので正直あまり変わらず。

(vitis-ai-pt1_7) Vitis-AI /workspace/signate_pt_pointpillars_nuscenes_40000_64_108G_2.5 > bash run_eval.sh
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 187/187, 3.4 task/s, elapsed: 55s, ETA:     0s
Formating bboxes of pts_bbox
Start to convert detection format...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 187/187, 197.0 task/s, elapsed: 1s, ETA:     0s
Results writes to /tmp/tmpg9523gwy/results/pts_bbox/results_nusc.json
Evaluating bboxes of pts_bbox
mAP: 0.0435                                                                                                                                                                                                 
mATE: 0.8546
mASE: 0.8620
mAOE: 0.9872
mAVE: 1.5396
mAAE: 0.8596
NDS: 0.0654
Eval time: 2.9s

Per-class results:
Object Class	AP	ATE	ASE	AOE	AVE	AAE
car	0.407	0.287	0.242	0.444	5.324	0.332
truck	0.000	1.000	1.000	1.000	1.000	1.000
bus	0.000	1.000	1.000	1.000	1.000	1.000
trailer	0.000	1.000	1.000	1.000	1.000	1.000
construction_vehicle	0.000	1.000	1.000	1.000	1.000	1.000
pedestrian	0.027	0.258	0.378	1.441	0.993	0.545
motorcycle	0.000	1.000	1.000	1.000	1.000	1.000
bicycle	0.000	1.000	1.000	1.000	1.000	1.000
traffic_cone	0.000	1.000	1.000	nan	nan	nan
barrier	0.000	1.000	1.000	1.000	nan	nan

 

他にもnus-3d.pyのpoint_cloud_rangeを弄ってみました。

(リファレンス環境が弄っていたので、もしかしたら良くなるのかなと思って…)

むしろ自動車(car)のAP_0.218と悪化しました。

(vitis-ai-pt1_7) Vitis-AI /workspace/signate_pt_pointpillars_nuscenes_40000_64_108G_2.5 > bash run_eval.sh
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 187/187, 8.4 task/s, elapsed: 22s, ETA:     0s
Formating bboxes of pts_bbox
Start to convert detection format...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 187/187, 247.5 task/s, elapsed: 1s, ETA:     0s
Results writes to /tmp/tmpxfx_iq5x/results/pts_bbox/results_nusc.json
Evaluating bboxes of pts_bbox
mAP: 0.0260                                                                                                                                                                                                 
mATE: 0.8577
mASE: 0.8612
mAOE: 0.9553
mAVE: 1.6142
mAAE: 0.8806
NDS: 0.0575
Eval time: 2.3s

Per-class results:
Object Class	AP	ATE	ASE	AOE	AVE	AAE
car	0.218	0.304	0.240	0.290	5.996	0.458
truck	0.000	1.000	1.000	1.000	1.000	1.000
bus	0.000	1.000	1.000	1.000	1.000	1.000
trailer	0.000	1.000	1.000	1.000	1.000	1.000
construction_vehicle	0.000	1.000	1.000	1.000	1.000	1.000
pedestrian	0.042	0.273	0.373	1.308	0.918	0.587
motorcycle	0.000	1.000	1.000	1.000	1.000	1.000
bicycle	0.000	1.000	1.000	1.000	1.000	1.000
traffic_cone	0.000	1.000	1.000	nan	nan	nan
barrier	0.000	1.000	1.000	1.000	nan	nan

 

…といった感じに少しパラメータ弄って遊んでみたのですが、あまり変わらずでした。

正直Xilinxのサンプルが一番良さそうということで、諦めました。

(というか色々テストすると、直ぐメモリ4GBを超えて無理でした)

 

まとめ

3D物体検出の学習を試したのですが、評価値(スコア)が上手く上がりませんでした。

Xilinxからサンプルで提供されている学習済のモデル(重み)が一番良い結果でした。

次はFPGAの実装に向けた量子化をテストしたいと思います。(リンク先はこちら)

量子化のFast Finetuningをメモリ不足で諦めたメモ

量子化のFast Finetuningをメモリ不足で諦めたメモ
Vitis AIのFPGA向けの量子化で精度ロスを防ぐFast Finetuningという機能があります。 但しPCのメモリが有る程度必要でした。(今回だと28GB程度) 低スペックPCには難しく、普通の量子化をした旨を紹介します。

 

今回の記事含めて、第6回AIエッジコンテストの一環でした。

下記にてコンテストでテスト・実施したことのまとめを紹介しています。

第6回AIエッジコンテストが凄く難しいけど勉強になった感想

第6回AIエッジコンテストが凄く難しいけど勉強になった感想
第6回AIエッジコンテストに参加していました。 RISC-Vを使って、画像とLIDAR点群からの3D物体検出が課題でした。 ただ貴重な勉強の機会になりましたし、自身への忘備録としても内容を紹介します。

コメント