VAD以矢量化场景表示替代栅格化表达,实现了更高效的自动驾驶规划。作为ICCV 2023的工作,文章介绍了矢量地图编码、规划器设计和轻量化策略,分析了向量化表示在计算效率和规划质量上相比栅格化方法的显著优势,并讨论了当前面临的技术挑战与未来发展方向。

岗位关联

需要学习VAD(Vectorized Autonomous Driving):矢量化场景表示与规划(ICCV 2023),VAD以矢量化场景表示替代栅格化表达,实现了更高效的自动驾驶规划。作为量子机器学习 > 变分量子分类器VQC的基础概念,VAD(Vectorized Autonomous Driving):矢量化场景表示与规划(ICCV 2023)为实际应用场景提供理论依据。

目录
  1. 可视化演示
  2. VAD整体架构与动机
  3. 矢量地图编码方法
  4. 规划器设计与轻量化
  5. 矢量化与栅格化对比
  6. 技术挑战与未来方向
  7. AI 应用场景
  8. Python 演示
  9. 常见问答
  10. 常见误区
  11. 参考来源

可视化演示

展示VAD整体架构(矢量化地图→ego查询→轨迹回归)、地图元素折线编码(lane/bdry/xwa→polyline enc)、以及矢量化与栅格化表示的效率对比(4倍计算节省)。

本节配有交互动效(进入视口后自动加载,约 3KB)。

VAD矢量化规划架构 矢量化地图元素(车道线/边界)通过注意力机制聚合到ego查询,直接回归6个轨迹航点 端到端框架统一场景理解与轨迹规划,避免栅格化的高计算开销 traj=Planner(ego_q,MapEnc(poly)) 矢量化表示保留几何结构信息实现高效规划

VAD整体架构与动机

VAD(Vectorized Autonomous Driving)是华中科技大学与地平线机器人联合提出的端到端矢量化自动驾驶框架,发表于 ICCV 2023。它将场景理解与轨迹规划统一在矢量化表示之下,避免了传统栅格化(rasterized)BEV 表示的高计算开销。

以往以 UniAD 为代表的方法将感知结果渲染为稠密的栅格化 BEV 语义图与占据图,再交给规划器使用。这种表示计算量大、丢失实例级结构信息,难以满足实时部署需求。VAD 的动机正是用更自然的矢量化结构表示替代稠密栅格。

VAD 整体架构由矢量化场景编码器与基于 Transformer 的规划器组成:地图元素(车道线、边界等)以有序点集(折线 polyline)形式编码,动态智能体以状态向量编码,最终由 ego-query 通过注意力机制与场景特征交互并输出未来轨迹。

规划总损失
LVAD=λtrajLtraj+λcolLcol+λmapLmap\mathcal{L}_{\text{VAD}} = \lambda_{\text{traj}}\mathcal{L}_{\text{traj}} + \lambda_{\text{col}}\mathcal{L}_{\text{col}} + \lambda_{\text{map}}\mathcal{L}_{\text{map}}
VAD 总损失由轨迹损失、碰撞损失与地图检测损失加权组成,端到端联合优化感知与规划。

矢量地图编码方法

VAD 将每个地图元素(车道线、道路边界、人行横道、车道中心线等)表示为一个有序点集(折线 polyline),每个点包含二维坐标。这种矢量化表示天然保留了元素的几何结构与实例信息。

编码阶段,每条折线先通过多层感知机(MLP)将点坐标映射为高维特征,再通过 Transformer 编码器进行实例内与实例间交互,使每条折线获得包含上下文语义的矢量化地图 token。

动态智能体同样以矢量化方式表示:每个智能体的位置、朝向、速度、尺寸等被编码为状态向量,再经 Transformer 聚合历史帧信息,形成运动 token。地图 token 与运动 token 共同构成场景的矢量化表示。

