← 课程首页 | M0 理论地基 论文深度拆解
ICCV 2023 · 华中科技大学 + 地平线

把世界画成
一堆向量

VAD: Vectorized Scene Representation for Efficient Autonomous Driving

UniAD 证明了端到端可行,但它跑不快。VAD 换掉了中间表示——不再用一格格的栅格,而是用一条条的向量。结果是快 9.3 倍,而且更安全。这是学术端到端走向量产的关键一步。

VAD-Tiny 16.8 FPS 提速 9.3× 规划误差 ↓30.1% 碰撞率 ↓29.0%
00 / 动机

UniAD 很漂亮,但它跑不动

上一篇我们花了很大篇幅讲 UniAD 的架构哲学有多好——planning-oriented、query 串联、端到端可导。但读到最后那节局限时你应该注意到了第一条:太重,跑不到实时。

具体有多重?UniAD 只有 1.8 FPS。也就是说处理一帧要半秒多。

◆ 这个数字对量产意味着什么

车速 60km/h 时,半秒钟车已经开出去 8 米多。等你算完这一帧该怎么走,车早就到了另一个位置——决策永远滞后于现实。

量产系统通常要求感知规划链路至少 10 FPS 以上。1.8 FPS 意味着 UniAD 是一篇优秀的学术论文,但不是一个可以装车的产品。

重在哪里?重在"栅格"

回想 UniAD 的中间表示:

这些都是稠密的栅格化表示——不管那一格有没有东西,都要老老实实算一遍。而真实道路上,绝大多数格子是空的。你花了 90% 的算力去确认"这里什么都没有"。

更微妙的问题是:栅格化丢失了实例级的结构信息。一条车道线在栅格图里变成了一片被点亮的像素,"它是一条连续的线、有方向、有起点终点"这些结构信息被抹掉了。规划模块拿到的是一张热力图,而不是"这里有一条向左弯的车道线"。

01 / 核心思想

从画格子到画线条

VAD 的解法一句话说完:把场景里的一切都表示成向量(矢量),而不是栅格。

栅格化表示 · UniAD 每一格都要算,空的也要算 200×200 格 × 未来 T 帧 「这是一片亮起来的像素」 结构信息丢失 矢量化表示 · VAD 只存关键点,空白处不占算力 每条线 = 一组有序点 「这是一条向左弯的车道线」 实例结构完整保留
图 1 · 两种中间表示。栅格化把车道线变成一片像素;矢量化保留"它是一条有方向的线"这个结构信息,而且只需要存几个关键点。
◆ 一个你会秒懂的比方

这就是 位图(PNG)与矢量图(SVG) 的区别。

画一条直线:位图要存下这条线经过的每一个像素;矢量图只要存起点、终点两个坐标。文件小得多,放大不失真,而且你还能直接问它"这条线的方向是什么"——因为方向是显式存在的属性,不用从像素里反推。

VAD 对驾驶场景做的,就是从 PNG 换成 SVG。

这个改动带来两个好处,论文摘要里说得很清楚:

注意第二点:VAD 不只是"为了快而换表示",换了表示之后,它解锁了一种全新的、更直接的安全约束方式。这是这篇论文最聪明的地方。

02 / 表示

场景里的东西,具体怎么变成向量

VAD 的整体流程前半段和你已经熟悉的东西一样:多帧多视角图像 → 骨干网络提特征 → 一组 BEV query 把图像特征投影到 BEV 空间。这一步就是 BEVFormer 那一套。

分岔发生在 BEV 之后。VAD 用两组 query 学习矢量化表示:

矢量化地图 · Map Query

每个 map query 负责预测一个地图实例(一条车道分隔线、一段道路边界、一个人行横道),输出形式是一组有序的点(polyline)。

这个思路直接继承自 MapTR ——那篇论文的关键洞察是:地图实例的点集具有排列不变性(一条线从左往右数还是从右往左数,是同一条线),据此可以同时预测所有地图元素,不用像早期方法那样自回归地一个个吐。

矢量化运动 · Agent Query

每个 agent query 负责一个交通参与者,输出它的属性(位置、朝向、尺寸、类别)和未来轨迹向量(多模态的候选轨迹,每条是一串未来路点)。

● 关键差异:不再需要稠密地图和后处理

论文原话的意思是:VAD 摆脱了对稠密地图和手工设计后处理的依赖。

UniAD 的占据栅格要转成规划能用的代价图,中间需要不少手工设计的转换逻辑。VAD 直接输出向量,规划模块可以直接消费,链路更短、更干净、也更容易部署——没有手工后处理,意味着没有难以量化的工程 trick,模型行为更可预测。

03 / 真正的创新

三大矢量约束:把交规写进损失函数

这一节是 VAD 的灵魂。前面讲的"矢量表示更快"只是副产品,真正的贡献是:矢量表示让你可以直接写出显式的、几何意义明确的安全约束。

先看栅格方案的局限

