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以外は同様な状況でした。

 

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

 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)

 

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

samples_per_gpu=4 → samples_per_gpu=1

workers_per_gpu=4 → workers_per_gpu=1

 

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

 

Vitis AIのデフォルトの設定

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

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

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

 

パラメータを弄ってみる

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

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

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

 

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

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

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

 

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

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

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

 

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

正直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物体検出が課題でした。 ただ貴重な勉強の機会になりましたし、自身への忘備録としても内容を紹介します。

コメント