looyifan / HiP-AD: Hierarchical and Multi-granularity Planning with Deformable Attention

Created Tue, 17 Mar 2026 00:00:00 +0000 Modified Fri, 15 May 2026 14:43:15 +0800

一、这篇论文在讲什么?

核心问题:AI司机的"偏科"痛点

现在的端到端自动驾驶(E2E-AD)界有个普遍的怪现象:“应试教育"满分,“实战上路"拉胯。

  • 开环测试(开卷考试):给一段历史视频,让 AI 画出未来的行驶轨迹(Waypoints)。大家都画得很好,碰撞率(Collision Rate)极低,甚至能降到 0.1%。
  • 闭环测试(实车上路):把 AI 扔进仿真软件(比如 Bench2Drive)里真刀真枪地开。结果呢?成功率不到 35%!遇到路口就犹豫不决(超时死机),遇到突发情况就抓瞎。

问题根源

作者一针见血地指出:目前的 AI 在"规划(Planning)“时,和"感知(Perception)“的交互太弱了!而且预测出来的轨迹太单调(只有稀疏的几个点),根本不够用来做精细的车辆控制。

HiP-AD 的答案

“分层多粒度预测” + “顺着轨迹看图像(PDA)” + “三合一圆桌会议(统一解码器)”,彻底打通感知与规划的任督二脉


二、核心方法:老司机的三大独门绝技

绝技一:多把量尺看世界 —— 分层与多粒度规划

以前的 AI 预测轨迹,就是每秒打几个点(时间路点,Temporal Waypoints)。这就好比司机只知道"我 3 秒后要到那个路口”,但他不知道这 3 秒内方向盘该打几度。

HiP-AD 彻底改变了玩法,它不仅预测时间,还把轨迹拆解成了 三大维度(模态),并且每个维度都有 不同的颗粒度

模态 关注点 颗粒度划分 用途
空间路点 “路径"怎么走 密集(2m一个点)& 稀疏(5m一个点) 密集点做精准方向盘微调(横向控制),稀疏点看宏观大局
时间路点 “什么时候到哪” 高频(5Hz)& 低频(2Hz) 高频应对紧急情况,低频规划长程
驾驶风格路点 “车速和动作” 慢/中/快(0-4, 4-10, 10+ m/s) 应对超车、紧急刹车等复杂场景

控车策略:AI 会用空间路点控制方向盘(横向),用时间和驾驶风格路点控制油门刹车(纵向),完美解决由于轨迹点太稀疏导致的"车辆犹豫"问题!


绝技二:指哪打哪的目光 —— 规划可变形注意力(PDA)

以前的 AI 规划器在看周围环境时,是"全局乱瞟”(Global Attention),不仅计算量大,还容易抓不到重点。

HiP-AD 的做法极其聪明——它利用了几何学物理规律:

  1. 先把系统预测出的 3D 未来轨迹点(Waypoints),通过相机参数,投影映射到 2D 的多视角环视图像上
  2. 然后,只在这些 “车轮即将压过” 的图像物理位置附近,去采样提取图像特征

生动比喻

这就像老司机在开车时,目光会死死盯住自己即将开过去的那条车道线和前方的障碍物,而不是去看天上的云彩。

数学表达

$$\text{PDA}(Q_p, F) = \sum_{i \in \mathcal{V}} \text{DeformAttn}(Q_p, \mathcal{P}(A_p), F_i)$$

规划主脑有一条预测出的未来 3D 轨迹($A_p$)。它把这条未来轨迹用函数 $\mathcal{P}$ 投影到多视角的图像($F$)上,然后只在"未来车轮即将压过的图像像素点"周围提取特征!


绝技三:超级大脑圆桌会议 —— 统一解码器(Unified Decoder)

传统的框架是流水线作业:先做感知(找车、找线)→ 再做预测 → 最后做规划。不仅慢,信息还会衰减。

HiP-AD 搞了一个 “单解码器”,把所有任务拉进一个群里并行开会!

入场的三大"代表”(输入配置)

代表 符号 职责 初始坐标(Anchors)
🚗 动态物体代表 Agent Query ($Q_a$) 找周围移动的车、人 3D 边界框(Box Anchors)
🛣️ 静态地图代表 Map Query ($Q_m$) 找车道线、斑马线 聚类算法生成的折线(Polyline Anchors)
🧠 自动驾驶主脑代表 Planning Query ($Q_p$) 决定咱们自己的车往哪开 未来 $T$ 个时间点的行驶轨迹折线

圆桌会议的三大议程

每个 Decoder Layer 都包含以下三个关键环节:


🕒 议程一:翻阅历史案卷 —— 时序交互模块

老司机开车绝不能只看眼前,得记得上一秒旁边有辆车想加塞。

技术动作

  • 代表们(Queries)首先会和 上一帧历史保留下来的重要特征 进行 交叉注意力(Cross-Attention) 计算
  • 为了防止历史信息太多把脑袋撑爆,系统用了一个 Top-$k$ 选择机制,只保留上一帧最有价值的线索
  • 给主脑开小灶:规划代表(Planning Query)不但要回顾自己的历史,还会额外增加一次跨任务的 Cross-Attention,专门去盯住历史帧里的感知信息

