KITTIとPointPillarsのVitis AIのサンプルを調べたメモ

AI

Vitis AIでKITTIとPointPillarsの機械学習を試してみました。

データセットの用意からFPGAへの量子化までの動作確認をしています。

その際にエラー出た内容含めて紹介します。

 

KITTIとPointPillarsをVitis AIのサンプルを調べたメモ

自動車の物体検出のデータセット(画像+LIDAR)であるKITTIを試してみました。

PointPillarsというLIDAR点群からの3D物体検出の処理をテストしてます。

FPGAの開発環境であるVitis-AIにサンプルがありますので、学習・量子化してみました。

 

基本的には下記のVitis AI 2.5のサンプルに沿って手順を実行しています。

 https://github.com/Xilinx/Vitis-AI/tree/2.5/model_zoo/model-list/pt_pointpillars_kitti_12000_100_10.8G_2.5

yamlに記載している「type: float & quantized」のリンク先から入手できます。

 

Vitis AIのPointpillarsはSECONDがベース

自動車のLIDAR点群の情報から3D物体検出するアルゴリズムと言っても数多くあります。

今回の処理はSECONDというものがベースになっています。

(SECOND: Sparsely Embedded Convolutional Detection)

 

正直、筆者は上手く説明できないのですが下記のQiita記事が分かりやすいと思います。

 https://qiita.com/minh33/items/d0a67a8f253bde0cae14

 

SECONDの中でも色々な処理がある

Pytorch+SECONDだと下記のGithubの下記が一番有名かと思います。

TTIのデータセットだけでなく、nuScenesにも対応しています。

 https://github.com/traveller59/second.pytorch

mmdetection3dというの最新の3D物体検出のライブラリにも組み込まれています。

(むしろ、古いVerが残っている感じです。第6回AIエッジコンテストのベースもこれです。)

 

今回のVitis AIのサンプル元は、上記のからフォークされた1つです。

 https://github.com/nutonomy/second.pytorch

更にFPGAへの実装(量子化)ができるようにアレンジされています。

 

コンフィグファイルを見比べると、デフォルトのSECONDの設定が大きく違います。

SECONDの大きな3つのモジュールから異なっています。

下記SECONDの論文の一部・図を引用させていただいています。

https://pdfs.semanticscholar.org/5125/a16039cabc6320c908a4764f32596e018ad3.pdf

 

(1)voxel_feature_extractor:
・SimpleVoxelRadius  ←大元のリポジストリ(第6回AIエッジコンテストのリファレンス)
・PillarFeatureNet   ←フォークされたリポジストリ(Vitis AIは更に改良)
(2)middle_feature_extractor:
・SpMiddleFHD   ←大元のリポジストリ(第6回AIエッジコンテストのリファレンス)
・PointPillarsScatter ←フォークされたリポジストリ(Vitis AIは更に改良)
(3)rpn:
・RPNV2      ←大元のリポジストリ(第6回AIエッジコンテストのリファレンス)
・RPN       ←フォークされたリポジストリ(Vitis AIは更に改良)

 

Vitis AIでは量子化が出来ても…

Vitis AIのSECONDは、Githubに置かれているSECONDと何かしら差分があります。

今回サンプルに沿う形で量子化まで出来ていますが、あくまで一例です。

(他のGithubのSECONDでも簡単にFPGAの量子化ができるという訳ではなしです…)

 

※また別の記事で紹介したいと思います。

 

Vitis AIのサンプル通り学習→量子化を試してみる

Vitis AIのインストールや環境構築ついては下記記事で紹介しています。

VItis AI 2.5やPetaLinuxなどインストールしてみたメモ

Vitis AI GPU dockerの環境構築をしたメモ

 

README.mdを見て環境を整えます

README.mdに従ってKITTIのデータセットのダウンロードまで行います。

またVitis AIのGPU版のdocker上でcuda-toolkitの11.0とnvccが要求されています。

下記記事で紹介したように、Conda環境を入れ替えて対応します。

Vitis AIでPytorchのConda環境を新しく構築してみた

Vitis AIでPytorchのConda環境を新しく構築してみた
Vitis AIでPytorchのConda環境を立ち上げてみました。 量子化(vai_q_pytorch)する上でgpuとnvccを使うには、環境のセットアップが必要です。 FPGAに向けてPytorchのモデルを量子化する内容を紹介します。

 

Conda環境を入れ替えるスクリプトはdocker/dockerfiles/replace_pytorch.shにあります。

但しデフォルトだとcuda-toolkitの10.2になってしまいます。

そのため下記のようにcuda-toolkitの11.0をインストールするように書き直します。

cudatoolkit=10.2 → cudatoolkit=11.0

 

Vitis AI上での実行したコマンド

前処理・学習・量子化・コンパイルまでスクリプトになっています。

README.mdに従って実行すれば実施できます。下記が実施したコマンドです。

最初にnvccが動かせるようにcuda-toolokit-11-0を入れています。

 

※筆者はあくまでサンプルの流れを確認した程度です。

長すぎる学習(run_train.sh)などは途中で止めています。

また量子化(run_quant.sh)してxmodelを出力した後の処理までは未確認です。

 

エラー出た内容

スクリプトを動かしていく上で出たエラーを数点紹介します。

 

No module named 'utils.non_max_suppression.nms'

non_max_suppression のライブラリを最初に使うときに一度コンパイルしている様子です。

そこでエラーが出ていた内容でした。(長いエラーのため一部切り取りです。)

RuntimeError: ('compile failed with retcode', 1)

 

エラー内容に下記メッセージがありました。

../cc/nms/nms_cpu.h:165:26: note: ‘std::cout’ is defined in header ‘<iostream>’; did you forget to ‘#include <iostream>’?

確かnms_cpu.h含めて何か所か同様なメッセージが出てきます。

そのためエラー出た.hファイルに#include <iostream>を追記すると、エラーが消えました。

 

RuntimeError: CUDA out of memory

train(学習)とかqat(量子化後の精度向上)などCUDAメモリを食います。

筆者のGPUボードはGTX1650です。メモリ4GBです

KITTIのデータセットでも厳しく、必要に応じてバッチサイズなどを調整していました。

 

量子化後の評価値も大体一致した

量子化のスクリプトした結果も貼り付けておきます。

README.mdに各Performance値も記載していましたが、特に大きくは違いありません。

特に問題なくテスト出来ていたようです。

 

まとめ

テストとしては、あくまでサンプルのスクリプトに沿って実行した形となりました。

ただVitis AI上でのSECONDの中身含めて、確認することが出来ました。

 

次はVitis AIのサンプルにはない量子化ができるか試してみた内容を紹介します。

(結果は失敗ですが…)

コメント