战斗包子
端到端面试前的临时抱佛脚

端到端面试前的临时抱佛脚

Diffusion planner 和 pluto

🌊 Diffusion Planner (生成式)

  • 优势多模态(Multi-modality)性能上限高,能解决“左右绕行取平均导致撞墙”的问题。
  • 劣势数据需求量极大,且推理速度慢,在数据有限时难以收敛。
    当前困境:数据少,做不了diffusion planner,只能做pluto

🪐 Pluto (回归式 + 辅助任务)

  • 定位量产级 SOTA 方案
  • 核心优势:在不使用重型生成式模型的前提下,通过精心设计的网络架构辅助任务,用较少的数据达到极佳的泛化效果。

辅助任务监督 (Auxiliary Supervision):

📐 损失函数 (Loss Function) 的进化

普通模仿学习 (Behavior Cloning, BC)
只看结果,容易死记硬背。

Lplan=τpredτgt2L_{plan} = || \tau_{pred} - \tau_{gt} ||_2 (预测轨迹与专家真值的 L2 距离)

PLUTO 架构
引入多重监管,强制理解语义。

Ltotal=Lplan+λ1Lforecast+λ2Lstate+L_{total} = L_{plan} + \lambda_1 L_{forecast} + \lambda_2 L_{state} + \dots

🧠 何为“强制学习语义”?

  • 目的:防止模型走捷径 (Shortcut)死记硬背 (Rote Memorization)
  • 手段:故意设计一些很难的“考题”(辅助任务)。这些题目靠“抄袭速度”或“背背景”是做不出来的,只有真正理解了红绿灯、理解了别人的意图,才能做对。

辅助任务示例

✅ 考题一:Traffic Light State Prediction(红绿灯状态预测)

  • 如果不考:模型可能只学到“前车停我就停”,根本不看红绿灯(因果混淆)。
  • 强制效果:逼迫模型的 特征提取器(Encoder) 去图像里寻找红绿灯的特征。
  • 最终结果:模型的“大脑”里真正包含了**“红绿灯状态”**的语义。即使前车闯红灯,模型因为看到了红灯,自己也会停下来。

✅ 考题二:Future Trajectory Prediction of Agents(预测他车轨迹)

  • 题目:“模型,你觉得左边那辆出租车,3秒后会出现在哪里?”
  • 强制效果:迫使模型去学习 社会交互 (Social Interaction)博弈逻辑
  • 最终结果:当模型学会了预判别人,它规划自己的路线时,就会自然而然地进行**“防御性驾驶”**(例如:我看它要切入,我就提前减速)。

✅ 考题三:Ego-Status Reconstruction(自车状态重建)

  • 题目:“模型,闭上眼(只看中间层特征),你猜猜你现在的速度和加速度是多少?”
  • 强制效果:让模型的 潜意识 (Latent Space) 时刻保持对物理规律的敏感。
  • 最终结果:让模型理解 “惯性”“动力学约束”。避免规划出违反物理定律(如高速直角急转弯)的轨迹。

这本质上是在做 Representation Learning(表征学习) 的约束。

  • 核心术语Inductive Bias Injection(注入归纳偏置)
  • 总结逻辑
    通过 多任务学习 (Multi-task Learning),倒逼主干网络 (Backbone) 去提取出真正有意义的高层语义特征(规则、意图、物理约束),而不是去拟合不可靠的像素级噪音。提高了模型在陌生场景下的泛化能力

总结

Pluto 就是通过设计辅助任务的 Cost,强制模型学习高层语义状态量,从而避免 Shortcut(因果混淆/惯性依赖)。

模仿学习的两大问题:

shortcut(走捷径):

学到了错误的因果关系,有些像我老婆他们经济学里面那种相关性因果性混淆。

copycat(复制猫猫,喵!惯性问题)

模型只是简单复制过往的经验来预测下一帧。(损失函数没有学到关键信息)

模仿学习如果在自动驾驶领域如果出现copycat,智能体的动作与时间强相关。过往状态可由当前状态回溯推理。

车辆作为典型的物理实体,其状态受惯性与运动学方程约束,具有极强的状态连续性(State Continuity)。状态非突变性: 速度、加速度等高阶物理量不会在时间轴上发生突变。当前时刻的状态 StS_t 往往包含了极强的历史状态 St1S_{t-1} 的先验信息。可回溯推理: 由于这种连续性,过往状态往往可以通过当前状态(或极短的时间窗口)进行反向推导。这种强先验使得模型容易“偷懒”,通过推算历史惯性来预测下一步,而非通过感知输入来决策。

