NAVSIM 数据集:.pkl、log、scene、frame、sample 概念关系详解
下面是一篇可以直接复制到 CSDN 的 Markdown 版本,已经把概念、层级、.pkl、log_name、scene_name、scene_token、token、以及“业界一个 scene 是否就是一个训练样本”都整理进去了。NAVSIM / OpenScene 中.pkl、log、scene、frame、sample 的关系详解在理解 NAVSIM / OpenScene 数据结构时,经常会看到类似下面这样的名字:log-0060-scene-0001很多人会疑惑:0060 是什么? 0001 是什么? 它和 .pkl 文件是什么关系? 一个 scene 是不是就是一个训练样本? 同一个 log 下的不同 scene 会不会落在不同 .pkl 文件中?本文把这些概念系统整理一遍。1. 先看一个典型例子假设数据里有一个.pkl文件:2021.10.06.17.43.07_veh-28_00508_00877.pkl这个文件名可以拆成:2021.10.06.17.43.07 采集时间 veh-28 采集车编号 00508_00877 该片段的起止帧范围 .pkl pickle 格式文件读取这个.pkl后,里面某一帧可能包含类似字段:{"frame_idx":0,"log_name":"2021.10.06.17.43.07_veh-28_00508_00877","scene_name":"log-0060-scene-0001","log_token":"6819dc1e716f5a98","scene_token":"fb07ded137de59eb","token":"...",}这里最容易混淆的是:log_name = 真实日志文件名,通常等于 .pkl 文件名去掉 .pkl scene_name = 数据集内部组织出来的场景名,例如 log-0060-scene-0001也就是说:.pkl 文件名 / log_name和:scene_name = log-0060-scene-0001不是同一个东西。2.log-0060-scene-0001怎么拆解?可以把它拆成三层:log-0060-scene-0001 │ │ │ │ │ │ │ └── 0001:这个 log 下面的第 1 个 scene 片段 │ │ └──────── scene:场景片段 │ └────────────── 0060:OpenScene / 数据集内部给某个 log 编的短编号 └────────────────── log:日志 / 行车记录级别所以:log-0060-scene-0001可以读作:第 0060 个 log 下面的第 0001 个 scene其中:0060 表示属于哪个 log 0001 表示这个 log 下的第几个 scene它们是父子关系,不是并列关系。log-0060 ├── scene-0001 ├── scene-0002 ├── scene-0003 └── ...3.0060是什么?0060是scene_name命名体系里的 log 编号。它不是下面这些东西:不是 veh-28 不是 frame_idx 不是 00508 不是 00877 不是 timestamp 不是 .pkl 文件名的一部分它更像是 OpenScene / 数据集整理阶段给某个底层 log 分配的一个简短编号。例如:log-0060可以理解为:第 0060 号 log / 日志分组而这个log-0060在某份数据中可能对应真实日志名:2021.10.06.17.43.07_veh-28_00508_00877注意,这个映射不是从字符串本身直接看出来的,而是要从.pkl中的字段关系看出来,例如同一帧中同时存在:"log_name":"2021.10.06.17.43.07_veh-28_00508_00877""scene_name":"log-0060-scene-0001""log_token":"6819dc1e716f5a98""scene_token":"fb07ded137de59eb"这说明:log_name 和 scene_name 是两个不同层级的标识4.0001是什么?0001是log-0060下面的第一个 scene 片段。如果同一个log-0060下还有其他场景,理论上可能出现:log-0060-scene-0001 log-0060-scene-0002 log-0060-scene-0003 ...这些可以理解为:同一个 log 编号下,被切出来的不同驾驶场景片段完整层级可以画成:OpenScene / NAVSIM 数据集 └── log-0060 ├── scene-0001 │ ├── frame 0 │ ├── frame 1 │ └── ... │ ├── scene-0002 │ ├── frame 0 │ ├── frame 1 │ └── ... │ └── scene-0003 ├── frame 0 ├── frame 1 └── ...5..pkl文件是什么?在 NAVSIM 的navsim_logs/split/目录中,一个.pkl文件通常就是一个 log pickle 文件。例如:navsim_logs/mini/ ├── 2021.10.06.17.43.07_veh-28_00508_00877.pkl ├── 另一个_log_name.pkl └── ...其中:2021.10.06.17.43.07_veh-28_00508_00877.pkl通常对应:log_name="2021.10.06.17.43.07_veh-28_00508_00877"也就是:.pkl 文件名去掉 .pkl 后的字符串所以在 NAVSIM 的正常数据组织里,可以粗略理解为:一个 .pkl 文件 ≈ 一个 log_name 对应的 log 文件但是要注意:一个 .pkl 文件不等于一个 scene更准确的层级是:一个 .pkl 文件 ≈ 一个 log_name ≈ 一段日志片段 ≈ 很多连续 frame 的列表6..pkl里面通常是什么结构?很多初学者会误以为.pkl里面是一个 dict。但在 NAVSIM / OpenScene 这类数据中,它通常是一个列表:scene_dict_list=pickle.load(open(pkl_path,"rb"))也就是:scene_dict_list ├── frame_dict_0 ├── frame_dict_1 ├── frame_dict_2 ├── ... └── frame_dict_N每一个元素是某一帧的字典,里面包含:log_name scene_name log_token scene_token token ego_status annotations map_location ...可以类比为:.pkl 文件 ≈ 一段长视频文件 frame ≈ 视频里的某一帧7. scene 是什么?在自动驾驶数据集中,scene 通常表示:从一段长日志中切出来的一个短时驾驶场景片段它包含一段连续帧,用来描述自车和周围环境在某个时间窗口内的状态。可以类比为:.pkl 文件 ≈ 一段长视频 scene ≈ 长视频里切出来的一个短片段 frame ≈ 短片段中的某一帧所以三者关系是:.pkl / log └── scene └── frame或者:一个 log 里面可以有多个 scene 一个 scene 里面可以有多个 frame 一个 frame 是某一个具体时刻8.scene_name和log_name的区别这是非常重要的一点。例如同一帧中可能有:log_name="2021.10.06.17.43.07_veh-28_00508_00877"scene_name="log-0060-scene-0001"它们含义不同:字段含义作用log_name真实日志文件名,通常等于.pkl文件名去掉.pkl定位原始 log picklescene_name数据集内部的场景片段名