自動車の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(mini)の公式のデータでも同様に対応できました。
下記記事でVitis AIのDocker上での実行コマンド含めて紹介しています。
かなり特殊な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以外は同様な状況でした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
(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)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
(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
1 2 3 4 |
data = dict( samples_per_gpu=1, workers_per_gpu=1, train=dict( |
GPUの設定変更後は学習が動作しました。丁度GPUのメモリ4GB程度でした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
+-----------------------------------------------------------------------------+ | 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)より低い形です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
(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と少し上がりましたが、人は下がっているので正直あまり変わらず。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
(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と悪化しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
(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をメモリ不足で諦めたメモ
今回の記事含めて、第6回AIエッジコンテストの一環でした。
下記にてコンテストでテスト・実施したことのまとめを紹介しています。
コメント