Nuscenes 数据集浅析
参考:Nuscenes官网链接
注意:文中存在官网还未更新的内容,一般采用红色部分
,进行标记。
1.数据集简要介绍
nuScenes 数据集(发音为 /nuːsiːnz/)是由Motional(前身为nuTonomy)团队开发的自动驾驶公共大规模数据集。在波士顿和新加坡收集了1000个驾驶场景,这两个城市以其密集的交通和极具挑战性的驾驶环境而闻名。手动选择20秒时长的场景,以展示多样化和有趣的驾驶机动、交通状况和意外行为。收集不同大陆的数据进一步使我们能够研究计算机视觉算法泛化能力,在不同位置、天气条件、车辆类型、植被、道路标记以及左右手交通。
2019 年 3 月,我们发布了包含全部 1000 个场景的完整 nuScenes 数据集。 完整的数据集包括大约 140 万个相机图像、39 万个激光雷达扫描、140 万个毫米波雷达扫描和 4 万个关键帧中的 140 万个对象边界框。nuScenes 数据集的灵感来自开创性的 KITTI 数据集。 nuScenes 是第一个提供来自自动驾驶汽车的整个传感器套件(6 个摄像头、1 个激光雷达、5 个雷达、GPS、IMU)的数据的大规模数据集。 与 KITTI 相比,nuScenes 包含 7 倍以上的对象标注。
应对目标检测和跟踪任务,我们在整个数据集上用 2Hz 的准确 3D 边界框注释 23 个对象类别。此外,标注了对象级别的属性,例如可见性、运动和姿态。
2020 年 7 月,我们发布了 nuScenes-lidarseg。 应对激光雷达语义分割任务中,我们使用 32 个可能的语义标签为 nuScenes 的关键帧中标注每个激光雷达点。 因此,nuScenes-lidarseg 在 40,000 个点云和 1000 个场景(850 个用于训练和验证的场景,以及 150 个用于测试的场景)中包含 14 亿个标注点。
2. 数据采集
2.1 场景计划
对于 nuScenes 数据集,我们在波士顿和新加坡收集了大约 15 小时的驾驶数据。 对于完整的 nuScenes 数据集,我们发布了来自波士顿海港和新加坡 One North、皇后镇和荷兰村地区的数据。 驾驶路线经过精心挑选,以捕捉具有挑战性的场景。 我们的目标是多样化的地点、时间和天气条件。 为了平衡不同类别频率分布,我们包含了更多具有稀有类的场景(例如自行车),全部由人类专家标注。
2.2 采集车配置
组成:6 个摄像头、1 个激光雷达、5 个雷达、GPS、IMU。
为了在 LIDAR 和摄像头之间实现良好的跨模态数据对齐,当顶部 LIDAR 扫过摄像头 FOV 的中心时,会触发摄像头的曝光。图像的时间戳为曝光触发时间;而激光雷达扫描的时间戳是当前激光雷达帧实现全旋转的时间。鉴于相机的曝光时间几乎是瞬时的,这种方法通常会产生良好的数据对齐。 请注意,相机以 12Hz 运行,而 LIDAR 以 20Hz 运行。 12 次相机曝光尽可能均匀地分布在 20 次激光雷达扫描中,因此并非所有激光雷达扫描都有相应的相机帧。 将摄像头的帧速率降低到 12Hz 有助于降低感知系统的计算、带宽和存储需求。
3. 数据格式
文中描述了 nuScenes 中使用的数据库模式,由多个json文件组成。所有标注和元数据(包括校准、地图、车辆坐标等)都包含在关系数据库中。在数据库表中,每一行都可以通过其唯一的主键标记来标识。
eg. 读取数据,可以在 nusc 看到多个属性信息,具体的参考见3.x。
from nuscenes.nuscenes import NuScenesnusc = NuScenes(version='v1.0-mini', dataroot=args.root, verbose=True)
3.1 attribute 属性
属性是实例的属性,在类别保持不变的情况下可以更改。
eg. 正在停放/停止/移动的车辆,以及自行车是否有骑手。
attribute { "token": -- 唯一记录标识符. "name": -- 属性名字. "description": -- 属性描述.}
3.2 calibrated_sensor 标定的传感器
在特定车辆上校准的特定传感器(激光雷达/雷达/相机)。所有外参都是相对于自车框架给出的。所有相机图像都没有失真和校正。
calibrated_sensor { "token": -- 唯一记录标识符. "sensor_token": -- 指向传感器类型的外部键. "translation": [3] -- 坐标系平移x,y,z,单位m. "rotation": [4] -- 坐标系旋转w,x,y,z. "camera_intrinsic": [3, 3] -- 相机内存,传感器没有则为空.}
3.3 category 类别
物体类别的分类(例如车辆、人类),子类别由句号划分(例如 human.pedestrian.adult)。
category { "token": -- 唯一记录标识符. "name": -- 分类名称。 按句号划分子类别. "description": -- 类别描述. "index": -- nuScenes-lidarseg 的 .bin 标签文件中出于效率原因使用的标签的索引,该字段以前不存在.}
3.4 ego_pose 自身姿态
车辆本身在特定时间戳的姿势,相对于日志地图的全局坐标系。自身位姿 是我们论文中描述的基于激光雷达地图的定位算法的输出,定位在 x-y 平面上是二维的。
ego_pose { "token": -- 唯一记录标识符. "translation": [3] -- 坐标系平移: x, y, z. z一直为0. "rotation": [4] -- 坐标系旋转四元数: w, x, y, z. "timestamp": -- Unix 时间戳.}
3.5 instance 实例
一个对象实例,例如: 特定车辆。该表是我们观察到的所有对象实例的枚举,请注意,不会跨场景跟踪实例。
instance { "token": -- 唯一记录标识符. "category_token": -- 指向物体类别的外部键. "nbr_annotations": -- 该实例的标注数目. "first_annotation_token": -- Foreign key. Points to the first annotation of this instance. "last_annotation_token": -- Foreign key. Points to the last annotation of this instance.}
3.6 lidarseg 雷达分割
nuScenes-lidarseg 标注和与关键帧的激光雷达点云之间的映射。
lidarseg { "token": -- 唯一记录标识符. "filename": -- 包含 nuScenes-lidarseg 标签的 .bin 文件的名称。使用 numpy 以二进制格式存储的 uint8 的 numpy 数组. "sample_data_token": -- 外部关键字。 Sample_data 对应于带有 is_key_frame=True 注释的激光雷达点云. }
3.7 log 日志
数据提取内容的日志信息。
log { "token": -- 唯一记录标识符. "logfile": -- 日志文件名字. "vehicle": -- 车辆名字. "date_captured": -- 日期(YYYY-MM-DD). "location": -- 捕获日志的位置.}
3.8 map 地图
地图数据是俯视图,二进制语义掩码的数据。
map { "token": -- 唯一记录标识符.. "log_tokens": [n] -- 外部的键. "category": -- 地图类别,目前只有可行驶的表面和人行道的先验语义. "filename": -- 相对于地图掩码文件的相对路径.}
3.9 sample 样本
样本是 2 Hz 带标注的关键帧。 数据是单个 LIDAR 的一次扫描,认为该次扫描时间戳非常接近。
sample { "token": -- 唯一记录标识符. "timestamp": -- Unix 时间戳. "scene_token": -- 指向场景的外部键. "next": -- 外部键. 接下来时间的样本. 场景结尾位置为空. "prev": -- 外部键. 前一刻时间的样本. 场景开始位置为空. "data": -- 关键帧中的数据,内含有RADAR、LIDAR、CAM数据的token "anns": -- 标注框。}
注意:data
、anns
为新增属性,官方文档中省略未提 或者 暂未更新。
3.10 sample_annotation 样本标注
定义样本中所见对象位置的边界框,所有位置数据都是相对于全局坐标系给出的。
sample_annotation { "token": -- 唯一记录标识符. "sample_token": -- 外部键.注意:这指向一个样本而不是样本数据,因为注释是在样本级别完成的,考虑到所有相关的样本数据. "instance_token": -- 实例键. 此标注属于哪个对象实例,随着时间的推移,一个实例可以有多个注释. "attribute_tokens": [n] -- 属性键. 标注的属性列表,属性会随着时间而改变,所以它们属于这里,而不是在实例表中. "visibility_token": -- 可见性键. 可见性也可能随时间而改变,如果没有标注可见性,则标记为空字符串. "translation": [3] -- 包围盒中心位置: center_x, center_y, center_z. "size": [3] -- 包围盒的尺寸: width, length, height. "rotation": [4] -- 包围盒的旋转: w, x, y, z. "num_lidar_pts": -- 盒子中的激光点数. 该样本中雷达扫描识别的点数. "num_radar_pts": -- 盒子中毫米波雷达点数,该样本中毫米波雷达扫描识别的点数,这个数字是所有毫米波传感器的总和,没有过滤任何无效点. "next": -- 外部键. 下一时刻来自同一个对象实例的样本注释,如果这是此对象的最后一个注释,则为空. "prev": -- 外部键. 上一时刻来自同一个对象实例的样本注释,如果这是此对象的第一个注释,则为空. "category_name": -- 类别名称.例如如下形式:'human.pedestrian.adult'}
注意:category_name
为新增属性,官方文档中省略未提 或者 暂未更新。
3.11 sample_data 样本数据
传感器数据,例如:图像、点云或毫米波。 对于 is_key_frame=True 的 sample_data,时间戳应该非常接近它指向的样本。 对于非关键帧,sample_data 指向时间最近的样本 sample。
sample_data { "token": -- 唯一记录标识符. "sample_token": -- 样本键. 与其相联系的样本键. "ego_pose_token": -- 自运动键. "calibrated_sensor_token": -- 标定传感器键. "filename": -- 硬盘数据块的相对路径. "fileformat": -- 数据文件格式. "width": -- 图像宽(像素). "height": -- 图像高(像素). "timestamp": -- Unix 时间戳. "is_key_frame": -- 如果样本数据是关键帧则为真, 否则为假. "next": -- 下一帧外部键. 下一时刻来自同传感器的样本数据. 如果是场景结束则为空. "prev": -- 上一帧外部键. 上一时刻来自同传感器的样本数据. 如果是场景开始则为空. "sensor_modality": -- 传感器模态,如lidar "channel": -- 通道,如LIDAR_TOP}
注意:sensor_modality
、channel
为新增属性,官方文档中省略未提 或者 暂未更新。
3.12 scene 场景
场景是从日志中提取的 20 秒长的连续帧序列, 多个场景可以来自同一个日志。 请注意,物体对象身份(实例标记)不会跨场景保留。
scene { "token": -- 唯一记录标识符. "name": -- 短字符串标识符. "description": -- 场景更详尽的描述. "log_token": -- 日志键. 指向数据提取位置的日志. "nbr_samples": -- 场景中样本数量. "first_sample_token": -- 第一样本键,指向场景中的第一个样本. "last_sample_token": -- 最终样本键,指向场景中的最后一个样本.}
3.13 sensor 传感器
一种具体的传感器类型
sensor { "token": -- 唯一记录标识符. "channel": -- 传感器通道名称. "modality": {camera, lidar, radar} -- 传感器模式,支持括号中的类别.}
3.14 visibility 可见性
实例的可见性是在所有 6 个图像中可见的注释部分,分为 0-40%、40-60%、60-80% 和 80-100% 的 4 个容器。
visibility { "token": -- 唯一记录标识符. "level": -- 可见性等级. "description": -- 可见性等级描述.}