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

LiDAR点群の3D物体検出入門:KITTIのデータ形式からPythonでの可視化まで

2026年3月14日

自動運転の要、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軸周りの回転や、左右対称な反転。
  • スパース化・ドロップアウト: 意図的に点群の一部を削除し、遮蔽や遠距離を擬似的に再現。
  • ノイズ付加: センサーの測定誤差を想定したガウスノイズの追加。
点群におけるデータ拡張の例 (Source: arXiv:2004.00831)

まとめ

この記事では、KITTIデータセットの構造から、LiDARデータの可視化、そして3D物体検出の基礎概念について解説しました。3D物体検出は、点群をそのまま扱う「Point-based」や、格子状に変換する「Voxel-based」など、多様なネットワークモデルが存在します。

データの構造を正しく理解し、適切なデータ拡張を行うことが、高性能なモデル構築への第一歩となります