※当サイトはPRを含みます

LiDARセンサと3次元点群の物体検出

2023年2月20日

この記事で紹介すること

この記事では点群の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平面に対する反転
・イダー点のスパース化
・ライダー点への加算ガウスノイズの適用
・ドロップアウト
などがあります。

点群におけるデータ拡張の例