見出し画像

3D点群学習モデルPointPillarsを学習から評価まで行う


はじめに

こんにちは。株式会社Rosso、AI部です。
近年、LiDARや、デプスセンサーから得られる3次元データを使用した、機械学習モデルの手法が発達しています。
本記事では、その中でも、3次元のデータ形式の一つである点群データを使用した物体検出モデル「PointPillars」についてご紹介します。
これらの点群データを用いた機械学習モデルは主に、自動運転に応用されています。
そこで、この記事では、自動運転用データセットであるKITTIを使って、PointPillarsを学習・評価まで行う方法もご紹介します。

点群データと機械学習について

点群データとは3次元のデータ(3D)形式の一種で、
3次元情報を座標(x, y, z)で表現するものです。
例えば、点群データのクラス分類を扱っているmodelnet10というデータセットでは、点群データは下記の画像のように表されています。

①順不変性 :
点の順列を入れ替えて機械学習モデルに入力したとしても、出力が不変であるという性質
②移動不変性  :
平行移動や回転移動を作用させた点群データを機械学習モデルに入力したとしても、出力は不変であるという性質
③局所性 : 
画像データや言語データと同様、空間的に近い点同士は何らかの密接な関連性を有していて、空間的に遠い点同士は関連性が小さいという性質


そのため、近年の点群データを用いた機械学習モデルは上記の三つの性質を満たすようにネットワークが構成されていることがほとんどです。

3D点群学習モデルPointPillarsの特徴

PointPillarsとは、2019年に発表された空間を直方体に分割し、その中に含まれる点群を特徴量として使い、疑似画像(Pseudo image)を生成することで、2Dベースの物体検出モデルを点群データに適用するモデルです。
柱(pillar)ごとに含まれる点群のかたまりを特徴量と見なしているようにみえるため、PointPillarsというモデル名が名付けられています。

PointPillarsのarchitecture図
PointPillarsの元論文から引用

従来の3D点群学習モデルであるpointnetは、点群データに畳み込みを繰り返して抽出した特徴量に対して、クラス分類を行うのに対し、PointPillarsは点群データを一度2D画像に変換し、2Dベースの物体検出モデルを適用するといった違いがあります。

Pointnetのarchitecture図
pointnetの元論文から引用

また、PointPillarsと同様に2Dベースの物体検出モデルを行う3D点群学習モデルとして、voxelnetがあります。voxelnetは、複数の点群データを格子単位でまとめて特徴量を抽出し、2Dベースの物体検出モデルを適用するモデルです。ただし、下記の表からわかる通り、voxelnetよりも今回ご紹介するPointPillarsの方が速度、精度ともに優れています。

voxelnetのarchitecture図
voxelnetの元論文から引用


PointPillarsの元論文から引用

PointPillarsの学習・評価に使用するライブラリ

今回はPointPillarsの学習・評価を実際に行ってみます。
通常、3D点群データの機械学習モデルのライブラリには、多くの場合、外部ライブラリとして、畳み込み演算の高速化ライブラリSpconvや2D・3D物体検出ツールのmmdet・mmdet3dを使用しています。
しかし、これらのライブラリのインストールはエラーが発生しやすく、環境構築に躓きやすいという欠点があります。
それを踏まえて、今回は、Spconv,mmdet・mmdet3dを使わないシンプルな構成でPointPillarsの学習・評価を行うことができる下記のリポジトリを使用します。
https://github.com/zhulf0804/PointPillars

また、このリポジトリであれば、学習がcolab上で行えます。
注意点としては、推論については、推論結果をGUI上で表示するため、colab上では実行できません。
私は、colab上の学習で得られた学習済み重みファイルを用いて、ローカルPCで推論を行う運用をしています。
(※推論は学習ほどGPUメモリを必要としないため、学習が行えないPCでも推論自体は可能です。)
学習・評価については、データセットとしてKITTIデータセットを使用します。
KITTIについては、次の項で詳しく解説をします。

学習・評価に使用するデータセットについて