折线编码
fi=MLP({p1,p2,…,pni}),pj∈R2\mathbf{f}_i = \text{MLP}(\{p_1, p_2, \dots, p_{n_i}\}),\quad p_j \in \mathbb{R}^2
第 i 条地图折线由其有序二维点集经 MLP 编码为特征向量 f_i,保留几何结构。
缩放点积注意力
Attention(Q,K,V)=softmax(QK⊤dk)V\text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^{\top}}{\sqrt{d_k}}\right)V
VAD 用缩放点积注意力实现 ego-query 与矢量化地图/智能体 token 的交互,是场景编码与规划的核心算子。

规划器设计与轻量化

VAD 的规划器以 ego-vehicle query 为核心:一个可学习的查询向量通过注意力机制从矢量化地图 token 和运动 token 中聚合场景信息,直接回归出未来若干时刻的轨迹航点。

得益于矢量化表示,规划器无需处理稠密 BEV 特征图,注意力计算仅在数量有限的场景 token 上进行,显著降低了计算量与参数量。VAD-Tiny 通过减少历史帧数量进一步压缩模型,实现更高推理速度。

相比 UniAD,VAD 在 nuScenes 规划任务上以远更少的参数与更快的推理速度取得竞争力甚至更优的 L2 误差与碰撞率,验证了矢量化规划器轻量化设计的有效性。

轨迹回归
T^={p^1,p^2,…,p^H}=gθ(qego, Fmap, Fagent)\hat{\mathcal{T}} = \{\hat{p}_1, \hat{p}_2, \dots, \hat{p}_H\} = g_{\theta}(\mathbf{q}_{\text{ego}},\, \mathbf{F}_{\text{map}},\, \mathbf{F}_{\text{agent}})
ego-query q_ego 与地图特征 F_map、智能体特征 F_agent 经规划网络 g 输出 H 步未来轨迹。

矢量化与栅格化对比

栅格化表示(如 UniAD 的 BEV 语义图与占据图)以稠密网格存储场景,信息丰富但计算与显存开销大,且实例级结构信息被像素化掩盖,难以直接表达几何关系。

矢量化表示以折线与状态向量刻画场景元素,天然保留实例与几何结构,token 数量远少于像素数量,因而计算高效、推理更快,更适合结构化驾驶场景。

但矢量化也依赖感知模块输出高质量的实例级矢量,对地图检测的准确性更敏感;在高度非结构化或遮挡严重场景下,栅格化的稠密性仍具一定鲁棒性。二者并非完全互斥,融合使用是值得探索的方向。

效率对比
ParamsVAD≪ParamsUniAD,FPSVAD>FPSUniAD\text{Params}_{\text{VAD}} \ll \text{Params}_{\text{UniAD}},\quad \text{FPS}_{\text{VAD}} > \text{FPS}_{\text{UniAD}}
VAD 参数量显著小于 UniAD,推理速度更快,体现了矢量化表示的效率优势。

技术挑战与未来方向

VAD 面临的首要挑战是矢量化感知的鲁棒性:折线级地图检测与多目标跟踪的精度直接影响规划质量,在复杂交叉口、遮挡与标注噪声场景下仍需提升。

其次,矢量化表示对长时序与不确定性建模仍有不足,如何引入概率化轨迹预测、对其他道路使用者意图的显式推理,是提升安全性的关键方向。

未来方向包括:融合矢量化与栅格化的混合表示以兼顾效率与鲁棒性、扩展到更大规模数据与更复杂城市道路、以及向 VADv2 等基于大规模轨迹数据的生成式规划演进,进一步提升泛化与部署能力。

碰撞约束
Lcol=∑t=1H1[∥p^t−ptagent∥<rsafe]\mathcal{L}_{\text{col}} = \sum_{t=1}^{H} \mathbb{1}\left[\|\hat{p}_t - p_t^{\text{agent}}\| < r_{\text{safe}}\right]
碰撞损失惩罚规划轨迹与智能体预测位置过近,是 VAD 提升安全性的重要约束。

AI 应用场景

