Personal Knowledge Base

A long-term research and learning notebook for posts, notes, papers, projects, and research directions.

Skip to content
Back to RiskAffordance overview

阶段二模型修改

不再改写危险场,而是训练网络想象引发事故的车辆,由物理程序重算危险场

23 min read

> 变更对象:阶段② Prior Activation(原 FiLM + Direction Routing,已验收定版,降级为 baseline 保留) > 核心变更一句话:不再训练网络去"改写危险场",而是训练网络去"想象一辆会引发事故的车",危险场由阶段①已有的物理计算程序对加入这辆车之后的场景重新算出来。

1. 为什么要改:旧设计的三个根本问题

旧方案(FiLM + Direction Routing)的工作方式是:先由阶段①跑出一张正常世界的危险地图 H,然后根据事故类型对这张图做"后加工"——FiLM 负责整体调强调弱,Direction Routing 负责按手工设定的方位原型把风险核挪到某个方向、把方向箭头硬拧过去。

这样做有三个绕不开的问题:

第一,监督信号是人画的,不是算出来的。 训练数据的制造方式是"在已有危险场上按类别贴一个人工高斯核"。这张贴上去的图案与真实路况、相对速度、碰撞时间完全脱钩——无论场景里是空旷高速还是拥堵路口,"追尾"贴的都是同一张圆形图案。网络学到的只是"类别 → 固定图案"的查表关系。

第二,智能在规则里,网络只是模仿者。 真正决定"追尾的危险区长什么样"的是人写的那套贴核规则,FiLM 和路由网络只是在蒸馏这套人写的规则。答辩时很容易被追问:这和直接规则后处理有什么本质区别?技术含量体现在哪?

第三,有治不好的已知缺陷。 侧碰(side_swipe)对文本不敏感、路口转向(intersection_turn)方向不确定,这两个缺陷的根因在于方向信息来自手工符号原型的路由,而非从场景几何中导出——补丁式的修复解决不了结构性问题。

2. 新方案的核心思想

新方案把"激活危险先验"这件事的数学本质重新想了一遍:

危险场 H 本来就是"场景运动学"的函数——阶段①的伪标签计算程序(labeler)就是这句话的实体化:给它场景里各个目标的位置和速度,它就能精确算出哪里危险、多危险、朝哪来。

那么,"让场景发生一场追尾事故"的正确操作,就不是去篡改这个函数的输出值(改场),而是去修改这个函数的输入(改场景)——在场景里放入一辆会从后面冲上来的车,然后让同一套物理程序自己算出新的危险场

由此,网络的学习任务彻底改变了:

  • 旧任务:看到"追尾"二字 → 学会在图上画一个圆形贴纸(查表,无技术含量);
  • 新任务:看懂当前路况 + 听到"追尾" → 在合适的车道位置、以合适的速度差,想象出那辆冲过来的车(需要理解语义、理解场景几何、理解运动学)。

车一旦被想象出来,剩下的事——rollout 未来 10 帧的轨迹、栅格化进场景、重新计算危险场——全部由现成的、确定性的程序完成,不需要任何新的学习。

一句话口径:旧方案直接篡改计算结果,新方案修改输入、让结果由物理规则自己算出来。把危险"演出来",而不是"画上去"。

3. 与旧设计的逐项对比

维度旧设计(FiLM + Routing)新设计(方案 A)
监督数据的制造在危险场上按类别贴人工高斯核注入虚拟危险车 → 推演轨迹 → 物理程序重算危险场
网络学什么场→场的图案改写场景+语义 → 危险代理的参数分布
危险区的形状来源人画的对称圆形模板由相对速度和碰撞时间解析决定,自然呈现沿逼近路径延展的"脊线"
与真实场景的关系完全脱钩(全局调强调弱)深度耦合:必须落在真实车道上、与场景中已有风险源按规则比大小
方向场的来源向手工方位原型硬拧逐帧指向虚拟车的真实位置,是几何的推论
时间维一张静态图10 帧完整演化过程:危险随碰撞时间压缩而逐步逼近、加浓
结果多样性一种类别一种图案同一语义可采样多种合理想象,叠加扩散随机性,天然多模态
新增训练参数百万级(FiLM + 嵌入 + 路由)同量级(一个输出低维参数分布的小网络)
冻结清单先验、labeler、扩散主干全冻结完全不变
已知缺陷side_swipe 文本聋、intersection_turn 方向不定方向由代理几何自动导出,两个缺陷在结构上消失
答辩软肋易被质疑"规则蒸馏"逻辑闭环清晰:想象代理 → 物理计算 → 场