UniAD 的碰撞损失是"轨迹别经过高占据概率的格子"——这是在一片代价场里找低洼处。问题是:代价场是模糊的,你无法表达"距离那辆车至少保持 2 米"这种精确的几何关系,也无法表达"别越过这条边界线"这种实例级的规则。

而一旦场景是矢量的,这些就都能直接写出来了。VAD 提出了三个约束:

① 自车-他车 碰撞约束 自车轨迹与他车预测轨迹 同一时刻的距离若过近 → 惩罚 ② 越过边界约束 规划轨迹压到或越过 道路边界向量 → 惩罚 ③ 车道方向约束 车道方向 θ 规划轨迹方向与车道方向 夹角过大(逆行/斜穿) → 惩罚
图 2 · VAD 的三大矢量约束。每一个都是在向量之间做明确的几何计算——距离、是否穿越、夹角,而不是在模糊的代价场里找路。

约束一 · 自车-他车碰撞(L_col)

把规划出的自车轨迹和 MotionFormer 预测的他车轨迹向量逐时刻比对。同一时刻两者距离低于安全阈值就惩罚。

关键:这是时空对齐的比较——不是"别去那辆车现在的位置",而是"3 秒后我到那里时,它也会在那里吗"。

约束二 · 越过边界(L_bd)

规划轨迹如果压到或越过道路边界向量,就惩罚。因为边界是显式的折线,"有没有越过"是一个可以精确判定的几何问题。

约束三 · 车道方向(L_dir)

计算规划轨迹的行进方向与所在车道向量方向的夹角,夹角过大就惩罚。这直接编码了"要顺着车道开、不能逆行、不能大角度斜穿"这条交规。

注意:车道有方向这件事,只有在矢量表示里才是显式的。栅格图里一条车道线就是一片像素,没有"方向"这个属性。

● 这个转变的本质

从"在代价场里导航"变成了"满足一组几何约束"。

前者是软性的、模糊的、难以解释的;后者是明确的、可计算的、人能看懂的。当规划出问题时,你可以直接查是哪一条约束被违反了——这对量产系统的可调试性至关重要。

04 / 动手

选一条轨迹,看三个约束怎么亮起来

这个演示把上一节的三个约束跑活了。切换不同的候选轨迹,右边会实时显示哪些约束被违反、哪些满足,以及对应的损失。

BEV 场景 · 矢量化表示
三大矢量约束检查
① 自车-他车碰撞
—
② 越过道路边界
—
③ 车道方向一致性
—
总约束损失:—
◆ 玩的时候体会这一点

注意"激进超车"那条:它可能不越界、方向也对,但会在时空上撞进他车的预测轨迹。这正是约束一存在的意义——安全不是"别碰现在的障碍物",而是"别去未来会被占据的地方"。

这也解释了为什么 VAD 必须先有矢量化的运动预测,才能有这个约束——三个约束全都建立在矢量表示之上,缺了矢量化,这套约束根本写不出来。

05 / 训练

六项损失,各管一摊

VAD 的总损失由六项加权组成,结构非常清晰:

L = ω₁·L_map + ω₂·L_mot + ω₃·L_col + ω₄·L_bd + ω₅·L_dir + ω₆·L_imi

━━━ 矢量化场景学习 ━━━
L_map  地图学习    # 曼哈顿距离回归 + focal loss 分类
L_mot  运动预测    # 他车轨迹回归

━━━ 矢量化约束(VAD 的核心创新)━━━
L_col  碰撞约束    # 与他车轨迹保持安全距离
L_bd   边界约束    # 不越过道路边界
L_dir  方向约束    # 顺着车道方向开

━━━ 模仿学习 ━━━
L_imi  模仿损失    # L1 损失,向人类专家轨迹靠拢
◆ 一个值得注意的分工

L_imi 负责"像人一样开",三个约束负责"绝对不能犯的错"。

这个分工和 UniAD 的"模仿损失 + 碰撞损失"是同一个思路,但 VAD 把"硬约束"这一侧拆得更细、定义得更精确——从一个笼统的碰撞代价,变成三条各有明确几何含义的规则。

从工程角度看这是个巨大改进:每条约束的权重可以单独调。车在实车测试中如果总是压线,就调大 ω₄;如果跟车太近,就调大 ω₃。可调试、可归因——这是量产系统最看重的性质。

06 / 结果

数字说话:又快又安全

在 nuScenes 开环规划评测上,VAD 相比 UniAD 的提升是全方位的:

模型推理速度平均规划位移误差平均碰撞率
UniAD1.8 FPS1.03 m0.31%
VAD-Base4.5 FPS(2.5×)0.72 m(↓30.1%)0.22%(↓29.0%)
VAD-Tiny16.8 FPS(9.3×)0.78 m0.38%

两个版本代表两种取舍:VAD-Base 追求精度(比 UniAD 又快又准);VAD-Tiny 追求速度(快 9.3 倍,精度与 UniAD 相当)。16.8 FPS 已经进入了可以认真讨论量产的区间。