城市结构化道路端到端矢量化轨迹规划

阶段:端到端规划推理

解决的问题:解决栅格化 BEV 表示在实时自动驾驶规划中计算开销大、推理速度慢、且丢失实例级几何结构信息的问题,使端到端规划可高效部署。

具体案例:在 nuScenes 城市道路场景中,VAD 将车道线、道路边界等地图元素编码为折线 token,将周围车辆编码为运动 token,由 ego-query 通过注意力聚合后直接回归 6 步未来轨迹。相比 UniAD 的稠密栅格化方案,VAD-Tiny 推理速度提升约 2.5 倍、参数量大幅减少,同时在 L2 误差与碰撞率上保持竞争力甚至更优,适合车端实时运行。

Python 演示

python77 行
import numpy as np  def encode_polyline(points, embed_dim=32):    """将地图元素(折线)编码为矢量化特征向量"""    coords = np.array(points, dtype=np.float32)    feat = coords.flatten()    if feat.shape[0] < embed_dim:        feat = np.pad(feat, (0, embed_dim - feat.shape[0]))    return feat[:embed_dim]  def scaled_dot_product_attention(query, keys, values):    """缩放点积注意力:让 ego-query 与矢量化场景特征交互"""    scores = query @ keys.T / np.sqrt(keys.shape[-1])    weights = np.exp(scores - np.max(scores))    weights = weights / np.sum(weights)    return weights @ values  class VADEncoder:    """VAD 矢量化场景编码器(简化版)"""     def __init__(self, embed_dim=32):        self.embed_dim = embed_dim        self.map_features = []        self.agent_features = []     def add_map_element(self, polyline_points):        vec = encode_polyline(polyline_points, self.embed_dim)        self.map_features.append(vec)     def add_agent(self, state_vector):        vec = np.array(state_vector, dtype=np.float32)        if vec.shape[0] < self.embed_dim:            vec = np.pad(vec, (0, self.embed_dim - vec.shape[0]))        self.agent_features.append(vec[:self.embed_dim])     def get_scene_tokens(self):        tokens = np.stack(self.map_features + self.agent_features)        return tokens  class VADPlanner:    """VAD 规划器:基于矢量化特征生成轨迹"""     def __init__(self, horizon=6, embed_dim=32):        self.horizon = horizon        self.embed_dim = embed_dim        self.ego_query = np.random.randn(1, embed_dim).astype(np.float32) * 0.1     def plan(self, scene_tokens):        context = scaled_dot_product_attention(self.ego_query, scene_tokens, scene_tokens)        waypoints = []        for t in range(self.horizon):            step = (context.flatten()[:2] * (1.0 + 0.2 * t)).astype(np.float32)            waypoints.append(step.tolist())        return np.array(waypoints)  def main():    np.random.seed(42)    encoder = VADEncoder(embed_dim=32)    encoder.add_map_element([[0, 0], [1, 0], [2, 0], [3, 0]])    encoder.add_map_element([[0, 2], [1, 2], [2, 2], [3, 2]])    encoder.add_agent([5, 0, 1, 0, 0])    encoder.add_agent([-2, 0, 0, 1, 0])    tokens = encoder.get_scene_tokens()    planner = VADPlanner(horizon=6, embed_dim=32)    trajectory = planner.plan(tokens)    print("场景 token 形状:", tokens.shape)    print("规划轨迹 (horizon=%d):" % planner.horizon)    print(trajectory)  if __name__ == "__main__":    main()
目的:用精简代码演示 VAD 的核心思想:将地图元素编码为折线 token、将智能体编码为运动 token,再由 ego-query 通过注意力聚合场景特征并回归未来轨迹。
  1. import numpy as np导入 NumPy,用于矢量化张量计算与注意力运算。
  2. def encode_polyline(points, embed_dim=32):定义折线编码函数,将地图元素的有序点集映射为固定维度向量,对应 VAD 的矢量地图编码。
  3. feat = coords.flatten()将折线坐标展平为一维向量,作为矢量化特征的原始表示。
  4. def scaled_dot_product_attention(query, keys, values):定义缩放点积注意力,对应 VAD 中 ego-query 与场景 token 的交互算子。
  5. scores = query @ keys.T / np.sqrt(keys.shape[-1])计算 query 与 keys 的相似度并按根号维度缩放,稳定训练梯度。
  6. weights = weights / np.sum(weights)对注意力分数做归一化,得到注意力权重。
  7. self.map_features.append(vec)将编码后的地图折线向量加入地图特征列表,构成矢量化地图 token。
  8. tokens = np.stack(self.map_features + self.agent_features)将地图 token 与智能体 token 堆叠为场景 token 矩阵,供规划器使用。
  9. context = scaled_dot_product_attention(self.ego_query, scene_tokens, scene_tokens)ego-query 通过注意力从场景 token 聚合上下文,模拟 VAD 规划器的核心交互。
  10. waypoints.append(step.tolist())将回归的每一步航点加入轨迹序列,形成未来轨迹。
  11. trajectory = planner.plan(tokens)调用规划器基于矢量化场景 token 输出未来轨迹。
  12. if __name__ == "__main__":脚本入口,执行端到端的矢量化编码与规划演示。