4. 监督数据什么样

每条样本为四元组:

{ S: 真实历史占用序列 (T=10, 2, 200,200,20),nuScenes 取历史窗
  (c, text): 事故语义,9 类(DoTA 体系)+ 模板/LLM 扩写
  θ*: 危险代理真值参数(见 §3,同一样本可挂多个合法 θ*)
  (S′, H′): 反事实场景 + labeler 重算场(生成时顺带产出,免费) }

每条训练样本包含四样东西:

一是真实历史场景。 从 nuScenes 正常驾驶数据里取一段历史窗口(10 帧的占用体素序列),这就是"当前路况",原样使用,不做任何篡改。

二是事故语义。 事故类型标签(沿用 DoTA 的 9 类体系)配上文字描述,文字由模板生成加 LLM 扩写,保证表达多样性。

三是虚拟危险车的真值参数。 这辆车的全部身份信息:它是什么(轿车/卡车/行人/自行车)、出现在哪、朝哪开、开多快、怎么加减速。同一句话、同一段路况往往对应多辆都合理的车,所以一条样本可以挂多组真值参数——这是"一对多"监督,为后面的多模态打基础。

四是重算出的标准危险场。 把虚拟车放进场景、推演 10 帧后,用阶段①的 labeler 原样重算,得到新的危险场 H′。这份监督信号是"免费的"——它是物理程序的输出,不需要任何人工标注,却带有真实结构:危险区沿逼近路径延展成脊线、浓度由速度差决定、与场景中已有车辆按"谁威胁大谁显眼"的规则竞争、方向箭头逐帧指向车的真实位置。

监督信号分三层:

  1. 参数层(主力):让网络预测的车参数逼近真值参数。这是主要的学习信号,直接、稳定;
  2. 场层(免费的精确校验):让"网络想象的车经过物理程序算出的场"逼近"真值车算出的场"。这层信号通过可微分的轨迹推演链路回传,校验的是最终结果的正确性;
  3. 真实事故校准层(少量真实数据纠偏):合成数据的参数先验毕竟是人设定的,可能与真实事故分布有偏差。用 DoTA/CCD 等真实事故数据集中异常目标的逐帧轨迹,校准网络输出的参数分布。这一层顺手把项目原有的软肋——"near-miss 分布不等于事故分布"——变成了主动校准机制,答辩口径更硬。

此外还有一类旧方案根本无法表达的负样本:注入一辆车但最终避让成功(它刹车了或转向了)。此时算出的危险场呈现"先冲高、后回落"的形态,教网络区分"险情"和"事故"的边界——这正是危险可供性研究里最有价值的细粒度监督。

数据规模不成问题:生成器和已有的伪标签管线同源,可无限量合成;四千多条训练序列,每条历史窗口可以宿主多种不同的注入方案,轻松铺出数十万条配对。

5. 危险代理的参数化

虚拟车由十几个参数完整描述,分为身份、位置、运动三部分:

身份:类别(机动车/行人/自行车,决定尺寸档位和动力学模型)与尺寸(轿车/SUV/卡车 2~3 档)。

位置与朝向:在 ego 坐标系中的生成位置和车头朝向。硬性约束是必须落在可行驶区域内、朝向与所在车道方向基本一致(逆行类事故单独建类处理)。

运动:初速度、一条简单的加速度曲线(2~3 个控制点参数化,决定逼近与撞击的时序节奏)、横向偏移率(切入类事故必需,直行类为零)。