(车是很典型的案例,速度等状态量不会在时间轴突变,只加xy,heading(heading其实是不是也可以不加,可以通过差分递推?),其他状态量可通过积分得到。)

待阅读论文:

浅看一下UniAD

planning

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def forward(self, 
bev_embed,
occ_mask,
bev_pos,
sdc_traj_query,
sdc_track_query,
command):
"""
Forward pass for PlanningHeadSingleMode.

Args:
bev_embed (torch.Tensor): Bird's eye view feature embedding.
occ_mask (torch.Tensor): Instance mask for occupancy.
bev_pos (torch.Tensor): BEV position.
sdc_traj_query (torch.Tensor): SDC trajectory query.
sdc_track_query (torch.Tensor): SDC track query.
command (int): Driving command.

Returns:
dict: A dictionary containing SDC trajectory and all SDC trajectories.
"""

待看论文

Robust Autonomy Emerges from Self-Play

初步概念的认识

Transformer

草履虫的transformer初步理解

数据层(输入Embedding)

所有的东西(车、车道、指令、红绿灯),进入网络后,都会变成一个 长长的向量(比如长度 256 的浮点数组)。

Embedding (嵌入):用网络学习一组参数,这个参数表示某些概念。比如embedding的左转概念就是学出来的一个向量

逻辑层(Q/K/V, Query-Key-Value)

    1. Query (查询) = 意图、状态等信息,如command向量和track query(自车位姿、轨迹,其他车辆轨迹等)
    1. Key (键) = 位置信息(Pos)和语义特征。它的作用是用来被 Query 匹配的。
    1. Value (值) = 包含了位置和特征。它的作用是被提取的内容。
1
plan_query = self.attn_module(plan_query, bev_feat)

在UniAD中,plan_query(Query (Q)) “我要去哪?”(包含了 Command + 当前状态 + 预测趋势)

bev_feat(Key (K) & Value (V)) “地图上有啥?”(包含了 BEV 地图特征 + 位置编码)

key 和 value

key和value共同组成了一个字典,根据每一个key可以找到对应的value

在 attn_module (MultiheadAttention) 的内部,第一件事就是做线性变换(Linear Projection):K=bev_feat×WKK = \text{bev\_feat} \times W_KV=bev_feat×WVV = \text{bev\_feat} \times W_VWKW_K (Key 的权重矩阵):这是网络学出来的参数。它的目的是把原始特征变成适合“被搜索”的样子(比如突出位置信息、类别信息)。

WVW_V (Value 的权重矩阵):这是另一组参数。它的目的是把原始特征变成适合“被规划使用”的样子(比如突出速度、加速度、曲率信息)。

它们源自同一个 Input,但通过两个不同的全连接层 (WK,WVW_K, W_V)

如何计算得到注意力?

注意力:

Attention(Q,K,V)=Softmax(QKT/dk)VAttention(Q, K, V) = Softmax(QK^T/\sqrt{d_k})V
  1. QKTQK^T (矩阵乘法):计算 Query 和 Key 的相似度(也就是 Attention Score)。
  2. SoftmaxSoftmax (归一化):把分数变成概率。
  3. V\cdot V (加权求和):根据概率提取信息。

mlp的融合

1
2
3
4
5
self.mlp_fuser = nn.Sequential(
nn.Linear(embed_dims*fuser_dim, embed_dims),
nn.LayerNorm(embed_dims),
nn.ReLU(inplace=True),
)
  1. Linear
    向量压缩: 假设我们每个向量长256,此时我们的东西是由如下内容拼出来的
  2. sdc_traj_query (256)
  3. sdc_track_query (256)
  4. navi_embed (256)

把 768 维大向量,重新压缩回标准的 256 维,以便后面的 Transformer 处理。

  1. LayerNorm
    归一化: LayerNorm 强制把这 256 个特征拉回到一个相对标准的范围(均值为0,方差为1附近)

  2. nn.ReLU(inplace=True)
    非线性的激活函数
    然后.max(1)得到最好的轨迹作为规划意图

一个粗糙的理解

