VAD / VADv2: From Vectorized End-to-End Driving to Probabilistic Planning

Task: End-to-End Autonomous Driving (Perception → Planning)
Method: Vectorized Scene Representation + Probabilistic Planning (Trajectory Vocabulary)
Venue: ICCV 2023 (VAD) / arXiv 2024 (VADv2)
Year: 2023–2024
Paper: https://arxiv.org/abs/2303.12077 (VAD) / https://arxiv.org/abs/2402.13243 (VADv2)
Code: https://github.com/hustvl/VAD

1. 摘要

VAD(ICCV 2023)与 VADv2(arXiv 2024)由华中科技大学 + 地平线团队提出,是端到端自动驾驶在 UniAD 之后最关键的两步演进:**把感知-规划全链路从”BEV 栅格 + 多任务级联 + 单轨迹回归”重塑为”全向量化场景 + 概率分布规划”**。

  • VADMapTR + Planning 的设计哲学,把地图、交通参与者、自车都表示为 vector query,在 nuScenes 开环上把 avg L2 从 UniAD 的 1.03 m 降到 0.72 m(−30.1%)、avg Col 从 0.31% 降到 0.22%(−29.0%),推理速度 +2.5×。Planning Head 仅占 5.7% 推理时间。
  • VADv2 进一步把”回归一条轨迹”换成”在 4096 条轨迹词汇表上学习 $p(a|o)$ 概率分布”,并用 Probabilistic Field(NeRF 式位置编码 + Transformer 打分头)建模动作不确定性。在 CARLA Town05 Long benchmark 上把 Driving Score 从 SOTA 的 76.1 抬到 85.1(+9.0)

核心论点:端到端规划不该被建模成”环境 → 唯一动作”的确定性映射——真实驾驶充满歧义和多模态选择。VAD 用向量化把约束注入设计、VADv2 用概率分布把不确定性注入学习,二者合起来定义了”评分派”端到端规划的范式基线(DiffusionDrive 是其”生成派”对照)。

2. 问题与动机

方法 痛点
模块化 pipeline(感知→检测→跟踪→预测→规划→控制) 信息瓶颈、误差累积、模块耦合复杂
UniAD 多任务全栈级联(含 tracking / occupancy),栅格 BEV 重,planning 仍是单轨迹回归(avg L2 1.03 m)
VAD 自身(v1) 仍是确定性回归——非凸可行解空间下倾向输出”中间解”或最频繁模式(停车 / 直行),歧义场景失败

核心痛点(VAD → VADv2 两步走):

  1. 表示太重:dense BEV + tracking + occupancy 让端到端方案推理慢且工程复杂;
  2. 决策太窄:单轨迹回归无法表达”直行 or 变道”这类多模态合理动作;
  3. 约束太隐式:纯模仿学习缺少显式安全约束(碰撞 / 边界 / 车道方向)。

3. 核心洞察

洞察 1(VAD):向量化场景 = 轻量化 + 显式约束

UniAD 的 dense BEV + occupancy 既贵又难直接表达”自车 vs 第 i 个 agent 的距离”这类几何约束。VAD 把场景全部 vector 化:

  • map vector:100 个 map query × 20 个点(沿用 MapTR 的分层查询设计);
  • agent vector:300 个 agent query → 多模态未来轨迹;
  • ego vector:1 个 ego query → 自车未来 $T_f$ 步轨迹。

显式约束直接写成 loss:

$$\mathcal{L}_{col}^{i,t} = \begin{cases} \delta_i - d^i_{a,t}, & d^i_{a,t} < \delta_i \\ 0, & \text{otherwise} \end{cases}$$ $$\mathcal{L}_{dir} = \frac{1}{T_f}\sum_{t=1}^{T_f} F_{\text{ang}}(\hat{v}^m_t,\ \hat{v}^{ego}_t)$$

三项约束(碰撞 / 越界 / 车道方向)累加,让规划在训练时就被几何”硬”约束推开危险区。消融:栅格化 map 0.74 m / 0.39% Col → 向量化 map 0.72 m / 0.22% Col,碰撞率近半。

洞察 2(VAD):ego query 通过 Transformer 隐式吸收场景

Planning Head 只是一个 MLP,但其输入 ego query 经过两步 Transformer 交互:

