NAVSIM 中scene_name、Scene、训练 sample 与filtered_scenes的关系总结
1. 核心结论
在 NAVSIM 的语境下,一个scene_name下包含的所有帧,并不一定就是一个训练 sample。
更准确地说:
scene_name 的所有帧 ≠ 一个 NAVSIM 训练 sample NAVSIM Scene 对象 ≈ 一个训练 / 评测 sampleNAVSIM 中真正的训练 sample,是由:
SceneLoader + SceneFilter从 log 中的连续帧序列里切出来的一个固定长度窗口,并进一步封装成 NAVSIM 的Scene对象。
源码中Scenedataclass 的语义就是:
single sample in NAVSIM因此,理解 NAVSIM 数据组织时,要区分:
原始数据里的 scene_name NAVSIM 源码里的 Scene 对象这两个概念不是同一个层级。
2.scene_name是什么?
原始数据中的每一帧通常会带有字段:
scene_name="log-0060-scene-0001"它表示:
当前 frame 属于 OpenScene / 原始数据中的哪个场景片段例如一个 log 里可能有如下帧:
frame 0 -> scene_name = log-0060-scene-0001 frame 1 -> scene_name = log-0060-scene-0001 frame 2 -> scene_name = log-0060-scene-0001 ... frame 20 -> scene_name = log-0060-scene-0002因此,scene_name更像是原始数据组织层面的场景片段 ID。
它不是 NAVSIM 训练 sample 的直接索引。
3. NAVSIM 的Scene是什么?
NAVSIM 源码中有一个Scenedataclass,通常包含:
scene_metadata map_api frames其中:
frames = 一段连续帧序列这段帧序列描述了:
自车状态 周围环境状态 历史信息 未来监督信息在 NAVSIM 语境下,一个Scene对象通常就对应一个训练或评测 sample。
也就是说:
NAVSIM Scene 对象 = SceneFilter 切出来的固定长度 frame window = Dataset 每次 __getitem__ 使用的基本样本单位4. NAVSIM 训练 sample 是如何生成的?
NAVSIM 不是简单地把同一个scene_name下的所有帧打包成一个 sample。
它的生成逻辑是:
logs / .pkl 文件 ↓ 读取 scene_dict_list ↓ SceneFilter 按固定长度切窗口 ↓ 得到 frame_list ↓ 过滤不合格窗口 ↓ 用当前帧 token 作为 key ↓ 保存到 filtered_scenes ↓ SceneLoader 构造 Scene 对象 ↓ Dataset 生成 feature / target所以实际的 sample 单位是:
一个固定长度的 frame_list而不是:
一个 scene_name 下的全部 frame5.filtered_scenes是什么?
在navsim/common/dataloader.py中,filtered_scenes本质上是一个字典:
filtered_scenes[token]=frame_list它的含义是:
key = 当前帧 / initial frame 的 token value = 以这个 token 为规划起点的一段固定长度 frame_list所以它不是:
filtered_scenes[scene_name] = 该 scene_name 下所有帧而是:
filtered_scenes[current_frame_token] = 一个 NAVSIM sample 对应的帧窗口6.filter_scenes()的核心逻辑
核心代码逻辑如下:
forframe_listinsplit_list(scene_dict_list,scene_filter.num_frames,scene_filter.frame_interval):iflen(frame_list)<scene_filter.num_frames:continueifscene_filter.has_routeandlen(frame_list[scene_filter