KITTI:数据集格式&使用手册

这篇文章上次修改于 7 个月前,可能部分内容已经不适用,如有疑问可询问作者。

KITTI:数据集格式&使用手册

数据集简介

KITTI数据集由德国卡尔斯鲁厄理工学院和丰田工业大学芝加哥分校联合赞助的用于自动驾驶领域研究的数据集。作者收集了长达6个小时的真实交通环境,数据集由经过校正和同步的图像、雷达扫描、高精度的GPS信息和IMU加速信息等多种模态的信息组成。作者还在数据集官网提供了光流、物体检测、深度估计等多种任务的Benchmark。

官网传送门:KITTI


下载说明图

格式介绍

mmdetection3d
├── mmdet3d
├── tools
├── configs
├── data
│   ├── kitti
│   │   ├── ImageSets
│   │   ├── testing
│   │   │   ├── calib
│   │   │   ├── image_2
│   │   │   ├── velodyne
│   │   ├── training
│   │   │   ├── calib
│   │   │   ├── image_2
│   │   │   ├── label_2
│   │   │   ├── velodyne
│   │   │   ├── planes (optional)
Copy

文件夹含义如下:

以上值通过序号来一一对应

1. 激光点云

格式:.bin二进制文件(Velodyne HDL-64E激光雷达采集)

内容:

每个点由4个float32数值组成:[x, y, z, reflectance]

(x, y, z):三维坐标(激光雷达坐标系,右前上方向为坐标轴正方向)

reflectance:反射强度(范围0~1,表征物体表面反射特性)

特点:每帧约12万点,覆盖360°水平视场,垂直分辨率约0.4°

PYTHON
import numpy as np
import struct

def read_lidar_info(file_path):
    size = os.path.getsize(file_path)
    point_num = int(size / 16)
    assert point_num * 16 == size

    lidar_pt_list = np.zeros((point_num, 4), np.float)
    with open(file_path, 'rb') as f:
        for i in range(point_num * 4):
            data = f.read(4)
            val = struct.unpack('f', data)
            row = int(i / 4)
            col = i % 4
            lidar_pt_list[row][col] = val[0]
    lidar_pt_list = lidar_pt_list.transpose()

    return lidar_pt_list
Copy

2. 图像数据

格式:.png彩色图像(分辨率为1242×375)

内容:

左/右摄像头、灰度/彩色摄像头数据(常见使用左彩色摄像头image_2)。

包含RGB三通道信息,未压缩的原始图像。

3. 标定参数:

参数名称含义
P0~P33 × 4 的相机投影矩阵,0~3分别对应左侧灰度相机、右侧灰度相机、左侧彩色相机、右侧彩色相机
R0_rect3 × 3 的旋转修正矩阵
Tr_velo_to_cam3 × 4 的激光坐标系到Cam 0坐标系的变换矩阵
Tr_imu_to_velo3 × 4 的IMU坐标系到激光坐标系的变换矩阵

内参矩阵(3×3):包含焦距(fx, fy)、主点(cx, cy)和畸变系数。

外参矩阵(4×4):定义激光雷达到相机的坐标系转换(旋转矩阵R + 平移向量T)。

数据处理示意

  1. 点云网络(如PointNet++)
PYTHON
# 加载点云并采样到固定数量(如4096点)
points = np.fromfile("xxx.bin", dtype=np.float32).reshape(-1, 4)
points = points[np.random.choice(len(points), 4096)]
# 归一化到局部坐标系
points[:, :3] -= np.mean(points[:, :3], axis=0)
Copy
  1. 体素网络(如VoxelNet)
PYTHON
from spconv.utils import VoxelGenerator
voxel_generator = VoxelGenerator(voxel_size=[0.1, 0.1, 0.2], point_cloud_range=[0, -40, -2, 70, 40, 5])
voxels, coords, num_points = voxel_generator.generate(points)
Copy
  1. 图像网络(如ResNet)
PYTHON
import torchvision.transforms as T
transform = T.Compose([
    T.Resize((256, 512)),
    T.ToTensor(),
    T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
image = transform(cv2.imread("xxx.png"))
Copy
  1. 多模态网络(如MV3D)
PYTHON
# 生成点云投影到图像的BEV特征和RGB图像
bev_map = project_to_bev(points)  # 转换为鸟瞰图密度图
image = load_and_preprocess_image()
fusion_input = torch.cat([bev_map, image], dim=1)
Copy

其他使用

对齐生成虚拟点

使用PENET可以从其相机和点云数据对齐得到图像的虚拟点。该方法应用在VirConv上。

Reference

【知乎】kitti数据从制作到使用

【CSDN】KITTI 3D目标检测数据集解析