参数符号类型说明 / 合法范围
代理类别cls离散vehicle / pedestrian / cyclist(决定尺寸与动力学模型)
生成位置x, y连续ego 系,须在 drivable area / 车道内(map API 校验)
朝向yaw连续与车道方向夹角 < 30°(逆行类事故除外,单列)
初速度v₀连续0 ~ 1.6 × v_ego,行人/非机动车用类别先验
加速度/TTC 曲线a(t) 或 TTC_profile连续(低维)决定逼近/撞击时序;2~3 个控制点参数化
横向偏移率连续cut-in / side_swipe 必需,其余可为 0
尺寸l, w, h离散档按 cls 取 2~3 档(轿车/SUV/卡车)

维度合计约 10~15 维连续量 + 2 个离散量,适配 CVAE / 低维扩散头。

按事故类型设定采样先验(初始值,后续由真实事故数据校准):

  • 追尾:在 ego 正后方同车道 1540 米处生成,初速度为 ego 的 1.21.5 倍,速度差自然形成逼近;
  • 侧向切入:在相邻车道的并行位置生成,带一个横向速度剖面,切入的缓急由加速度曲线控制;
  • 路口转向:在前方路口的横向来向生成,沿弧线轨迹行驶;
  • 行人/非机动车:在道路两侧生成,朝横穿马路的方向匀速移动。

6. 可行性检查(注入前的硬性过滤)

每辆想象出来的车在进入场景前必须通过全部检查,任一不过则重新采样:

  1. 生成位置落在可行驶区域内,且与具体车道关联;
  2. 推演的全部 10 帧中,与场景里已有车辆无穿模;
  3. 轨迹全程不离开道路拓扑(路口场景允许横穿);
  4. 与 ego 的碰撞时间落在预测窗口之内——保证"事故在画面里发生";
  5. 逼近速度为正值且超过最小阈值(沿用项目现有的碰撞时间计算口径);
  6. 不遮挡、不改动 ego 本体的占用(ego 盖章逻辑原样保留);
  7. 车的类别与场景语义一致(行人不出现在封闭高速路段等);
  8. 同一样本注入多辆车时,车与车之间保持最小安全间距(串行注入防止互扰)。

7. 推理链路的工作原理

整条链路分数据生成和训练推理两种运行模式,共用同一套核心逻辑。

轨迹推演:给一辆虚拟车的全部参数,按最基础的运动学公式逐帧推算未来 10 帧的位置——每一帧根据当前速度和加速度更新位置与速度,有转向需求的沿弧线走。机动车用匀加速加转向模型,行人和自行车用匀速模型。10 帧即未来 5 秒。这是一个确定性的计算过程,没有任何学习成分。

进入场景:把推演得到的逐帧车体位置"画进"占用体素。这里设计两种模式——生成训练数据时用硬栅格化(车体占的格子就是占,精确利落);训练网络时用软栅格化(车体足迹用平缓的高斯过渡),这是为了让梯度能够穿过这一环节回传到网络的参数上,是整条链路可微的关键技巧。

重算危险场:把加入虚拟车的新场景原样交给阶段①的 labeler——同一套函数、一行不改。虚拟车的速度由它的轨迹序列直接给出,不需要重新估计。这一步产出最终的新危险场。

一致性保障(硬约束):重算所用的 labeler 必须与阶段①制作伪标签的是同一个函数,验收标准里包含专门的一致性测试——同一个场景,离线管线和在线链路两处算出的结果必须逐位一致。这保证了"学出来的先验"和"算出来的激活场"刻度相同、可以直接比较和拼接。

梯度链路:从网络输出的参数出发,经过轨迹推演、软栅格化、再到 labeler 算出危险场,损失信号的梯度沿这条链一路回传到网络。labeler 里少数不可微的环节(截断、取最大值的竞争操作)用直通估计绕过,并在工程文档中记录在案。为稳妥起见,场层损失只作辅助,参数层损失为主力。