$$Q'_{ego} = \text{Cross-Attn}(Q_{ego},\ \{Q_{agent}\})$$ $$Q''_{ego} = \text{Cross-Attn}(Q'_{ego},\ \{Q_{map}\})$$

最终轨迹由 $[Q’{ego}, Q’’{ego}, s_{ego}, \text{cmd}]$ 通过 MLP 输出。这里”隐式(attention 学习)+ 显式(vector loss)”是 VAD 最优雅的设计——前者管”理解”、后者管”安全”。

洞察 3(VADv2):把规划建模为 $p(a|o)$ 概率分布,不再回归

VADv2 的论点直接而尖锐:环境到动作根本不存在确定性映射,强行回归会输出”平均解”。把规划改造为概率分布:

  1. Trajectory Vocabulary:从演示数据用 furthest-trajectory sampling 离线采样 $N = 4096$ 条代表性轨迹,每条 $a = (x_1, y_1, \ldots, x_T, y_T)$;
  2. Probabilistic Field:用 NeRF 式位置编码 $\Gamma$ 把每条轨迹映射到 embedding 空间
$$E(a) = \text{Cat}[\Gamma(x_1), \Gamma(y_1), \ldots, \Gamma(x_T), \Gamma(y_T)]$$ $$\Gamma(p) = \text{Cat}\big[\gamma(p / 2^0),\ \gamma(p / 2^1),\ \ldots,\ \gamma(p / 2^{2L-1})\big]$$
  1. Scoring Head:所有轨迹与场景 token 一起进 Transformer,输出每条轨迹的概率
$$p(a) = \text{MLP}\big(\text{Transformer}(E(a),\ E_{env}) + E_{navi} + E_{state}\big)$$

训练用 KL 散度把预测分布与”GT 为正、其余按距离加权”的目标分布对齐。消融最有冲击力:去掉 Distribution Loss 时 1 s L2 从 0.082 m 暴涨到 1.415 m(17×),证明概率建模是 v2 的本质,而不是装饰。

三个洞察的递进关系

  1. 表示(VAD):向量化让场景轻量化、约束可显式书写;
  2. 交互(VAD):ego query 通过 attention 隐式吸收 agent / map 信息;
  3. 决策(VADv2):把”回归一条”换成”在词汇表上分布建模”,捕捉真实驾驶的多模态。

要记住的 3 个数字

  • avg L2 0.72 m / Col 0.22% / 4.5 FPS(VAD-Base):vs UniAD 1.03 / 0.31% / 1.8 FPS,−30% L2 + 2.5× speed
  • DS 85.1 vs 76.1(VADv2 vs DriveMLM, CARLA Town05 Long):概率规划在闭环上的纯增益;
  • 去掉 Distribution Loss → L2 ↑ 17×:概率分布而非词汇表是 VADv2 的真正灵魂。

4. 方法设计

4.1 整体架构

VAD:

$$\text{6 cams} \xrightarrow{\text{R50}} \text{PV} \xrightarrow{\text{BEV Encoder}} \text{BEV} \to \begin{cases} \text{Map Query (100×20)} \ \text{Agent Query (300, multi-mode)} \ \text{Ego Query (1)} \end{cases} \xrightarrow{\text{Cross-Attn ×2}} \text{Planning Head} \to \tau_{ego}$$

VADv2 在 VAD 基础上把 Planning Head 换成 Probabilistic Planning:

$${\text{Map / Agent / Traffic / Image / Navi / State tokens}} + {a_i}_{i=1}^{4096} \to \text{Scoring Head} \to p(a_i | o)$$

VAD 架构图

图 1:VAD 整体架构(来源:论文 Figure 2)

VADv2 架构图

图 2:VADv2 概率规划架构(来源:论文 Figure 2)

ASCII 架构对比:

                    ┌─────────────────────┐
6 cams ──► R50 ──►  │ BEV Encoder         │
                    │ (200×200 BEV query) │
                    └──────────┬──────────┘
                               │  BEV feat
        ┌──────────────────────┼──────────────────────┐
        ▼                      ▼                      ▼
