读论文-UniAD :端到端自动驾驶的第一个全栈 Transformer
论文:Planning-oriented Autonomous DrivingarXiv:2212.10156(CVPR 2023 Best Paper)单位:上海 AI Lab OpenDriveLab / OpenGVLab(胡轶寒、杨家祺、陈立共一,李弘扬、陈立通讯)代码:github.com/OpenDriveLab/UniAD摘要
UniAD 是端到端自动驾驶的一个分水岭工作——在此之前,感知、预测、规划要么是独立模型串行(误差累积、目标不一致),要么是多任务共享 backbone 但各管各的头。UniAD 第一次把五大任务六子项(3D 检测跟踪、在线建图、轨迹预测、占据栅格、规划)塞进一个 Transformer 里,用统一 Query 接口贯穿,明确以"规划"为最终优化目标而非感知指标。BEVFormer 做 BEV 编码,两阶段训练(先训感知 Track+Map,再端到端训全栈)。nuScenes 开环 1s/2s/3s L2 0.48/0.96/1.65,Avg 1.03,碰撞率 Avg 0.31%,所有子任务同时刷 SOTA。NAVSIM 上 PDMS 83.4。一、动机:模块化那套的天花板
工业界主流还是"感知(检测+跟踪+建图)→ 预测(轨迹+ occupancy)→ 规划"独立模型串行,优点是稳、可解释、各模块可单独迭代,缺点是:优化目标不一致:检测追 mAP、跟踪追 MOTA、规划追 L2,各管各的,没人直接对"开得好"负责;误差累积:检测漏一个遮挡车 → 预测没这号人 → 规划撞上去,上游错下游没机会改;特征不可复用:各模块特征各存各的,agent 交互、agent-map 交互没法全局建模。多任务共享 backbone 是另一种解法(如 HDMapNet + PGP 拼一起),但头还是分开的,任务间没真正通信。UniAD 的提问方式是:倒过来——以规划为终极目标,重新排感知/预测任务的优先级,让它们都朝"帮规划"使劲。二、六大模块用 Query 串起来
UniAD 的 pipeline:多相机图像 → BEVFormer 提 BEV 特征(时序可融 5 帧 / 3 帧,两阶段不一样)→四个基于 Transformer Decoder 的模块级联,每个模块输出一组 Query,下一级把上一级 Query 当输入接着算。所有模块用统一 Query 接口通信,避免特征错位。① Track(检测 + 跟踪)
感知动态元素。参考 MOTR 思路,用自主更新的 object query 做 3D 检测 + 帧间跟踪,解决了传统 3D MOT 不可导、没法端到端训的问题。输出是一组 agent query,带位置、速度、类别。② Map(在线建图)
感知静态元素(车道线、人行横道、路口等)。参考 Panoptic SegFormer,做实例级地图预测,输出 map query,每条线/每个实例一个 query。Track 和 Map 先训(Stage 1),给后面稳初始化。③ Motion(轨迹预测)
预测模块第一块。输入 Track 的 agent query + Map 的 map query,建模三种交互:agent-agent、agent-map、agent-goal(目标点)。每个 agent query 解码出多条候选轨迹(K=6 条模式),对应不同驾驶意图。④ Occ(占据栅格预测)
预测模块第二块。短时序(0.5s/1s/2s)全场景 BEV 占据,既有场景级语义(哪块被占了),也有实例级占据(哪辆车占哪块)——后者给规划用,前者给全局避障用。⑤ Plan(规划)
最终目标模块,吃前面所有 Query。三个设计点:运动轨迹当先验:Motion 输出的 K 条候选轨迹先过一遍,缩小搜索空间;BEV 注意力按未来命令分:左转/右转/直行/跟车,不同命令对 BEV 特征的注意力区域不一样(左转盯对向左转车+非机动车);Occupancy 碰撞优化:规划出的粗轨迹,用 Occ 头做碰撞约束后修正,相当于网络内部嵌了个轻量碰撞检查。📌 五任务六子项的叫法:论文和上海 AI Lab 官网口径是"三大类主任务(感知/预测/规划)六小类子项",OpenDriveLab 报告里也常说"五大任务"——Track、Map、Motion、Occ、Plan 五个模块,Track 里含检测+跟踪俩子项、Map 里含建图一个、Motion 一个、Occ 一个、Plan 一个,合计六子项。笔记里按"五大任务六子项"最稳。三、两阶段训练
端到端一把训五大任务梯度会打架,UniAD 拆成:Stage 1:只训 Track + Map(感知),BEV 时序 queue=5 帧,拿到稳的感知初始化;Stage 2:Track/Map/Motion/Occ/Plan 全栈一起训,BEV 时序 queue=3 帧,感知那块权重从 Stage 1 继承、可微调。这种设计后来被 VAD、SparseDrive 都沿用——"先感知后全栈"基本成了端到端 CNN/Transformer 派的标配训法。四、实验要点
nuScenes 开环(UniAD-B,ResNet101 backbone,官方 GitHub 给的数):指标1s2s3sAvgL2 (m)0.480.961.651.03Col (%)0.050.170.710.31同期纯视觉端到端里是第一档,且纯图像输入的规划成绩压过了当时部分 LiDAR 输入的方案——这点论文里特意提了。子任务 SOTA 全刷:Track AMOTA 0.363(Stage 2)、Map IoU-lane 0.313、Motion minADE 0.705、Occ IoU-near 63.7——五大任务在同一网络里同时刷 SOTA,是它拿 BP 的关键论据。NAVSIM(后来补的评测,GitHub v2.0 加的):PDMS83.4(NC 97.8 / DAC 91.9 / TTC 92.9 / Comf 100 / EP 78.8),R34 backbone。消融:任一切掉 Track/Map/Motion/Occ 任一个,规划 L2 和碰撞率都涨——证明"全栈一起训、互相贡献"不是口号,是能刷出点的。五、对国内端到端演进的参照
VAD(Vectorized AD,Shanghai AI Lab 同团队)→ 把 BEV 栅格换成 vectorized 表示,规划 L2 压到 0.41/0.70/1.05,但碰撞率 0.38% 没压住;SparseDrive(Shanghai AI Lab 同团队)→ 用稀疏 Query 替稠密 BEV,L2 0.43/0.67/1.01,碰撞率 0.31%,速度和稀疏度都更友好;DriveVLM / DriveVA / X-Foresight那波是 VLA 方向,不在这条 Transformer 派里,但 UniAD 的"全栈 Query 贯穿"思路被 VAD→SparseDrive 继承了。UniAD 真正的遗产不是 1.03 那个 L2 数(后来 VAD/SparseDrive/VLGA 都压下去了),是"以规划为终极目标重排感知预测优先级 + 统一 Query 接口 + 两阶段训法"这套范式。上海 AI Lab OpenDriveLab 这条线(李弘扬组→陈立→胡轶寒/杨家祺)从 UniAD→VAD→SparseDrive 一路是连贯的,国内做端到端的主机厂(小米 DriveVA 虽走 VLA 但也参考了全栈 Query 思路、小鹏 X-Foresight、理想 SGDrive)基本都绕不开这组对照