LiDARセンサと3次元点群の物体検出
この記事で紹介すること
この記事では点群の3次元物体検出がどのように使用されているかを紹介します。
①3次元点群のデータセットであるKITTIデータセットとデータセットに含まれるライダー点群のデータ形式について
②3次元物体検出のタスクについて
③モデルの性能を評価する一般的な回帰損失と分類損失について
④点群のデータ拡張について
⑤物体検出に用いられるネットワークモデルについて
① KITTIデータセットとライダー点群のデータ形式について
LiDAR
LiDARとは Light Detection And Ranging(光による検知と測距)の略称で、近赤外光や可視光、紫外線を使って対象物に光を照射し、その反射光を光センサでとらえ距離を測定するリモートセンシング方式です。
過去の記事でも少し触れています。
KITTIデータセット
KITTIデータセットは、画像ベースの単眼・ステレオ奥行き推定、オプティカルフロー、セマンティック・インスタンスセグメンテーション、2次元・3次元物体検出を含む自動運転タスクの標準ベンチマークデータセットになっています。
2台の前方カメラで撮影した画像と、車のルーフに取り付けられたVelodyne のライダーセンサーで取得した点群データとラベルが含まれています。
KITTIデータセットは、7481の学習データと7581のテストデータから構成されています。
ライダーセンサーの360度スキャン時間は100ミリ秒であるため、このセンサーで取得するデータのサンプリング周波数は10HZとなります。
KITTIデータセットのフォルダ構成
KITTIデータセットのフォルダは以下のような構成になっています。
KITTI
|- training
|- calib (.txt)
|- image_2 (.png)
|- label_2 (.txt)
|- velodyne_2 (.bin)
|- testing
|- calib (.txt)
|- image_2 (.png)
|- label_2 (.txt)
|- velodyne_2 (.bin)
・calib
カメラパラメータ(.txt)が格納されています。
・image_2
撮影画像(.png)が格納されています。
画像の例↓
・label_2
ラベルとバウンディングボックスの位置など15種類のデータがスペースで区切られてテキストファイルに格納されています。(.txt)
0:物体の種類
1:物体の画像からはみ出している割合(0は完全に見えている、1は完全にはみ出している)
2:オクルージョン状態(0:完全に見える、1:部分的に隠れている、2:大部分が隠れている、3:不明)
3:カメラから見た物体の向きα[-pi, pi]
4:2D bounding boxのx座標の最小値
5:2D bounding boxのy座標の最小値
6:2D bounding boxのx座標の最大値
7:2D bounding boxのy座標の最大値
8:3D object dimensionsの高さ(height)
9:3D object dimensionsの幅(width)
10:3D object dimensionsの奥行き(length)
11:3D 物体のx座標
12:3D 物体のy座標
13:3D 物体のz座標
14:カメラ座標系での物体の向きrotation_y [-pi..pi]
ラベルの例↓
Car 0.89 0 2.29 0.00 194.70 414.71 373.00 1.57 1.67 4.14 -2.75 1.70 4.10 1.72
・velodyne_2
LiDARで取得したセンサデータが格納されています。(.bin)
直交座標(x,y,z)と反射強度(ρ)で構成されています。
KITTIデータセットに含まれる各シーンの点群は、平均して約10万点程になります。
LiDARデータの可視化(Pythonを用いたbinファイルの可視化)
binファイルの中身を確認したいときはnumpyで読み込むことができます。
可視化ツールはK3Dを使用します。
[x,y,z,intensity]の形で読み込んで、intensityの大きさに応じて色を変えて表示してみます。
import k3d
import numpy as np
with open ("000000.bin", "rb") as f:
scan = np.fromfile(f, dtype=np.float32)
scan = scan.reshape((-1, 4))
plot = k3d.plot()
plot +=k3d.points(scan[:,:3], point_size=0.02, attribute=scan[:,3], color_map=k3d.colormaps.basic_color_maps.Jet)
plot.display()
② 3次元物体検出のタスクについて
ライダーベースの3次元物体検出タスクでは、取得したライダー点によって形成されるシーンの点群が与えられると、シーン内の物体のクラスと3Dバウンディングボックス(ライダー座標フレームで表されます)を予測します。
自動運転アプリケーションでは、シーン内の対象となる物体は主に自動車、自転車、歩行者があります。
また、3Dボックスとは、3Dボックスのボディ座標フレームに対する方位角が補強された3Dボックスのことで、この方位角は、3Dボックスのボディ座標フレームに対する方位角です。
ライダー座標系での3Dバウンディングボックスは、ボックス寸法、ボックス中心座標、角度の6自由度でエンコードするのが一般的です。
3Dバウンディングボックスの寸法は、幅、長さ、高さ(w、l、h)であり、長さは幅より常に大きいという不変性をもっています。
③モデルの性能を評価する一般的な回帰損失と分類損失について
機械学習を用いた3次元の物体検出では、出力としてバウンディングボックスの6つの座標とクラスが予測値として得られます。
バウンディングボックスの座標は回帰損失、クラスは分類損失として物体検出モデルの学習に使用されます。
④点群のデータ拡張について
データ拡張を行うことで、物体検出の汎化性を向上させます。
点群のデータ拡張も画像と同様にポイントの回転や移動をすることでデータを増やして学習を行います。
ただし、物理法則に従うように拡張する必要があります。
例えば、点群データはライダーセンサから遠くなるにつれて疎になることが予想されます。したがって、この制約に従わないデータ拡張方法は、実世界のシナリオに適していないため、学習時に採用しないほうが良いと考えられます。
一般的な点群データの拡張手法は、
・z軸周りの回転
・-zおよびy-z平面に対する反転
・イダー点のスパース化
・ライダー点への加算ガウスノイズの適用
・ドロップアウト
などがあります。
ディスカッション
コメント一覧
まだ、コメントがありません