KITTI和nuScenes都是自动驾驶领域常用的公开数据集,但两者在传感器配置、数据组织方式、标注结构以及适用任务上存在明显差异。做目标检测、3D检测、点云处理、视觉里程计或多传感器融合实验时,选择合适的数据集能够减少大量数据预处理工作。
KITTI数据集简介
KITTI Vision Benchmark由德国卡尔斯鲁厄理工学院(KIT)与Toyota Technological Institute at Chicago等机构共同推动,主要用于自动驾驶场景下的计算机视觉研究。官方提供了立体视觉、光流、视觉里程计、3D目标检测、目标跟踪、深度估计等多类任务的数据和评测基准。CVLibs
KITTI的数据采集平台搭载了双目摄像头、Velodyne激光雷达以及GPS/IMU定位设备,数据覆盖城市道路、郊区道路和高速公路等场景。CVLibs
常见的KITTI数据集包括:
-
KITTI Object:主要用于2D/3D目标检测与目标方向估计。
-
KITTI Raw:提供原始传感器数据,适合研究多传感器数据处理。
-
KITTI Odometry:主要用于视觉里程计、SLAM和定位研究。
-
KITTI Tracking:用于多目标跟踪。
-
KITTI Stereo:用于双目视觉和深度估计。
-
KITTI Depth:用于单目深度预测和深度补全。
-
KITTI-360:面向更加完整的3D场景理解任务。
其中,KITTI Object是很多3D目标检测论文和开源项目最常使用的版本之一。官方数据显示,该任务包含7481张训练图像和7518张测试图像,并提供对应点云及目标标注。CVLibs
KITTI怎么下载
KITTI并不是一个简单的单文件压缩包,而是按照研究任务划分成多个数据子集。下载前首先应该确定自己的实验目标。
例如:
如果研究YOLO类2D目标检测,可以重点关注Object数据集;如果研究LiDAR 3D检测,则需要下载对应的Velodyne点云、图像和标注;如果研究SLAM或视觉里程计,则应该选择Odometry数据。
KITTI官方目前要求下载用户完成注册,并填写数据使用目的。注册下载页面需要提供包括机构邮箱在内的信息,激活账户后才能进行数据下载。CVLibs+1
建议优先从KITTI官方页面获取数据,不要直接使用来源不明的第三方压缩包。官方页面同时提供不同Benchmark的下载入口和数据说明。
KITTI Object数据结构
以常见的3D目标检测数据为例,下载并解压后通常会涉及以下几类内容:
KITTI/ ├── training/ │ ├── image_2/ │ ├── image_3/ │ ├── velodyne/ │ ├── calib/ │ └── label_2/ └── testing/ ├── image_2/ ├── image_3/ ├── velodyne/ └── calib/
其中:
-
image_2:左侧彩色相机图像。 -
image_3:右侧彩色相机图像。 -
velodyne:LiDAR点云数据,通常以.bin形式保存。 -
calib:相机、雷达之间的标定参数。 -
label_2:目标检测标注。
读取LiDAR点云时,经常可以看到如下Python代码:
Python运行import numpy as np points = np.fromfile( "000000.bin", dtype=np.float32 ).reshape(-1, 4) print(points.shape)
每个点通常包含:
x y z intensity
也就是三维坐标和反射强度。
KITTI标注如何理解
KITTI目标检测标签通常是一行表示一个目标,字段包含目标类别、截断程度、遮挡状态、观察角度、2D边界框以及3D尺寸、位置和旋转角等信息。
例如:
Car 0.00 0 -1.57 50.0 50.0 150.0 180.0 1.5 1.6 3.9 1.2 1.5 20.0 -1.5
其中3D尺寸、位置和旋转角对于3D目标检测尤为重要。
需要特别注意坐标系。KITTI中的相机坐标系、Velodyne坐标系并不完全相同,进行LiDAR与Camera数据融合时必须结合calib目录中的标定参数进行坐标转换,否则容易出现3D框位置偏移、左右颠倒或投影错误等问题。
nuScenes数据集简介
nuScenes由Motional团队推出,是自动驾驶领域具有代表性的多模态数据集。官方数据包含在Boston和Singapore采集的1000个驾驶场景,每个场景大约20秒,并且重点覆盖城市道路中的复杂交通情况。NuScenes
与传统KITTI相比,nuScenes更强调多传感器融合。一个典型传感器配置包括:
-
6个摄像头
-
1个LiDAR
-
5个Radar
-
IMU
-
GPS
因此,nuScenes特别适合研究3D目标检测、多目标跟踪、传感器融合、预测和场景理解。
nuScenes怎么下载
nuScenes需要先进入官方Download页面注册账户并登录。官方说明显示,数据下载免费,但需要注册并同意相关使用条款;数据也提供在AWS Open Data Registry中。NuScenes
如果只是第一次学习nuScenes,不建议直接下载完整数据。官方教程提供了v1.0-mini版本,可以先使用小规模数据熟悉目录结构、JSON数据库以及SDK的调用方式。官方教程给出的示例会将mini数据解压到:
/data/sets/nuscenes
然后通过nuscenes-devkit进行读取。NuScenes
完整数据下载完成后,还需要根据研究方向选择trainval、test以及其他扩展数据。nuScenes官方devkit要求相关数据解压到统一的数据根目录,并保留samples、sweeps、maps和v1.0-*等目录结构。GitHub
nuScenes目录结构
一个典型的nuScenes目录可以整理为:
nuscenes/ ├── maps/ ├── samples/ │ ├── CAM_BACK/ │ ├── CAM_BACK_LEFT/ │ ├── CAM_BACK_RIGHT/ │ ├── CAM_FRONT/ │ ├── CAM_FRONT_LEFT/ │ ├── CAM_FRONT_RIGHT/ │ └── LIDAR_TOP/ ├── sweeps/ ├── v1.0-mini/ ├── v1.0-trainval/ └── v1.0-test/
samples保存关键帧传感器数据,sweeps保存中间帧数据,而v1.0-*目录主要保存数据集的元数据和标注JSON文件。GitHub
nuScenes的数据组织方式与KITTI差别很大,它不是简单通过“图片文件名 + 标签文件”建立对应关系,而是通过数据库表之间的token关联不同传感器、样本、场景和标注。
nuScenes核心数据概念
第一次使用nuScenes时,最容易困惑的是各种JSON表之间的关系。
官方教程将数据拆分为多个基本对象,包括:
-
log:一次数据采集记录。 -
scene:约20秒的驾驶片段。 -
sample:某个时间点的关键帧。 -
sample_data:某一个传感器采集的数据。 -
ego_pose:车辆自身的位置和姿态。 -
sensor:传感器定义。 -
calibrated_sensor:传感器在车辆上的标定信息。 -
instance:目标实例。 -
category:目标类别。 -
attribute:目标属性。 -
sample_annotation:某个时间点的目标标注。 -
map:地图相关数据。NuScenes
这种设计虽然比KITTI复杂,但对于多传感器时间同步和目标跟踪更加灵活。
安装nuScenes开发工具
Python环境中可以安装官方devkit:
Bashpip install nuscenes-devkit
安装完成后,可以使用下面的代码加载mini数据:
Python运行from nuscenes.nuscenes import NuScenes nusc = NuScenes( version='v1.0-mini', dataroot='/data/sets/nuscenes', verbose=True )
然后查看场景:
Python运行nusc.list_scenes()
官方教程中也采用类似方式初始化NuScenes对象,并通过SDK加载数据表和标注信息。NuScenes
如果使用的是完整数据,需要把version修改为实际下载的数据版本,例如:
Python运行nusc = NuScenes( version='v1.0-trainval', dataroot='/data/sets/nuscenes', verbose=True )
KITTI与nuScenes如何选择
两套数据集的定位并不完全相同。
| 对比项目 | KITTI | nuScenes |
|---|---|---|
| 数据特点 | 经典自动驾驶视觉与LiDAR数据 | 多传感器融合数据 |
| 典型场景 | 城市、郊区、高速 | 城市复杂交通 |
| 摄像头 | 双目为主 | 多摄像头环视 |
| LiDAR | 有 | 有 |
| Radar | 非核心数据 | 包含Radar |
| 数据组织 | 相对简单 | 数据库关联结构 |
| 3D检测 | 常用 | 常用 |
| 视觉里程计 | 很适合 | 也可研究 |
| 多传感器融合 | 支持 | 更突出 |
| 入门难度 | 相对较低 | 相对较高 |
| 适合初学者 | 较适合 | 建议先使用mini |
如果目标是学习自动驾驶数据集的基本结构、LiDAR读取、相机标定和传统3D检测流程,KITTI通常更容易上手。
如果研究重点是多摄像头、LiDAR、Radar联合感知,或者希望研究更加复杂的自动驾驶场景,nuScenes的数据组织和传感器配置会更加符合这类实验需求。
KITTI和nuScenes数据预处理注意事项
数据下载完成后,真正容易出问题的往往不是下载,而是预处理。
首先要确认数据目录。很多开源项目会在配置文件中直接写死类似:
/data/kitti /data/sets/nuscenes
如果实际路径不同,应修改配置文件中的数据根目录,而不是随意移动部分子目录。
其次要检查压缩包是否完整。KITTI不同任务需要的文件不同,不能认为下载一个压缩包就包含所有实验需要的数据。官方Benchmark页面会分别列出图像、点云、标注和开发工具等资源。CVLibs+1
nuScenes则要特别注意重复目录。多个归档文件解压到同一个根目录时,应避免覆盖已有目录。官方devkit明确要求将相关归档解压到统一目录,并保持samples、sweeps、maps和版本目录之间的完整结构。GitHub
使用数据集前检查数据完整性
可以通过简单的Python脚本检查KITTI点云文件:
Python运行from pathlib import Path import numpy as np root = Path("KITTI/training/velodyne") files = list(root.glob("*.bin")) for file in files[:5]: points = np.fromfile(file, dtype=np.float32) print(file.name, points.size // 4)
如果数据正常,每个文件的元素数量应该能够被4整除。
nuScenes则可以直接通过SDK加载:
Python运行from nuscenes.nuscenes import NuScenes nusc = NuScenes( version="v1.0-mini", dataroot="/data/sets/nuscenes", verbose=False ) print(len(nusc.scene)) print(len(nusc.sample))
官方mini数据加载后包含场景、sample、sample_data、标注等多张关联表,可以利用这些信息快速判断数据是否安装正确。NuScenes
常见下载和使用问题
1. KITTI下载页面无法直接下载
首先检查是否完成注册和邮箱激活。当前KITTI下载政策要求用户注册并说明数据使用目的。CVLibs
2. nuScenes SDK提示找不到数据
重点检查dataroot是否正确,并确认该目录下是否同时存在samples、sweeps、maps和对应的v1.0-*目录。
3. 点云和图像无法正确对应
KITTI需要检查文件编号和标定文件;nuScenes则需要通过sample、sample_data和token关系获取对应传感器数据,不能简单按照文件名排序后进行匹配。
4. 运行3D检测模型出现坐标偏移
通常需要检查坐标系、旋转角定义、长度宽度高度排列方式以及传感器标定参数。不同数据集对3D框的定义并不完全一致,直接转换标签格式很容易出现错误。
5. nuScenes完整数据太大
可以先下载v1.0-mini进行代码调试。官方教程本身就是以mini版本作为快速入门示例,确认数据读取和训练流程正常后,再切换到完整数据。NuScenes
数据集使用建议
实际开展自动驾驶算法实验时,建议先确定“任务”再决定“下载哪些数据”。
如果只是验证模型代码,优先使用KITTI的小规模子集或nuScenes mini。模型能够正常读取图像、点云和标签后,再扩展到完整训练集。
如果进行3D目标检测,应同时关注点云、标定文件和3D标注;如果进行多模态融合,还需要保证图像、LiDAR和其他传感器之间的时间与空间关系正确。
对于nuScenes,还应该尽早理解token和数据库表之间的关联。官方devkit已经提供了数据读取和可视化工具,直接基于SDK处理数据通常比自己解析大量JSON文件更加稳妥。NuScenes+1
另外,KITTI官方数据服务器在2026年9月曾进行服务器恢复,官方页面提示相关时间段内的Benchmark结果需要重新提交。因此,如果涉及论文实验、排行榜提交或数据版本复现,最好以官方当前页面公布的信息为准。CVLibs+1
对于研究人员而言,KITTI更像是自动驾驶视觉和LiDAR研究中的经典基准,而nuScenes则提供了更加完整的多传感器自动驾驶数据体系。理解两者的数据格式、坐标系、标注方式和工具链,不仅能够顺利完成数据下载,也能减少后续模型训练和评测阶段的大量数据处理问题。