8. 多模态 K=3~4 从哪来

一个自然的疑问是:物理程序是确定性的,给定一辆车只能算出一张场,那多样性从哪来?

答案是:确定性的是物理,随机性的是想象。 多模态有两个来源,分工明确:

第一层,语义级多样性(来自参数采样)。 "追尾"这个语义只约束"得有辆车从后面逼近",并不约束这辆车具体在哪、多快——正后方快车、侧后方慢车、近距小速度差,都是合法答案。网络学的是参数的分布而非单点,推理时从这个分布里采 K 个样本,就是 K 辆不同但都合理的车,进而得到 K 张不同的危险场。这决定了事故之间"质"的差别:谁来撞、从哪来、多快。

第二层,细节级多样性(来自扩散模型本身)。 阶段③的扩散模型每次采样都带噪声随机性,同一张危险场也能生成演化细节不同的未来——碰撞时机早一点晚一点、轨迹偏一点。这是"量"的差别。

实际运行时,K 个参数样本各配 12 次扩散采样,凑足 34 个未来后按多样性筛选即可。

这里有一个必须防的坑:如果训练数据里每条样本只有一组真值参数,普通的回归损失会把网络逼向所有合理答案的平均值——"左后方也行、右后方也行"被平均成"从正中间穿模",反而谁都不对。对策有两条,都是成熟做法:一是造数据时就让每条样本挂多组合法真值(一对多监督);二是用覆盖损失——网络一次猜 K 个,只惩罚离真值最近的那个,其余不罚,于是 K 个猜测会自然散开、分别覆盖不同的合理模式。项目现有阶段②里的覆盖损失正是同一思想,经验可以直接平移。

9. 对现有资产与计划的影响

  • 阶段③接口不变:输出仍然是标准格式的危险场三元组,已训练的阶段③ checkpoint 理论上可以复用。但要诚实指出:新危险场的分布会偏移(脊线结构取代了圆形斑块),复用前必须做一次小规模兼容性检查,确认不达标才触发小范围校准——不允许未经检查直接假设兼容;
  • 旧阶段②资产:定版配置与已验收的 checkpoint 全部封存,降级为论文的对照组——"人工规则改写 vs 物理重算"的对比实验本身就是有价值的叙事;
  • 阶段①:模型、labeler、数据管线全部不动。唯一变化是之前降级为"可选"的 ρ 背景平台修复需要升级为"必选"——因为新方案要求学出来的先验场与物理算出的场刻度一致,才能正确拼接;
  • 当前主线:阶段③的 verdict review、空间定位实验、全量训练照常推进,方案 A 以 pilot 形式并行验证,不阻塞主线。

10. 风险与应对

风险应对
虚拟车不与场景中其他车互动(无避让博弈),是简化假设主动明示为局限性;5 秒短窗口内"各开各的"近似基本成立;pilot 阶段可视化重点排查穿模与不合理逼近
网络学成"平均放法"(模式塌缩)一对多监督 + 覆盖损失(见第 8 节)
labeler 中不可微环节阻断梯度回传直通估计绕过;场层损失降权,参数层为主
人工设定的参数先验与真实事故分布有偏第三层真实事故数据校准(DoTA/CCD 轨迹匹配)
新危险场分布偏移影响阶段③复用复用前兼容性检查;必要时用小规模校准集微调条件注入层

11. 落地顺序

按项目惯例,每一步都以"测试全绿 + 可视化人工确认"作为进入下一步的分水岭:

  1. Pilot A-1(方案地基):实现虚拟车注入、硬栅格化、labeler 复用重算,产出可视化验收图——重点确认危险区呈脊线结构、方向场逐帧指向、多风险源竞争正确、无穿模;
  2. Pilot A-2:实现软栅格化、打通可微链路,做梯度健全性检查;
  3. 搭建参数分布网络,生成一对多监督数据,用覆盖损失训练;
  4. 接入真实事故数据做分布校准;
  5. K 路危险场接入阶段③,先做兼容性检查,再与旧 baseline 做对比评测。