┌────────────────┐   ┌──────────────────┐   ┌────────────────┐
│ Map Module     │   │ Agent Module     │   │ Traffic Module │
│ 100 q × 20 pt  │   │ 300 q multi-mode │   │ (VADv2)        │
│ (MapTR-style)  │   │  trajectories    │   │ light/sign     │
└──────┬─────────┘   └────────┬─────────┘   └────────┬───────┘
       │ map vec              │ agent vec            │ traffic vec
       │                      │                      │
       └─────────┬────────────┴──────────────────────┘
                 │
                 ▼
       ┌────────────────────────────────────────┐
       │ Ego Query                              │
       │  Q'_ego  = CrossAttn(Q_ego, Agents)    │  ──┐
       │  Q''_ego = CrossAttn(Q'_ego, Maps)     │    │
       └────────────────────┬───────────────────┘    │
                            │                        │
        ┌───────────────────┴───────────────────┐    │
        ▼ VAD                                   ▼ VADv2
┌────────────────────┐              ┌────────────────────────────┐
│ Planning Head MLP  │              │ Probabilistic Planning     │
│ regress 1 traj     │              │ • Vocabulary 𝕍 (4096 traj) │
│ + L_col / L_bd /   │              │ • Probabilistic Field      │
│   L_dir / L_imi    │              │   E(a) via NeRF posenc Γ   │
│                    │              │ • Scoring Transformer      │
│                    │              │   p(a) over all 4096       │
└─────────┬──────────┘              │ • L_distribution (KL) +    │
          │                          │   L_conflict + L_token     │
          ▼                          └────────────┬───────────────┘
       τ_ego                                      ▼
                                       sampled / argmax τ_ego

4.2 关键组件对比

模块 VAD VADv2
Backbone ResNet-50 ResNet-50
BEV 200×200 BEV query scene token(map / agent / traffic / image / navi / state)
Map Head 100 map query × 20 pt(MapTR-style) map token(centerline / divider / boundary / crossing)
Agent Head 300 agent query,多模态轨迹 agent token,多模态轨迹
Planning MLP 回归 1 条 ego 轨迹 4096-轨迹词汇表 + Probabilistic Field + Transformer 评分
Loss $\mathcal{L}{map} + \mathcal{L}{mot} + \mathcal{L}{col} + \mathcal{L}{bd} + \mathcal{L}{dir} + \mathcal{L}{imi}$ $\mathcal{L}{distribution} + \mathcal{L}{conflict} + \mathcal{L}_{token}$
评估 nuScenes 开环 CARLA 闭环 + nuScenes 开环

4.3 关键代码

VAD Planning Head 的 ego-agent / ego-map 双交互(基于官方 vad_head.py 整理):

# 来源:projects/mmdet3d_plugin/VAD/dense_heads/VAD_head.py
# https://github.com/hustvl/VAD

# 1) Ego 与 agent 交互(吸收周围交通参与者信息)
ego_agent_query = self.ego_agent_decoder(
query = ego_query, # (B, 1, D)
key/value = agent_query.flatten(0,1), # (B, A, D)
pos_emb = agent_pos_emb,
) # → Q'_ego (B, 1, D)

# 2) Ego 与 map 交互(吸收车道 / 边界 / 人行横道)
ego_map_query = self.ego_map_decoder(
query = ego_agent_query, # 已含 agent 信息
key/value = map_query.flatten(0,1), # (B, M*Nv, D)
pos_emb = map_pos_emb,
) # → Q''_ego

# 3) Planning Head:拼 ego 状态 + 高层指令 → 未来 Tf 步轨迹
plan_input = torch.cat([
ego_agent_query, ego_map_query, ego_status, command_emb
], dim=-1)
plan_traj = self.plan_head(plan_input) # (B, Tf, 2)
📄 点击展开:VADv2 概率规划评分头核心伪代码
# 来源(基于论文 Eq. 1 与官方实现整理)

# 1) 预先离线采样的轨迹词汇表
vocab_actions = sample_furthest_trajectories(demos, N=4096) # (4096, T, 2)

# 2) 训练 / 推理 forward
def forward(scene_tokens, vocab_actions, navi_emb, state_emb):
# scene_tokens = cat(map_tok, agent_tok, traffic_tok, image_tok)
# 2.1 NeRF 位置编码
# E(a_i) = cat(Γ(x_1), Γ(y_1), ..., Γ(x_T), Γ(y_T))
E_actions = positional_encode(vocab_actions) # (4096, D_a)

# 2.2 与场景 token cross-attention
fused = transformer(
query = E_actions.unsqueeze(0).expand(B, -1, -1), # (B, 4096, D)
key/value = scene_tokens, # (B, S, D)
) # (B, 4096, D)

# 2.3 与 navi / ego state 融合后打分
fused = fused + navi_emb[:, None] + state_emb[:, None]
logits = mlp_score(fused).squeeze(-1) # (B, 4096)

p_pred = logits.softmax(dim=-1) # 分布
return p_pred

# 3) 训练损失:KL(p_data ‖ p_pred) + 冲突项 + scene token 监督
loss_dist = kl_divergence(p_data, p_pred)
loss_conf = (p_pred * conflict_mask).sum(dim=-1).mean()
loss_total = loss_dist + λ_c * loss_conf + λ_t * loss_scene_tokens

# 4) 推理:argmax 或 top-K 采样后接 PID
best_a = vocab_actions[p_pred.argmax(dim=-1)]

5. 实验与分析

5.1 主要结果

nuScenes 开环(VAD,论文 Table 1)

方法 Avg L2 (m) Avg Col (%) Latency (ms) FPS
UniAD 1.03 0.31 555.6 1.8
VAD-Tiny 0.78 0.38 59.5 16.8
VAD-Base 0.72 0.22 224.3 4.5

CARLA 闭环(VADv2,论文 Tab. 1–2,Town05)

方法 Sensor Town05 Long DS Long RC (%) Town05 Short DS Short RC (%)
Transfuser C+L 31.0 47.5
ST-P3 C 11.5 83.2 55.1 86.7
VAD C 30.3 75.2 64.3 87.3
ThinkTwice C+L 70.9 95.5
DriveMLM C+L 76.1 98.1
VADv2 C 85.1 98.4 89.7 93.0

关键发现

  1. VAD 在开环上首次让端到端方法的 avg Col 进入 0.2% 区间,且 4.5 FPS 接近实时;
  2. VADv2 在 CARLA Long benchmark 上以纯相机超越多传感器 SOTA(DriveMLM)9.0 DS;
  3. Tiny 配置(59.5 ms / 16.8 FPS)证明向量化范式的工程友好性。

5.2 消融实验:验证三个洞察

VAD(论文 Tab. 2 / Tab. 3)

配置 Avg L2 (m) Avg Col (%) 验证洞察
栅格化 map 0.74 0.39 洞察 1(向量化优于栅格)
向量化 map(默认) 0.72 0.22 洞察 1
去掉 Map 交互 0.76 0.28 洞察 2(map 对规划至关重要)
去掉 Agent + Map 交互 0.82 0.26 洞察 2(隐式交互不可或缺)
三项显式约束都开 0.72 0.22 洞察 1 / 2 联合

VADv2(论文 Tab. 3)

ID Dist. Loss Conf. Loss Map / Agent / Traf 1 s L2 1 s Col
1 1.415(崩溃) 0.698
2 0.086 0.012(增加)
7 0.082 0.000

1 行验证洞察 3:去掉 Distribution Loss → L2 暴涨 17×,证明概率分布建模才是 v2 的核心;2 行验证 Conflict Loss 主管安全;scene token 任一缺失都略降。

5.3 性能瓶颈分析

VAD-Tiny 推理时间分布(论文 Tab. 5):

模块 耗时 (ms) 占比
Backbone 23.2 39.0%
BEV Encoder 12.3 20.7%
Motion Module 11.5 19.3%
Map Module 9.1 15.3%
Planning Module 3.4 5.7%

Backbone + BEV Encoder 占 60%,与 MapTR / BEVFormer 同构;Planning 仅 5.7%,证明”重感知 + 轻规划”的工程取向。

5.4 失效场景分析

  • VAD:碰撞约束只用最高置信度 agent motion,多模态预测被浪费;缺少高层信息(lane graph 拓扑、信号灯、停车标志);依赖外部 driving command 给方向;
  • VADv2:仅在 CARLA 验证,真实路况未充分检验;轨迹词汇表大小 4096 是固定的,无在线扩充机制;KL 损失对长尾驾驶行为依赖良好分布的演示数据。

6. 工程实践

6.1 训练配置

VAD:
Backbone: ResNet-50
BEV: 200 × 200 BEV query
Map queries: 100 inst × 20 pt(MapTR-style 分层查询)
Agent queries: 300(多模态 K 条未来轨迹)
Loss weights: map / mot / col / bd / dir / imi 共 6 项加权
Optimizer: AdamW, lr 2e-4, cosine
Schedule: ~60 epochs on nuScenes
Eval: nuScenes open-loop (avg L2, avg Col)

VADv2:
Vocabulary: N = 4096 trajectories(furthest sampling from demos)
Pos encoding: NeRF-style Γ, frequency bands 2L
Scoring head: Transformer + MLP
Loss: L_dist (KL) + L_conflict + L_token
Train data: ~3M frames from CARLA Town03/04/06/07/10 @ 2 Hz
Eval: CARLA Town05 Long & Short closed-loop (DS / RC / IS)
Inference: argmax 或 top-K 采样 + PID

6.2 复现要点

  1. VAD 的 collision loss 阈值 $\delta_i$ 与 agent 类别绑定——对车 / 人 / 自行车要分别设置,过大会让规划畏首畏尾;
  2. map vector 必须用 MapTR-style 分层查询:把所有点拼成长 query 会让 ego-map cross-attn 退化为均值池化;
  3. VADv2 的 trajectory vocabulary 必须用 furthest sampling——随机采样会丢失低频但关键的”急停 / 变道”模式;
  4. NeRF 位置编码的频段 $L$ 是关键超参:太小(< 4)轨迹差异被抹平,太大(> 10)训练不稳定;论文用 $2L = 10$;
  5. VADv2 的 KL 目标分布需要给 GT 之外的”次优”轨迹合理权重(通常按几何距离衰减),否则 Distribution Loss 退化为 one-hot 分类。

6.3 性能优化方向

精度提升

  • 把 agent 多模态预测全部进入 collision 约束(VAD 的明确遗留问题);
  • 引入 lane graph 拓扑、信号灯、限速等高级语义;
  • VADv2 的词汇表换成动态生成(在线扩充罕见场景轨迹);
  • DiffusionDrive 的截断扩散替代固定词汇表,是评分 → 生成的天然延伸。

速度优化

  • VAD-Tiny 已达 16.8 FPS,可用蒸馏 / 更小 backbone 进一步压缩;
  • VADv2 的 4096 条评分可在 GPU 上批量并行,瓶颈在 backbone;
  • 2 stage 推理(先在词汇表上选 top-32,再细化)可降评分头计算量 100×。

7. 研究启示

7.1 可迁移的思想

  • 向量化场景 + 显式几何约束:在任何”感知-决策”任务里都比 dense 表示 + 隐式损失更可控;
  • 隐式交互(attention) + 显式约束(loss):是 VAD 最优雅的设计哲学,可推广到所有 query-based 决策网络;
  • 离散动作词汇表 + 概率分布:受 GPT 启发的”$p(\text{action} | \text{obs})$”建模,是把 LLM 范式带进策略学习的关键模板;
  • NeRF 位置编码用于动作:Probabilistic Field 把连续动作空间编码到高频 embedding,是连续控制问题的通用 trick。

7.2 方法局限

局限 VAD VADv2
多模态利用 agent 多模态预测仅取最自信一条做 collision 动作多模态完整建模
评测 仅 nuScenes 开环 仅 CARLA 闭环(真实路况未验证)
词汇表 固定 4096 条,无在线扩充
安全 显式 loss 仍是软约束 KL 目标分布权重设计敏感

7.3 技术影响

  • VAD 直接定义了”评分派”端到端规划范式:把规划简化为”在多模态 vector 场景上输出一条轨迹”,被后续 SparseDrive / Hydra-MDP / GoalFlow 等大量复用;
  • VADv2 把 LLM 范式 $p(a|o)$ 引入端到端规划,与 DiffusionDrive 的”生成派”形成 2024–2025 端到端规划两条主线(评分 vs 生成);
  • MapTR + Planning = VAD 的工程公式直接催生 SparseDrive(去 BEV)、SparseDriveV2(分解词表 + 层级评分)等后续工作;
  • VADv2 的 Trajectory Vocabulary 设计成为多模态规划的事实基线:DiffusionDrive 的 20 个锚点、Hydra-MDP 的 8192 条、SparseDriveV2 的 26 万分解组合都在与之对照;
  • 端到端范式的下一站(DriveWorld / DiffAD / VLA 等)几乎都把 VAD 的”vector scene”或 VADv2 的”action vocabulary”当作起点。