🗣️ 议程二:圆桌激烈讨论 —— 协同交互模块

看完历史,大家得互相通气了。主脑需要知道哪里有车、哪里是实线,才能规划路线。

核心技术细节 —— 几何物理融合(公式 1)

$$\text{Attention}(Q, K, V) = \text{Softmax}\left(\frac{QK^T}{\sqrt{C}} - \tau D\right)V$$

常规的注意力机制只有前半部分,决定谁和谁更相关。但这里多了一个极其关键的 “惩罚项”:$- \tau D$

  • $D$ 是什么? 两个物体在真实 3D 物理世界里的 欧几里得距离(比如动态车与车之间、车与车道线之间)
  • $\tau$ 是什么? 通过多层感知机(MLP)学习出来的系数
  • 精妙之处:如果一辆车离你很远($D$ 很大),那么它在注意力分数里就会被狠狠扣分。这强迫 AI 司机 “把有限的注意力集中在离自己最近、最危险的物体上”

主脑的特权:这个距离惩罚对感知代表有效,但对 规划代表没有距离限制!为什么?因为作为最高决策者,规划主脑必须有统揽全局的视野。


🎯 议程三:去图像里找证据 —— 任务可变形注意力模块

讨论出了初步结果,代表们需要带着目前的猜测,去原始的摄像机画面里 “精准取证”,刷新自己的认知。

感知代表的做法:把 3D 锚点顺着预设高度,利用相机参数 投影到 2D 环视图像上,然后在投影落下的那个点附近采样提取图像特征。

规划主脑的终极奥义(PDA)

  • 把预测的"未来 3D 行驶轨迹路点"投影到多个摄像头画面上
  • 让主脑自己学习:在轨迹周围哪些像素点最值得关注?
  • 目光死死盯住"车轮即将压过的未来路线"周围的画面!提取图像特征。

三、伪代码实现:老司机的脑神经

import torch
import torch.nn.functional as F

def Unified_Decoder(
    image_features,   # [多视角环视图像特征 F] (监控录像)
    queries,          # [动态物体Qa, 静态地图Qm, 规划主脑Qp] (拿着清单的代表)
    anchors,          # [动态框Aa, 静态线段Am, 未来轨迹Ap] (各自关注的3D物理坐标)
    history_memory,   # [上一帧存下来的重要记忆]
    camera_params,    # [相机的内外参矩阵] (用于3D到2D的投影)
    num_layers=6      # 会议通常要开好几轮 (堆叠6层Decoder)
):
    # --- 会议前奏:代表入场 ---
    Qa, Qm, Qp = queries
    Aa, Am, Ap = anchors

    # 🔄 开始循环开会:每一层 Decoder 都在进行信息的深度融合
    for layer in range(num_layers):

        # =========================================================
        # 🕒 议程一:时序交互模块 (Temporal Interaction Module)
        # 目标:"温故知新",看看上一秒发生了什么。
        # =========================================================

        # 1. 脑容量有限,用 Top-k 机制挑选上一帧最有价值的记忆点
        hist_k_agent, hist_k_map, hist_k_plan = select_top_k(history_memory)

        # 2. 感知代表各自查阅自己的历史卷宗 (Cross-Attention)
        Qa = CrossAttention(query=Qa, key=hist_k_agent, value=hist_k_agent)
        Qm = CrossAttention(query=Qm, key=hist_k_map,   value=hist_k_map)

        # 💡 3. 【老司机的特权】规划主脑不仅看自己的历史轨迹,
        #    还要盯着历史的感知环境!
        Qp_self_hist = CrossAttention(query=Qp, key=hist_k_plan, value=hist_k_plan)
        Qp_perc_hist = CrossAttention(
            query=Qp,
            key=concat(hist_k_agent, hist_k_map),
            value=concat(hist_k_agent, hist_k_map)
        )
        Qp = combine_features(Qp_self_hist, Qp_perc_hist)

        # =========================================================
        # 🗣️ 议程二:协同交互模块 (Collaborative Interaction Module)
        # 目标:统一的圆桌会议,互相通气,引入"物理距离惩罚"!
        # =========================================================

        # 1. 把所有人拉进一个群里
        Q_all = concat(Qa, Qm, Qp)
        A_all = concat(Aa, Am, Ap)

        # 2. 计算纯粹的注意力分数 (谁跟谁有关联)
        attn_scores = torch.matmul(Q_all, Q_all.transpose(-2, -1)) / math.sqrt(C)

        # 💡 3. 【核心技术细节:公式(1)】计算真实物理世界中 3D 锚点之间的距离矩阵 D
        D_matrix = calc_euclidean_distance_3d(A_all, A_all)

        # ⚠️ 【主脑特权掩码】规划主脑(Qp)看所有人都不受距离限制
        D_matrix = apply_planning_mask(D_matrix, mask_value=0.0)

        # 4. 用一个小网络学习一个动态系数 tau (控制惩罚力度)
        tau = MLP(Q_all)

        # 5. 施加物理距离惩罚!距离越远的物体,注意力得分被扣得越惨
        penalized_scores = attn_scores - (tau * D_matrix)
        attn_weights = F.softmax(penalized_scores, dim=-1)

        # 6. 根据惩罚后的权重,大家交换情报
        Q_all_updated = torch.matmul(attn_weights, Q_all)

        # 7. 散会,大家拿着更新后的情报各自归位
        Qa, Qm, Qp = split_queries(Q_all_updated)

        # =========================================================
        # 🎯 议程三:任务可变形注意力模块 (Task Deformable Attention Module)
        # 目标:拿着讨论结果,去图像画面里"精准取证"。
        # =========================================================

        # 1. 感知代表去找车和线:把 3D 的框和线投影到 2D 图像上
        P_a_2d = project_3D_to_2D(Aa, camera_params)
        P_m_2d = project_3D_to_2D(Am, camera_params)
        Qa = DeformableAttention(query=Qa, reference_points=P_a_2d, features=image_features)
        Qm = DeformableAttention(query=Qm, reference_points=P_m_2d, features=image_features)

        # 💡 2. 【核心技术细节:公式(2) PDA】规划主脑的终极绝技!
        #    把预测的"未来3D行驶轨迹路点"投影到多个摄像头画面上
        P_p_2d = project_trajectory_to_2D(Ap, camera_params, predefined_heights)

        # 让主脑自己学习:在轨迹周围哪些像素点最值得关注?
        sampling_offsets, sampling_weights = MLP_predict_offsets_weights(Qp)

        # 施展 PDA:目光死死盯住"车轮即将压过的未来路线"周围的画面!
        Qp = PDA_DeformableAttention(
            query=Qp,
            reference_points=P_p_2d,
            offsets=sampling_offsets,
            weights=sampling_weights,
            features=image_features
        )

        # 🔄 层级收尾:更新代表们的 3D 坐标锚点
        Aa = update_anchors(Aa, Qa)
        Am = update_anchors(Am, Qm)
        Ap = update_anchors(Ap, Qp)  # 轨迹越来越精确

    # 🚪 整个开会流程结束,输出给外面的业务部门 (Heads) 去执行
    update_history_memory(Qa, Qm, Qp)

    return Qa, Qm, Qp