◆ 一个必须说清的细节

论文注明:VAD 的 FPS 在 RTX 3090 上测量,而 UniAD 的 FPS 在 A100 上测量。

A100 是数据中心级卡,通常比 3090 更强。所以这个对比对 VAD 而言是偏保守的——如果同卡对比,差距只会更大不会更小。

但作为读者你应该养成这个习惯:看到性能对比先看测试条件。很多论文的加速比是在不同硬件、不同 batch size、不同精度下测的,不能直接横比。这种较真的态度,面试时聊到某篇论文的数字,会显得你真的读过而不是看了摘要。

消融实验验证了什么

论文的消融专门验证了两件事:ego-agent 交互和 ego-map 交互在规划模块中都是必要的——也就是说,自车 query 必须同时和他车 query、地图 query 做注意力交互,缺一个都会掉点。这印证了 UniAD 那条"感知为预测服务、预测为规划服务"的主线在 VAD 里同样成立。

07 / 回答旧问题

你之前问过的"导航指令怎么进模型"

还记得你问过"从深圳龙岗到广州,导航算出的路线怎么和自动驾驶结合"吗?当时我讲了全局导航 → 局部坐标 → token 的转换链路。VAD 就是这套做法在学术上的标准形态。

VAD 的规划模块除了吃感知信息,还接收一个高层驾驶指令作为条件输入——通常是"直行 / 左转 / 右转"这类离散类别。

● 为什么必须有这个输入

想象车开到一个十字路口,前方畅通、左边畅通、右边也畅通。光靠感知,模型无法知道该往哪走——三个方向从安全角度看都合法。

导航指令解决的就是这个意图歧义:它不告诉车"怎么开"(那是感知和规划的事),只告诉车"往哪个方向去"。

把这条线和你已经学的串起来:

层级谁负责输出什么
全局路线高德/百度等导航服务道路级路线(走哪条路、哪个匝道)
坐标转换车端定位模块转成车身局部坐标(前方 X 米、右侧 Y 米)
驾驶指令从路线中提炼离散类别:直行/左转/右转 ← VAD 吃的就是这个
轨迹规划VAD 的规划模块未来几秒的精确路点
控制PID / MPC方向盘、油门、刹车

所以你当时那个疑问的完整答案是:导航不直接开车,它提供的是"意图"这一层的条件信号,和感知信息一起送进规划模块。VAD 用离散指令,后来的 VLA 把它编码成 token——形式在演进,但"导航负责意图、感知负责当下"这个分工没有变。

08 / 收束

六篇读完,你已经站在量产门口

回顾这条完整的技术演进链:

论文解决的核心问题留下的问题
Transformer序列建模的通用机器O(n²),长序列吃不消
ViT图像变 token需要海量数据
LSS多相机融进 BEV(几何路线)深度预测不准
BEVFormer用注意力做 BEV,含时序只有感知,没有规划
UniAD全栈端到端、为规划服务太慢(1.8 FPS)
VAD矢量化提速 + 显式安全约束仍是开环评测、仍依赖标注

一句话串起来:UniAD 证明了端到端可行,VAD 证明了端到端可以又快又安全。前者是学术里程碑,后者是通往量产的桥。

VAD 与产业的直接关系

✓ 注意作者单位

VAD 出自华中科技大学 + 地平线。地平线是国内头部的智驾芯片与方案供应商——这不是纯学术论文,是带着量产诉求做的研究。

这也解释了它为什么如此在意 FPS、为什么要把约束拆成可单独调权重的三条、为什么强调"摆脱手工后处理"。这些都是量产工程师的关切,不是刷榜研究者的关切。

你要投的"智驾算法工程化/部署"类岗位,读这篇比读纯学术论文更有共鸣——它展示的正是"怎么把算法做到能上车"的思维方式。

对你 Project 2 / 3 的直接价值

读完的自测

自测一 · 说清栅格与矢量表示的根本差异

算力(空白区域是否浪费)+ 结构信息(实例级属性是否保留)两个层面都要说到。位图 vs SVG 这个比方能帮你记牢。

自测二 · 默写三大矢量约束

碰撞、越界、方向。要能说出每一条为什么只有矢量表示才写得出来。

自测三 · 复述 VAD 相对 UniAD 的关键数字

9.3× 提速、误差 ↓30.1%、碰撞率 ↓29.0%。并记得补一句测试硬件不同的caveat——这个细节最能体现你读得细。

自测四 · 讲清导航指令在端到端里的角色

解决意图歧义,不管"怎么开"只管"往哪去"。这题连着你的实际生活场景,最好答。

按清单,接下来可以读 DriveVLM(大模型上车、快慢双系统)——它是从这套"模块化端到端"通向你最关心的 VLA / FSD v14 / 小鹏 VLA 2.0 的桥梁。到那一篇,整条线就真正接到 2026 年的量产前沿了。