常见问答

VAD 为什么选择矢量化场景表示而非栅格化?
栅格化 BEV 表示将场景渲染为稠密像素网格,计算与显存开销大且丢失实例级几何结构。矢量化以折线和状态向量刻画地图元素与智能体,天然保留结构与实例信息,token 数量远少于像素,因而更高效、更自然地适配结构化驾驶场景,便于规划器直接利用几何关系。
VAD 的规划器如何利用矢量化特征生成轨迹?
规划器维护一个可学习的 ego-vehicle query,通过注意力机制从矢量化地图 token 和运动 token 中聚合场景上下文,再直接回归未来若干步的轨迹航点。由于注意力仅在有限 token 上计算,规划器轻量且高效,并通过碰撞损失约束轨迹安全性。
VAD 相比 UniAD 在效率与性能上有何优势?
VAD 以矢量化表示替代 UniAD 的稠密栅格化,参数量显著减少、推理速度更快(VAD-Tiny 约提升 2.5 倍)。在 nuScenes 规划基准上,VAD 以更少资源取得竞争力甚至更优的 L2 误差与碰撞率,更利于车端实时部署。
VAD 的矢量化地图元素是如何编码的?
每个地图元素被表示为有序二维点集(折线),先由 MLP 将点坐标映射为高维特征,再经 Transformer 编码器进行实例内与实例间交互,得到包含上下文语义的地图 token。动态智能体则将位置、速度、朝向等状态编码为向量并聚合历史帧,形成运动 token。

常见误区

误区VAD 只是 UniAD 的简化版

正解VAD 拥有独立的矢量化场景表示和规划器设计,并非简单删减 UniAD。它以折线/状态向量替代稠密栅格,并用 ego-query 注意力直接回归轨迹,是范式层面的重新设计。

为何常见:两者都是端到端框架且都面向 nuScenes 规划,外观相似,容易让人误以为 VAD 只是去掉部分模块的轻量版。

误区矢量化将完全替代栅格化

正解矢量化在结构化场景优势明显,但栅格化在高度非结构化或严重遮挡场景下仍具稠密性带来的鲁棒性。二者并非互斥,融合使用是更有前途的方向。

为何常见:VAD 展示了矢量化的高效与高性能,容易让人产生一种表示通吃所有场景的印象。

误区轻量化必然牺牲精度

正解VAD 通过矢量化表示与高效注意力实现轻量化的同时,在 nuScenes 上保持竞争力甚至更优的 L2 误差与碰撞率,说明合理设计可在效率与精度间取得平衡。

为何常见:传统经验中减小模型常伴随精度下降,人们容易将这一直觉套用到矢量化这类范式创新上。

参考来源