ここでは、KITTI データセットと呼ばれるデータセットを使用します。
KITTI データセット とは車載ステレオ前方映像と3D点群データ、GPS情報を扱ったデータセットです。これらのデータは、自動運転を想定して作成されており、ドイツの公道で下記の画像のような専用車によって収集されました。


KITTI公式サイトにより抜粋

今回学習・評価で使用するKITTIのデータのフォルダは下記の通りです。


1.Velodyne (29 GB):
点群データ。Velodyne lidar社のレーダから取得されたデータのため、Velodyneというフォルダ名の中にデータが収納されている。

2. label_2 (5 MB):
点群データ・画像データに使用するラベル情報が格納されている。

3.calib(16MB):
カメラのカリブレーションデータ。結果の予測を可視化する際に、使用する。

4.image_2 (12GB):
車載ステレオ前方映像のデータ。上記と同様、結果の予測を可視化する際に、使用する。


これらのデータはKITTI公式の下記のリンクからダウンロードできます。
https://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=3d
ダウンロードしたフォルダは下記のディレクトリ構成にして配置を行ってください。

環境構築

この項では、上記のレポシドリを用いた環境構築について説明します。
まず、下記のコマンドでレポシドリをクローンし、pip install を行います。

git clone https://github.com/zhulf0804/PointPillars.git
pip install -r requirements.txt

その際、下記のエラーメッセージが表示されたら、requirements.txtからpointpillars.egg==infoを削除してください。

ERROR: Could not find a version that satisfies the requirement pointpillars.egg==info (from versions: none)
ERROR: No matching distribution found for pointpillars.egg==info

次に下記のコマンドで、cythonによるモジュールのビルドを行います。

cd ops
python setup.py develop

また、KITTIのデータを学習・評価で、使用できる形で前処理を行うため、レポシドリのカレントディレクトリ下で下記のコマンドを実行してください。

python pre_process_kitti.py --data_root [KITTIデータが置かれているディレクトリパス]

以上で環境構築は終了となります。

PointPillarsの学習・評価

PointPillarsの学習としては、下記のコマンドで学習をします。

python train.py --data_root [KITTIデータが置かれているディレクトリパス]

学習を実行すると、デフォルトの設定では、pillars_logsフォルダに学習途中結果の重みづけファイルが保存されていきます。
学習済みの重み付けファイルを使ってKITTIのtestデータ全体の評価を行うには、下記のコマンドを実行します。

python evaluate.py --ckpt [重み付けファイルが置かれているパス] --data_root [KITTIデータが置かれているディレクトリパス]

このコマンドを実行すると、歩行者、車、自動車、全体のAP(Average Precision)がそれぞれ出力されます。

個別のデータの推論結果を見たい場合は、下記のコマンドを実行します。

python test.py --ckpt [重み付けファイルが置かれているパス] --pc_path [対象点群データが置かれているパス] --calib_path [対象カリブデータが置かれているパス]  --img_path [対象画像データが置かれているパス]  --gt_path [対象ラベルデータが置かれているパス] 

例えば、kittiのtrainingデータの134番目のデータの推論結果を確認したい場合、下記のように実行します。

python test.py --ckpt pretrained/epoch_160.pth --pc_path ./kitti/training/velodyne_reduced/000134.bin --calib_path ./kitti/training/calib/000134.txt --img_path ./kitti/training/image_2/000134.png --gt_path ./kitti/training/label_2/000134.txt

このコマンドを実行すると、点群上、車載画像上において、推論結果のバウンディングボックスが下記のように表示されます。


まとめ

以上、PointPillarsの概要から評価・学習の仕方までを一通り説明しました。PointPillarsは現在の点群データを用いたAIコンペ(例えば、第六回のAIエッジコンテスト等)の入賞者の手法でも依然として使われている等、点群データの機械学習モデルでも人気が高いモデルです。
本記事を通じて、皆様のPointPillarsの理解が深まれば幸いです。

参考記事


https://github.com/zhulf0804/PointPillars

この3D物体検出動くぞ...! PointPillarsの訓練から評価まで
第6回AIエッジコンテスト
PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
PointPillars: Fast Encoders for Object Detection from Point Clouds
VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection