LiDAR点群の3D物体検出入門:KITTIのデータ形式からPythonでの可視化まで
自動運転の要、3D物体検出とKITTIデータセットの世界
自動運転技術において、周囲の車両や歩行者を「正確な距離」で把握することは不可欠です。従来の2D画像による物体検出に加え、近年ではLiDAR(ライダー)を用いた3D点群による物体検出が主流となっています。
この記事では、3D物体検出の研究で最も有名な「KITTIデータセット」を軸に、以下の5つのポイントを詳しく解説します。
- 3D点群の基礎知識とLiDARの仕組み
- KITTIデータセットのフォルダ構成とラベルの詳細
- Pythonを用いたLiDARデータの可視化(K3D)
- 3D物体検出におけるタスクと評価指標
- モデルの汎化性能を高める「点群データ拡張」のコツ
1. KITTIデータセットとLiDAR点群の基本
LiDAR(ライダー)とは?
LiDAR(Light Detection And Ranging)は、レーザー光を照射し、反射して戻ってくるまでの時間を計測することで、対象物までの距離を精密に測定する技術です。これにより、カメラ画像では得にくい「高精度な奥行き情報」を点群(Point Cloud)として取得できます。
自動運転の標準「KITTIデータセット」
KITTIデータセットは、自動運転タスク(奥行き推定、セグメンテーション、物体検出など)のベンチマークとして世界中で利用されています。前方カメラ2台の画像と、ルーフに設置されたVelodyne製LiDARの点群データ(サンプリング周波数10Hz)で構成されており、学習データ7,481件、テストデータ7,581件が含まれています。
データセットの構造を理解する
KITTIのフォルダ構成は、解析をスムーズに進めるための第一歩です。
KITTI
|- training
|- calib (.txt) # カメラ・LiDAR間の座標変換パラメータ
|- image_2 (.png) # 前方カラー画像
|- label_2 (.txt) # 正解ラベル(物体の種類・位置)
|- velodyne_2 (.bin) # LiDAR点群データ(バイナリ形式)
|- testing
|- calib (.txt)
|- image_2 (.png)
|- velodyne_2 (.bin)

ラベルデータ(label_2)の詳細
1つの物体に対して、以下のような15種類のパラメータが格納されています。特に3D検出では、後半の寸法(height, width, length)と位置(x, y, z)、回転角(rotation_y)が重要です。
| 0:物体の種類 | Car, Pedestrian, Cyclistなど |
| 1-2:切断・遮蔽 | 画像外へのはみ出しや隠れ具合 |
| 3:α | カメラから見た観測角 |
| 4-7:2D Box | 画像上のバウンディングボックス(xmin, ymin, xmax, ymax) |
| 8-10:3D Dimension | 物体のサイズ(高さ, 幅, 長さ) |
| 11-13:3D Location | カメラ座標系における中心座標(x, y, 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
LiDARデータの可視化(Python)
.bin形式の点群データは、NumPyで読み込み、K3Dライブラリを使用することで対話的な可視化が可能です。反射強度(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)) # x, y, z, intensity
# K3Dによるプロット
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()

2. 3次元物体検出のタスクと損失関数
3次元物体検出のゴールは、点群シーンから「どの物体が(クラス)」「どこに(3Dバウンディングボックス)」あるかを特定することです。
3Dバウンディングボックスは、一般に中心座標、サイズ(幅w, 長さl, 高さh)、向き(角度)の6自由度(または7自由度)で定義されます。このとき、物体の進行方向(長さl)は幅wよりも大きいという不変性を考慮することが一般的です。
モデルの評価(回帰損失と分類損失)
学習時には、予測値と正解データのズレを以下の2つの損失関数で評価します。
- 回帰損失(Regression Loss):ボックスの座標、サイズ、角度などの連続値の誤差を最小化します(Smooth L1損失など)。
- 分類損失(Classification Loss):それが「車」なのか「歩行者」なのかというクラスラベルの予測精度を評価します(Focal Lossなど)。
3. 汎化性能を高めるデータ拡張(Data Augmentation)
深層学習モデルの精度向上にはデータ拡張が不可欠ですが、点群データの場合は「物理法則に反しないこと」が極めて重要です。
例えば、遠くの物体は点群が疎になり、近くの物体は密になるという特性があります。これを無視したスケーリングを行うと、実世界の物理現象から乖離したデータとなり、かえって精度を落とす原因になります。
一般的な拡張手法:
- 回転・反転: z軸周りの回転や、左右対称な反転。
- スパース化・ドロップアウト: 意図的に点群の一部を削除し、遮蔽や遠距離を擬似的に再現。
- ノイズ付加: センサーの測定誤差を想定したガウスノイズの追加。

まとめ
この記事では、KITTIデータセットの構造から、LiDARデータの可視化、そして3D物体検出の基礎概念について解説しました。3D物体検出は、点群をそのまま扱う「Point-based」や、格子状に変換する「Voxel-based」など、多様なネットワークモデルが存在します。
データの構造を正しく理解し、適切なデータ拡張を行うことが、高性能なモデル構築への第一歩となります












ディスカッション
コメント一覧
まだ、コメントがありません