我们训练的网络中需要训练到哪些呢?

  1. 输入的图像数据、导航指令等,经过网络转换成一组向量特征。
  2. MLP(多层感知机) Fuser:把“我是谁(Track)”、“我去哪(Command)”、“未来咋样(Motion)” 先融合 起来,变成一个强有力的 Query。
  3. 意图和自车状态特征作为Q,bev特征会训练得到两个权重矩阵,一个权重矩阵在和bev特征向量相乘后会把 BEV 特征转换成适合被 Query 搜索 的形态,而另一个权重矩阵和bev特征向量相乘后会把 BEV 特征转换成适合 规划使用 的形态。
  4. 使用SOFTMAX将各个注意力加权
  5. 生成轨迹 (Reg Branch),也是一个MLP:把懂环境的意图,通过全连接层,算成轨迹坐标。
  6. 选取最佳轨迹

UniAD的架构

graph TD
    A["摄像头图像 Images"] --> B("Backbone & BEVFormer")
    B -- 生成 --> C["BEV 特征图 (Key/Value)"]

    D["预设的 Object Queries"] --> E("检测与跟踪 TrackFormer")
    C --> E
    E -- "产出 Track Queries" --> F("预测 MotionFormer")
    
    C --> F
    F -- "产出 Motion Queries" --> G("规划 PlanningFormer")
    
    C --> G
    H["导航指令 Command"] --> G
    
    G -- 输出 --> I["自车轨迹 (红线)"]

特征提取与构建

  1. Backbone (主干网络): 图像首先经过类似 ResNet 的网络,提取 2D 图像特征。

  2. BEVFormer: 这是最关键的一步。它通过 View Transformation(视角转换) 将 2D 图像特征“提升”到 3D 的 BEV(鸟瞰图) 空间。

  3. 它使用 Attention 机制,查询 BEV 网格中的每一个点对应图像中的哪些像素。

  4. 输出 (CC): BEV Features。这是一个高维的特征网格(比如 200×200200 \times 200 的网格),它就像上帝视角的地图,包含了车道线、路沿等静态信息,也隐含了障碍物的位置信息。

BEV Feature与 Cost Map的区别

Rule-based Cost Map (标量图):
形式: 通常是一个二维矩阵(H×WH \times W)。
内容: 每一个格子(Grid)里只有一个数字(Scalar),代表“经过这里的代价”。
BEV Feature (高维张量):
形式: 是一个三维张量(H×W×CH \times W \times C),其中 CC 是通道数(Channel),通常是 256 或更多。
内容: 每一个格子对应的不再是一个数字,而是一串长长的向量(比如 256 个浮点数)。
特点: 包含高维语义信息。 这串数字里隐含了“这是一条虚线”、“这是湿滑路面”、“这是半个车头”等丰富信息,甚至是人类语言难以描述的特征。
优点: 它是可导的。如果最终轨迹与人类驾驶员的轨迹(Ground Truth)不一致,Gradient(梯度)可以直接通过 BEV Feature 反向传播回去,自动修正 Backbone 提取特征的方式。

检测与跟踪 (TrackFormer)

Object Queries

Object Queries 是一组固定数量的可学习参数(Learnable Parameters)。

假设我们在模型中预设了 NN 个查询(例如 N=900N=900),每个查询向量的维度为 dd(例如 d=256d=256)。那么,Object Queries 初始化为一个矩阵 QobjRN×dQ_{obj} \in \mathbb{R}^{N \times d}

A. 位置部分 (Positional Embedding) —— “在哪里看”
这是 Query 的“锚点”属性。经过训练,这 900 个 Query 会学习到不同的空间偏好。

Query #1 可能专注于 BEV 空间的左上角。
Query #2 可能专注于十字路口的中心。
学术解释: 它是对场景进行稀疏采样的空间先验(Spatial Prior)。它告诉网络去关注哪些区域可能出现物体。

B. 内容部分 (Content Embedding) —— “看到了什么”
这是 Query 的“容器”属性。在未经解码器处理前,它通常初始化为零或随机值。
随着它在 Transformer Decoder 层级中流动(Layer by Layer),它不断地通过 Cross-Attention 从 BEV 特征中“吸取”信息。
最终,这个向量将编码目标物体的类别(Class)和回归参数(Bounding Box / Velocity)。

本文作者:战斗包子
本文链接:https://paipai121.github.io/2025/11/19/工作/端到端面试前的临时抱佛脚/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可