1. 轨迹预测 (Trajectory Prediction):
- 轨迹预测就是根据目标(行人,车辆,运动障碍物)过去几秒的运动状态和当前的地图信息,预测出他们未来几秒(通常是 3~8 秒)最有可能的行驶路径(轨迹)。
2. 序列建模 (Sequence Modeling):
序列建模就是一种让神经网络能够理解"时间先后顺序"和"上下文因果关系"的技术。
- 在自动驾驶中的具体应用: 处理历史信息: 要预测一辆车未来去哪,你必须知道它过去 3 秒是怎么开的(速度、加速度、方向盘转角)。这一长串连续的时间数据,就是一个"序列"
大厂如何分析 Badcase?
当测试车在路上发生了一次人工接管(Takeover),或者在仿真测试中发生了一次碰撞,这就产生了一个 Badcase。大厂的分析通常遵循以下流程:
1. 场景重现与链路归因
-
查看数据与特征: 工程师会调出那一刻所有的传感器数据(图像、点云)、模型中间层特征(如 BEV 特征图)以及规控模块的决策日志。
-
模块级"甩锅"定位: 到底是哪一步出了问题?
-
传感器异常? (镜头被泥巴挡了,导致该区域特征缺失)
-
感知(Perception)漏检? (比如 BEV 网络没把那辆黑色的异形车识别出来)
-
预测(Prediction)错误? (感知到了这辆车,但轨迹预测模块认为它会直行,结果它加塞了)
-
规控(Planning)保守? (感知预测都对,但控制策略太怂,导致无故急刹)
-
2. 标签化与聚类(Clustering)
-
孤立地看一个 Badcase 是没有意义的。我们给 Badcase 打上精细的标签(如:
夜间、雨天、低光照、截断车辆、大曲率弯道)。 -
系统会将近期所有的 Badcase 进行聚类分析。如果发现"夜间无路灯情况下的行人漏检"占了 30%,这就成了下个版本必须死磕的 Top Issue。
二、 分析完之后,如何驱动模型快速迭代?
找到了问题(比如:模型不认识一种奇形的清扫车),最笨的办法是让工程师去改模型代码结构,而最有效、最符合大厂"端到端"思维的做法是:用数据去喂熟它(Data-driven)。
1. 定向数据挖掘(Targeted Data Mining)
-
大厂有海量的、未标注的日常行驶数据(Data Lake)。
-
系统会根据 Badcase 的特征(例如提取那辆清扫车的图像特征向量),在海量数据库里进行相似性检索。从几百万公里的数据中,捞出 10,000 张包含类似清扫车、或者类似光照条件的场景数据。
2. 自动化标注(Auto-Labeling)
- 捞出来的数据靠人工标注太慢。大厂会用极其庞大、运行在云端算力上的大模型(Teacher Model / 离线大模型)对这批数据进行自动化标注,生成高质量的标签。然后人工只需做少量抽检。
3. 定向微调与难例挖掘(Hard Example Mining / Finetuning)
- 将这批带着新标签的"困难样本"喂给车端的小模型(Student Model)进行重新训练。
定向微调的具体操作步
第一步:海量捞数据(Mining) 发现"清扫车"识别不好后,利用数据检索系统,从千万公里的历史数据集中捞出几千上万张包含清扫车的图片或视频片段,并进行高精度的标注。
第二步:调配"混合数据集"(Mix Data) 这是最关键的一步。 工程师绝对不敢只把"清扫车"的数据喂给模型。如果只学清扫车,模型就会患上"灾难性遗忘"(Catastrophic Forgetting)------它终于认识清扫车了,但转头就把普通的家用小轿车全给忘了。 因此,需要按比例调配数据,比如:
70% 的清扫车难例数据 + 30% 的全场景随机通用数据(Replay Buffer)。第三步:冻结与训练(Freeze & Train) 在训练时,为了防止破坏模型已经学好的通用知识,通常不会让整个网络的参数都参与更新。工程师可能会:
降低学习率(Learning Rate): 用极小的步伐去修改参数,防止步子太大扯到"原有的知识"。
冻结底层,只调高层: 把网络中负责提取基础特征(如边缘、颜色)的底层网络"锁死"(Freeze),只开放负责最终分类和判断的几层网络让它重新学习。
调整损失函数权重(Loss Weighting): 告诉模型,"如果你这次再认错清扫车,扣分加倍(惩罚更重)"。
4. 回归测试(Regression Testing)
-
定向测试: 跑当初那个报错的 Badcase,看现在能不能认出来、能不能刹住车。
全量回归: 跑几十万个历史标准测试集,确保模型没有"学了新的,忘了旧的"(防止灾难性遗忘)。
-
测试通过,模型打包 OTA 上车。整个过程在大厂可能只需要以"周"甚至"天"为单位运转。
打通视觉编码、时序融合、轨迹解码的全链路:
1. 视觉编码 (Visual Encoding):系统的"眼睛"
-
输入: 车辆周围多个摄像头实时拍下的 2D 原始图像(多视角透视图)。
-
操作: 这一步使用强大的骨干网络(如 ResNet 或 Swin Transformer)从图像中提取出高维特征。通常,在这个阶段也会完成我们之前讨论过的 2D 到 3D/BEV 视角的转换。
-
结果: 网络"看懂"了当前这一瞬间的静态画面,知道哪里有车、哪里是路。
2. 时序融合 (Temporal Fusion):系统的"短期记忆"
-
痛点: 单凭一张静态的照片,你无法知道一辆车有多快,也无法判断它是在加速还是刹车。
-
操作: 这一步就是将"当前的视觉特征"与"过去几秒钟的历史特征"结合起来。就像我们在 BEVFormer 中聊过的"时间注意力机制",网络会去对比过去和现在的数据。
-
结果: 引入了时间(T)维度后,原本静态的 3D 空间变成了动态的 4D 空间(X, Y, Z, T)。网络获得了感知物体速度、加速度和运动趋势的能力。
3. 轨迹解码 (Trajectory Decoding):系统的"预判与决策"
-
操作: 拿着前面已经提取好的、既包含空间位置又包含运动趋势的特征(Spatio-Temporal Features),网络最后要做的就是"输出结果"了。这里通常会用到 Transformer 的 Decoder 结构。
-
结果: 它不再输出简单的"边界框",而是直接预测并输出一条条未来的行驶轨迹(一系列未来的 X, Y 坐标点)。这不仅包括预测周围其他车辆未来 3~5 秒会怎么走,甚至可以直接输出自车(Ego-vehicle)应该走的规划路线。
💡 "打通全链路"的终极意义
在 JD 中强调"打通"(Joint-training / End-to-End),意味着这家公司希望你不只是一个懂单个模块的人。
-
传统做法的弊端: 感知做错了一点,误差就会放大传递给预测,预测再放大传给规控,导致信息损耗严重(所谓的信息级联误差)。
-
全链路的优势: 当这三步在一个网络里打通后,如果最终输出的车辆轨迹预测错了,误差信号(Loss)可以直接从轨迹端反向传播(Backpropagation),一路越过时序融合,直接去更新最前端视觉摄像头的特征提取权重。这种"牵一发而动全身"的联合优化,能极大提升自动驾驶系统应对复杂真实场景的上限。