伪代码里的三个"高光时刻”

  1. 议程一中的 combine_features(Qp_self_hist, Qp_perc_hist):规划时不仅记得自己上一秒想怎么走,还 直接 调取了上一秒周围环境的原始记忆,没有中间商赚差价。

  2. 议程二中的 penalized_scores = attn_scores - (tau * D_matrix):这就是论文里最惊艳的 几何物理融合。它强迫网络变成一个真正的司机——“不要看天上飞的鸟,看离你保险杠只有半米远的那辆车!”

  3. 议程三中的 PDA_DeformableAttention:传统的网络是在图像上撒网捞鱼,而这里是 “按图索骥”。沿着预测轨迹投影到 2D 上的路线,只在这个轨迹的左右两边提取图像特征。


四、秘密训练法:对齐匹配(Align Matching)

因为搞出了几十种不同粒度、不同模态的预测轨迹,训练的时候 AI 容易"精神分裂”,到底哪个才是最准的?

对齐匹配机制(公式 6)

  • 在训练时,采用 “赢家通吃”(Winner-takes-all) 的策略
  • 先在所有的轨迹预测组里,找到和真实人类轨迹(Ground Truth)差距最小(L2 距离最小)的那组作为"学霸(Reference)"
  • 然后,强迫其他所有的粒度组,都向这个"学霸"的模态对齐,共享匹配结果,把梯度有效地反向传播回去

五、战绩揭晓(实验结果)

这位练成神功的 HiP-AD 老司机去考场了,结果直接"屠榜"!

闭环终极测验(Bench2Drive 数据集)

指标 HiP-AD 第二名(DriveTransformer)
成功率 72.7% 35%(翻了一倍多)
驾驶得分 88.3 远超所有现有端到端模型

特殊技能考核

高难度科目 成功率
紧急刹车 83.33%
超车 84.44%
汇入车流 50%

不再像以前的模型那样遇到复杂路况就死机!

开环基础测验(nuScenes 数据集)

  • 碰撞率:0.01% - 0.05%(极低)
  • 感知和预测任务也拿到了顶尖分数,证明底盘依然极度扎实

六、总结与局限

一句话总结

HiP-AD 通过 “分层多粒度预测” + “顺着轨迹看图像(PDA)” + “三合一圆桌会议(统一解码器)”,彻底打通了感知与规划的任督二脉,解决了端到端自动驾驶在闭环仿真中不敢开、不会开的难题。

局限性(论文坦诚)

  • 遇到后方突然高速冲过来的车辆时,系统有时候还是会反应不及(这确实也是人类司机的盲区)
  • 目前还在仿真阶段,真车路测将是未来的星辰大海

参考来源

  • 原论文:HiP-AD: Hierarchical and Multi-granularity Planning with Deformable Attention for End-to-End Autonomous Driving
  • 讨论:Gemini 3.1 Pro Preview 对话记录