跳转到内容

nuScenes 数据模型

类型 笔记 · 更新 2026-07-14

标签 autonomous-driving · nuscenes

所属 自动驾驶数据集、基准与评测

nuScenes 不是按“一个时间点一个完整文件夹”组织,而是把原始传感器文件与 token 关联的元数据表分开保存。sample 表示 2 Hz 标注关键时刻,sample_data 表示某个传感器的一次实际采集;二者不能当作同一个概念。[@caesar2020nuscenes]

scene
-> first_sample_token -> sample <-> prev / next
^
+-- sample_data.sample_token
| -> calibrated_sensor -> sensor
| -> ego_pose
+-- sample_annotation.sample_token
<-> prev / next
-> instance -> category
  • scene 是约 20 秒片段,使用首尾 token 进入 sample 链。
  • 原始 sample.json 只保存场景、时间戳和前后 sample 等字段。官方 devkit 建立反向索引后,才在内存中的 sample 记录上增加按 channel 访问的 data 和 annotation token 列表 anns
  • sample_data 保存自己的时间戳、文件路径、keyframe 标志、前后帧、标定和自车位姿引用。不同传感器不是严格同时曝光,坐标变换必须使用各自记录。
  • sample_annotation 保存全局坐标系中的 3D box、属性、点数和前后标注 token。它不直接保存类别名称或速度;类别经 instance -> category 获取,速度通常由相邻标注和时间差估计。

samples/ 保存关键帧对应的传感器文件,sweeps/ 保存关键帧之间的中间采集。annotation 关联 sample,并不意味着每个 sweep 都有独立人工 3D 标注。

原始 LiDAR .pcd.bin 按每点 5 个 float32 排列;官方和下游加载器常 reshape 为 (-1, 5) 后选择所需维度。不能把文件直接描述成只有 4 个 float32。雷达文件是 PCD,相机文件是 JPEG。

传感器观测通常按以下链路转换:

sensor frame
-- calibrated_sensor --> ego frame at sensor timestamp
-- ego_pose ----------> global frame

从历史 sweep 聚合到当前帧时,需要分别使用历史与当前的标定和 ego pose,不能只套用当前关键帧外参。相机投影还需要相机内参,并正确处理图像增强后的投影矩阵。

  • 核心数据包的 map 表引用栅格 semantic prior;论文中的矢量地图扩展包含更丰富的道路语义层。
  • CAN bus 是独立扩展资源,不应因为核心元数据包含 ego_pose 就假定本机已经具备规划路线、转角或车辆监控消息。
  • lidarseg、panoptic 和 prediction 等任务资源也有独立版本与下载条件。
  • 23 个标注类别不等于检测 benchmark 的最终类别集合。
  • sample_annotation 没有 velocitycategory_token 字段。
  • 示例 JSON 中格式正确不代表 token、路径和值来自真实数据;构造示例必须明确标注。
  • mini 能验证 schema、dataloader 和前向链路,不能支撑正式 benchmark 结论。
  • nuScenes 文献笔记
  • 本机 nuScenes mini 指南(内部项目资料)
  • 自动驾驶数据集与评测矩阵(内部项目资料)
日期 变化 证据或原因
2026-07-14 从原始介绍稿提炼并重建数据关系 使用官方论文、实际 mini JSON 与本地代码加载方式交叉核验