想象你正在一个大型商场的中庭指挥一场寻人任务。你面前有六块监控屏幕,每块屏幕都从不同角度拍着同一片区域——有的看到人的正面,有的只看到侧面,还有一块因为柱子遮挡根本看不见人。更麻烦的是,刚才在另一块屏幕上闪过的人影,现在已经走到了别处。你该怎么把这些支离破碎、不断变化的信息拼成一张完整的“商场地图”? 如果你把“六块屏幕”换成“六路环视摄像头”,把“找人”换成“检测周围的车辆与行人”,把“记住刚才人影的位置”换成“时序信息融合”——你就已经理解了 BEVFormer 的核心思想。这是一篇发表在 CVPR 2022(会议周期原因常被标注为 2023)的自动驾驶感知论文,它用 Transformer 架构把多摄像头图像和历史帧信息,统一融合到一张“鸟瞰视角(BEV)”的地图上,让自动驾驶汽车像拥有上帝视角一样理解周围的世界。 本文不涉及复杂的模型推导,而是用“商场寻人”这个故事贯穿始终,带你一步步读懂 BEVFormer 的每个关键部件:从 BEV 查询点到空间交叉注意力,从时序对齐到 3D 检测头。学完后,你会明白为什么 BEVFormer 被称为自动驾驶感知的分水岭。

岗位关联

掌握 BEVFormer 的时空 Transformer 范式,你将理解当前绝大多数多摄像头三维感知方案的底层逻辑——这是自动驾驶感知工程师从“调包侠”进阶为“架构师”的必修课。

目录
  1. 可视化演示
  2. 1. 六块屏幕与一张地图(多摄与BEV)
  3. 2. 视线投向东门(查询点机制与空间交叉注意力)
  4. 3. 让记忆对齐坐标系(时序对齐)
  5. 4. 编码器中的“三次开会”(编码器结构)
  6. 5. 从特征到“能踩刹车的理由”(检测预测头)
  7. 6. 成绩单与工程细节(性能与实现)
  8. 7. 分水岭:统一地图的意义(应用与意义)
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示空间交叉注意力从2D图像提取BEV特征、时序自注意力融合历史帧、以及6摄像头360°环视特征融合过程。

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

'+_captions.spatial+'

1. 六块屏幕与一张地图(多摄与BEV)

回到商场寻人任务。面对六块监控屏幕,你的第一反应不是盯着某一块看,而是想:能不能把六块屏幕的信息拼成一张从天花板往下拍的俯视图?这样一来,“门在东北角、扶梯在正西、目标在门和扶梯之间”就变得一目了然。BEVFormer 的第一个核心思想正是如此:把六路环视相机的透视画面,统一映射到一张鸟瞰视角(Bird's Eye View,BEV)的地图上。

但这里有个关键区别:BEVFormer 不是把六张照片像拼图那样物理拼起来,而是先在 BEV 平面上定义一堆“询问位置”,然后让每个位置去各路相机画面里“打听”信息。这片 BEV 平面就是自动驾驶的统一坐标系:无论相机装在车头还是车尾,无论障碍物在左边还是右边,最终都会被描述成“以自车为中心的世界坐标里的一个点”。

在 BEVFormer 中,BEV 平面被划分成网格,每个网格点称为一个 BEV 查询点(BEV Query)。这些查询点是带着任务的“情报员”——它们的任务就是搞清楚自己所在的位置周围到底有什么。查询点还会叠加可学习的位置编码,让网络知道“这个点位于车的左前方 5 米”。

所以,BEVFormer 的输入输出可以一句话概括:输入六路图像和历史地图,输出一张刻画“现在周围发生了什么”的统一地图。这张地图,就是自动驾驶感知系统的“公共语言”。

---

Bt=Encoder(Q,{F1t,F2t,⋯ ,F6t},Bt−1)\displaystyle B_t = \mathrm{Encoder}\left( Q, \left\{ F^t_1, F^t_2, \cdots, F^t_6 \right\}, B_{t-1} \right)
公式读法:t 时刻的 BEV 特征 B_t,是由一组查询点 Q,结合六路相机的当前帧特征 F,再加上上一帧的 BEV 特征 B_{t-1},经过编码器融合得到的。比喻:情报员们(查询点)参考六个监控画面(多摄特征)和刚才的记忆(上一帧 BEV),最终写成一份统一的现场报告。
  1. Q 查询点集合BEV 平面上规则排列的空间位置,每个点自带坐标信息。它是“主动提问的情报员”。
    QQ
  2. F^t_i 第 i 路相机当前帧特征六路相机各自经过骨干网络(如 ResNet)提取的图像特征,相当于六块屏幕上的“线索”。
    {F1t,F2t,⋯ ,F6t}\left\{ F^t_1, F^t_2, \cdots, F^t_6 \right\}
  3. B_{t-1} 上一帧 BEV 特征历史时刻融合好的“旧地图”,是时序列车的“记忆”。
    Bt−1B_{t-1}
  4. Encoder 融合过程整个 Transformer 编码器把查询点、多摄特征、历史特征三者融合,输出当前帧的 BEV 特征。
    Encoder(⋅)\mathrm{Encoder}(\cdot)

2. 视线投向东门(查询点机制与空间交叉注意力)

现在你站在中庭,盯着一张 BEV 平面图,决定先搞清楚“东门”位置的情况。你会怎么做?自然是抬起头,在六块屏幕里找到能看见东门的那几块,然后沿着视线仔细看。BEVFormer 的空间交叉注意力(Spatial Cross-Attention)做的就是这件事。

每个 BEV 查询点会执行一个“两步走”:第一步,把查询点的三维坐标投影到每路相机的图像平面上,得到“该往哪块屏幕看”的参考位置;第二步,以参考位置为中心,在它附近采样几个点,用可变形注意力(Deformable Attention)提取特征。注意,第二步有个精妙之处:查询点不是傻傻地在每个相机画面上均匀扫一遍,而是根据自己的语义特征“学习”应该重点看哪里——就像找人的保安会优先看人群密集的通道,而不是盯着天花板。

可变形注意力是 BEVFormer 高效的关键。传统 Transformer 的注意力要“看遍全场”,计算量随像素数爆炸;可变形注意力只需在每个参考点周围取几个采样点,像找线索时只问几个关键目击者,而不是拦住整条街的人。

这就是“六块屏幕、一个东门”的道理:每个位置的信息,是最多六个视角各贡献几条线索后综合出来的。多摄融合不是像素拼接,而是“线索加权汇总”。

---

SA(Qp, P)=∑i=1Ncam∑k=1NrefDeformAttni(Qp, P(p,i,k), {Fit})\displaystyle \mathrm{SA}\left(Q_p,\ \mathcal{P}\right)=\sum_{i=1}^{N_{\text{cam}}} \sum_{k=1}^{N_{\text{ref}}} \mathrm{DeformAttn}_i\left(Q_p,\ \mathcal{P}(p,i,k),\ \left\{F^t_i\right\}\right)
公式读法:对第 p 个 BEV 查询点,先投影到 N_cam 路相机(通常 6 路),每路再取 N_ref 个采样点(论文里通常是 4 个),分别做可变形注意力,最后求和。比喻:你想了解“东门”的情况,每个看得见东门的机位都投来一条视线,每条视线上再看几个关键位置,最后综合成判断。
  1. 查询点 Q_pBEV 平面上第 p 个位置,比如“东门”。它是所有注意力的发起者。
    QpQ_p
  2. N_cam 路相机遍历对 6 路环视相机逐一处理,找到那些“看得见东门”的视角。
    ∑i=1Ncam\sum_{i=1}^{N_{\text{cam}}}
  3. N_ref 个参考采样点在每条视线上进一步取少量采样点,平衡精度与算力。
    ∑k=1Nref\sum_{k=1}^{N_{\text{ref}}}
  4. 可变形注意力 DeformAttn以投影位置为锚点,在附近做稀疏采样与加权融合,不需要全图扫描。
    DeformAttni(Qp, P(p,i,k), {Fit})\mathrm{DeformAttn}_i\left(Q_p,\ \mathcal{P}(p,i,k),\ \left\{F^t_i\right\}\right)

3. 让记忆对齐坐标系(时序对齐)

上一节的“地图”只是某个瞬间的快照。可车辆在行驶,世界在变化。还记得刚才屏幕里闪过的那个人影吗?如果现在再看一眼东门,他可能已经走到了扶梯旁。要是直接把上一秒的画面和当前的画面叠在一起,你会看到一个人影的重影,就像拍糊了的照片。BEVFormer 如何解决?答案是:时序自注意力(Temporal Self-Attention)配合自车运动补偿。

具体来说,当前时刻的每个 BEV 查询点,除了去六路相机里找线索,还会去“上一帧的 BEV 地图”里找线索。但车辆在运动,上一帧的世界坐标与当前帧的世界坐标已经发生了平移和旋转。如果直接按旧坐标去采样,就会对错位置。因此 BEVFormer 利用自车运动信息(位移+旋转矩阵),先计算一个坐标偏移 Δ,把上一帧的采样位置“搬”到当前坐标系下,再做可变形注意力。这个过程,相当于把昨天的记忆地图平移旋转到今天的位置,让“记忆中的东门”和“现在的东门”严丝合缝地对齐。

时序自注意力让 BEVFormer 拥有了“前后帧联动的记忆”。车辆移动时,记忆中的每个物体都会根据自车运动“自动归位”,上一秒的红灯信息才能正确叠加到当前的判断里。

---

TA(Qp, {Bt−1,S})=DeformAttn(Qp, P(p, Δ), {Bt−1})\displaystyle \mathrm{TA}\left(Q_p,\ \left\{B_{t-1},S\right\}\right) = \mathrm{DeformAttn}\left(Q_p,\ \mathcal{P}(p,\ \Delta),\ \left\{B_{t-1}\right\}\right)
公式读法:当前查询点从上一帧 BEV 特征中采样,采样位置要加上由自车运动 S 推导出的偏移 Δ。比喻:你把昨晚的记忆地图拿出来,先根据车今晚停的位置把所有地标平移旋转,再对照现在看,才不会把“记忆里的树”和“现在的树”当成两棵树。
  1. B_{t-1} 历史 BEV 特征上一时刻融合好的 BEV 地图,相当于你的“短期记忆”。
    Bt−1B_{t-1}
  2. S 自车运动车辆在这两帧之间的位移与旋转,通常表示为 4×4 齐次变换矩阵。
    SS
  3. Δ 坐标偏移由运动 S 推算出的采样坐标补偿量,决定“记忆中的每个点该挪到哪里”。
    Δ=f(S)\Delta = f(S)
  4. 可变形注意力采样带着修正后的采样位置,从历史 BEV 特征中取线索并加权融合。
    DeformAttn(Qp, P(p, Δ),{Bt−1})\mathrm{DeformAttn}\left(Q_p,\ \mathcal{P}(p,\ \Delta), \left\{B_{t-1}\right\}\right)

4. 编码器中的“三次开会”(编码器结构)

我们已经讲了两种注意力机制,而 BEVFormer 的编码器实际上是三种注意力层层协作。假设你是那组 BEV 查询点中的一员,你的一天要参加三场会议:第一场,和所有查询点开内部通气会(自注意力),大家交换一下各自掌握的信息——“我这边看到东门有个人影,你们那边呢?”;第二场,向六路相机开外部调研会(空间交叉注意力),获取当前帧的视觉证据;第三场,向昨天的自己开复盘会(时序自注意力),查看历史 BEV 特征中有无被漏掉的线索。

这三场会议按顺序叠加,形成一个 Transformer 编码器层。论文中这样的层堆叠了 6 层,每一层的输出作为下一层的输入。经过 6 轮迭代,每个查询点的特征从“只知道自己位置在哪”进化到“知道这个位置周围发生了什么、历史上发生过什么”。残差连接和 LayerNorm 保证深层网络依然稳定训练。

经过 6 层这样的“三次开会”,BEV 特征就齐了:既有当前帧的丰富视觉细节,又有历史帧的时序一致性。这张特征图就是后续所有任务(检测、分割)的共享底座。

---

Q′=LayerNorm(Q+SelfAttn(Q)+SA(Q)+TA(Q))\displaystyle Q' = \mathrm{LayerNorm}\left( Q + \mathrm{SelfAttn}(Q) + \mathrm{SA}(Q) + \mathrm{TA}(Q) \right)
公式读法:每个编码器层对查询点 Q 做三件事——自注意力(查询点之间互通)、空间交叉注意力(与当前帧多摄通信)、时序自注意力(与历史帧通信),三者结果加回原 Q,最后归一化。比喻:写一份报告,先让同事传阅内部修改,再找外部专家核实数据,再翻阅去年的档案校准趋势,最后定稿。
  1. SelfAttn 自注意力所有 BEV 查询点之间互相通信,让空间上相邻或语义相关的点共享信息。
    SelfAttn(Q)\mathrm{SelfAttn}(Q)
  2. SA 空间交叉注意力查询点从当前帧六路相机特征中采样融合,获取“现在”的证据。
    SA(Q)\mathrm{SA}(Q)
  3. TA 时序自注意力查询点从上一帧 BEV 特征中采样融合,获取“过去”的证据。
    TA(Q)\mathrm{TA}(Q)
  4. 残差加和与归一化三种注意力的输出与原查询点相加(残差),再经过 LayerNorm,稳定训练。
    LayerNorm(Q+⋅)\mathrm{LayerNorm}(Q + \cdot)

5. 从特征到“能踩刹车的理由”(检测预测头)

BEV 特征图准备好了,但自动驾驶系统真正需要的是具体目标信息:前方 30 米有辆车,它的位置是 (x, y, z),长宽高各多少,朝向如何,是轿车还是卡车——只有拿到这些,规划模块才知道该不该踩刹车。这一步由预测头(Head)完成。

BEVFormer 的 3D 检测头接收 BEV 特征,输出每个目标的 7 个几何参数(中心 x,y,z、长 l、宽 w、高 h、朝向角 θ)和类别概率。从数学上看,这其实就是一个线性映射加分类器:把每个查询点对应的特征向量,映射到 8 维输出(7 维几何 + 1 维类别分布)。关键在于,输入的特征质量极高——由于时空 Transformer 的融合,特征里已经隐式编码了多视角几何关系和时序上下文,所以即使预测头很简单,也能输出准确的 3D 框。

从 BEV 特征到 3D 框,是自动驾驶感知“从看懂到可用”的关键一跳。BEVFormer 让这一跳变得顺理成章:高质量的时空特征,配一个简单的检测头,就能刷新当时的最优成绩。

---

Head(FBEV)=(c^x,c^y,c^z,l^,w^,h^,θ^,p^cls)\displaystyle \mathrm{Head}(F_{\text{BEV}}) = \left( \hat{c}_x, \hat{c}_y, \hat{c}_z, \hat{l}, \hat{w}, \hat{h}, \hat{\theta}, \hat{p}_{\text{cls}} \right)
公式读法:预测头把 BEV 特征映射为 3D 框参数(位置、尺寸、朝向)和类别概率。比喻:你脑中已有一辆车的完整印象,速记员(预测头)把它写成一行表格:位置在哪、多大、朝哪、是什么。
  1. F_BEV 融合后的 BEV 特征编码器输出的特征图,每个查询点携带丰富的时空信息。
    FBEVF_{\text{BEV}}
  2. 三维中心 c_x, c_y, c_z目标在三维世界坐标系中的位置。
    c^x,c^y,c^z\hat{c}_x, \hat{c}_y, \hat{c}_z
  3. 尺寸 l, w, h 与朝向 θ目标的长、宽、高和水平朝向角,构成完整的 3D 包围盒。
    l^,w^,h^,θ^\hat{l}, \hat{w}, \hat{h}, \hat{\theta}
  4. 类别概率 p_cls目标属于某个类别的置信度,比如车、行人、自行车。
    p^cls\hat{p}_{\text{cls}}

6. 成绩单与工程细节(性能与实现)

BEVFormer 在自动驾驶界广泛使用的 nuScenes 数据集上取得了当时最优的成绩:NDS(nuScenes Detection Score)约 48.5%,mAP(平均精度均值)约 41.6%。相比上一代方案 DETR3D(NDS 约 44.5%),提升了约 4 个百分点。这个提升主要来自“显式时序建模”和“BEV 统一网格”两个设计。

工程上,BEVFormer 的高效依赖于可变形注意力带来的稀疏计算。设 BEV 查询点数为 N_q,每路相机采样 N_ref 个点,其复杂度为 O(N_q × N_cam × N_ref),远低于全局注意力的 O(N_q × H × W)。训练时采用两阶段策略:先在单帧数据上预训练骨干和编码器,再加入历史帧微调时序模块,最后用 8 帧历史信息做全量训练。推理时,模型在 V100 上约 1.7 FPS,经过 TensorRT 加速后可在车载芯片上接近实时。

1. NDS 48.5%:nuScenes 官方综合指标,兼顾检测精度与速度、朝向等属性误差。

NDS=48.5%\mathrm{NDS} = 48.5\%

2. mAP 41.6%:平均精度均值,衡量检测框的正确率与召回率。

mAP=41.6%\mathrm{mAP} = 41.6\%

3. 复杂度上界:计算量由查询点数、相机数、采样点数共同决定,与图像全分辨率解耦。

O(Nq×Ncam×Nref)\mathcal{O}(N_q \times N_{\text{cam}} \times N_{\text{ref}})

4. 两阶段训练:先单帧预训练稳定特征提取,再时序微调让记忆模块生效。

Stage 1: single-frame→Stage 2: temporal\text{Stage 1: single-frame} \rightarrow \text{Stage 2: temporal}

BEVFormer 的成绩单证明了:把多摄像头与时序信息放进同一个 Transformer 框架,不仅可行,而且显著优于此前“各模块拼凑”的方案。这也是它被后续大量工作引用的根本原因。

---

7. 分水岭:统一地图的意义(应用与意义)

BEVFormer 真正的历史贡献,不只是刷新了一个分数,而是确立了“BEV 统一感知”这一范式。在它之前,多摄像头 3D 检测往往是“每路相机单独出框,再在后处理里合并”,结果冲突多、精度低、扩展性差。BEVFormer 之后,感知、预测、规划可以共享同一个 BEV 特征:检测头从 BEV 特征里出 3D 框,分割头从 BEV 特征里画车道线,预测模块从 BEV 特征里推未来轨迹——一张地图,多方获益。

当然,这个范式也面临现实挑战:BEV 网格分辨率越高、时序帧数越多,显存和算力压力越大;车规级芯片上要跑到实时,仍需量化、剪枝、TensorRT 优化。此外,新一代方法(如 BEVFormer V2、UniAD)已经把 BEV 感知推进到“端到端决策”,让特征直接驱动规划,减少信息在模块间传递时的损耗。

BEVFormer 让我们看到自动驾驶感知的未来形态:所有传感器、所有时刻的信息,最终汇聚成一张“会思考的地图”。这张地图既是工程师的分析工具,也是自动驾驶汽车理解世界的核心方式。

FBEV→{Detection, Segmentation, Prediction, Planning}\displaystyle F_{\text{BEV}} \rightarrow \left\{ \mathrm{Detection},\ \mathrm{Segmentation},\ \mathrm{Prediction},\ \mathrm{Planning} \right\}
公式读法:BEV 特征成为下游所有任务的统一输入。比喻:一张精确的商场俯瞰图,既能用来找人,也能用来规划最优路线,还能用来统计客流——一份地图,多种用途。
  1. F_BEV 统一特征一张特征图承载整个车周环境的语义与几何信息。
    FBEVF_{\text{BEV}}
  2. 检测 Detection从特征中回归 3D 框与类别。
    Detection\mathrm{Detection}
  3. 分割 Segmentation对 BEV 平面做像素级分类,如车道、路沿、可行驶区域。
    Segmentation\mathrm{Segmentation}
  4. 预测与规划预测模块读取历史 BEV 序列推测目标轨迹,规划模块直接生成行驶路径。
    Prediction, Planning\mathrm{Prediction},\ \mathrm{Planning}

AI 应用场景

场景一:多摄像头停车场巡场机器人

阶段:感知(多摄像头特征提取与融合)

解决的问题:停车场巡逻机器人装有 6 路鱼眼相机,传统方法每路相机单独做目标检测,同一辆车被多路相机重复标注,无法判断“哪个框是真的”。BEVFormer 范式把 6 路画面统一到 BEV 地图,车辆在世界坐标里只出现一次,直接输出 3D 框。

具体案例:某园区部署 BEVFormer 改造成巡检机器人,在 2000 平方米地下车库实现 97% 行人避障率与 92% 车位检测精度,误检率比多路独立检测下降 60%。

场景二:自动泊车辅助系统(APA)

阶段:感知 + 定位

解决的问题:自动泊车需要 360° 无死角感知,单摄像头侧向盲区大。BEVFormer 的环视+时序融合可以做到“车刚开过,车位信息还在脑子里”,泊车时能记住刚经过的空位,实现记忆泊车。

具体案例:量产泊车系统中,BEVFormer 类似架构以 30+ FPS 在车载 Orin 芯片跑通,实现 80cm 窄车位泊入与“召唤”功能。

场景三:Robotaxi 城市道路 3D 感知

阶段:感知(3D 目标检测与跟踪)

解决的问题:Robotaxi 面对复杂城市场景,需要精确 3D 框供规划避让。BEVFormer 的多摄像头时序融合使 50m 内行人、车辆召回率显著高于单目方案。

具体案例:某 Robotaxi 公司用 BEVFormer 替换后融合检测器后,远距离目标(30-50m)漏检率下降约 45%,接管率明显改善。

Python 演示

python65 行
import torchimport torch.nn as nnimport torch.nn.functional as F  class DeformableCrossAttention(nn.Module):    """ 简化版可变形交叉注意力:每个 BEV 查询点从 6 路相机采样 """     def __init__(self, embed_dim=256, num_cams=6, num_points=4):        super().__init__()        self.embed_dim = embed_dim        self.num_cams = num_cams        self.num_points = num_points         # 用全连接层为每个查询点预测采样偏移与注意力权重        self.sampling_offset = nn.Linear(embed_dim, num_cams * num_points * 2)        self.attn_weight = nn.Linear(embed_dim, num_cams * num_points)        self.value_proj = nn.Linear(embed_dim, embed_dim)        self.output_proj = nn.Linear(embed_dim, embed_dim)     def forward(self, query, cam_feats):        """        query: (B, Nq, C)              BEV 平面查询点        cam_feats: (B, 6, H, W, C)     六路相机特征        """        B, Nq, C = query.shape        H, W = cam_feats.shape[2], cam_feats.shape[3]         # 1) 预测每个查询点在每路相机上的采样位置与权重        offsets = self.sampling_offset(query).view(B, Nq, self.num_cams, self.num_points, 2)        weights = torch.softmax(            self.attn_weight(query).view(B, Nq, self.num_cams, self.num_points),            dim=-1        )         # 2) 对每路相机特征做可变形采样(简化:用归一化网格采样)        outputs = []        for cam_id in range(self.num_cams):            feat = cam_feats[:, cam_id].permute(0, 3, 1, 2)  # (B, C, H, W)            base_y = torch.linspace(-1, 1, H).view(-1, 1).repeat(1, W)            base_x = torch.linspace(-1, 1, W).view(1, -1).repeat(H, 1)            grid = torch.stack([base_x, base_y], dim=-1).unsqueeze(0).repeat(B, 1, 1, 1)            sampled = F.grid_sample(feat, grid, align_corners=False)  # (B, C, H, W)            sampled = sampled.mean(dim=(2, 3))  # 简化为全局池化            outputs.append(sampled)         # 3) 按权重加权聚合各路相机采样特征        feat_stack = torch.stack(outputs, dim=1).unsqueeze(2)  # (B, Nq, 1, 6, C)        weights = weights.unsqueeze(-1)  # (B, Nq, 6, 4, 1)        agg = (feat_stack * weights[:, :, 0, :, :]).sum(dim=3)  # 简化聚合        return self.output_proj(agg)  if __name__ == "__main__":    torch.manual_seed(0)    B, Nq, C = 1, 100, 256    query = torch.randn(B, Nq, C)    cam_feats = torch.randn(B, 6, 16, 16, C)     model = DeformableCrossAttention(embed_dim=C)    out = model(query, cam_feats)    print("输入查询点形状:", tuple(query.shape))    print("输出融合特征形状:", tuple(out.shape))    assert out.shape == (B, Nq, C), "输出形状需保持 (B, Nq, C)"    print("简化版空间交叉注意力前向通过!")
目的:演示 BEVFormer 空间交叉注意力模块的简化版 PyTorch 实现:六路相机特征通过采样与加权聚合,融合到 BEV 查询点特征上。
  1. self.sampling_offset = nn.Linear(embed_dim, ...)让每个查询点自己学习“该往相机画面哪里看”,对应可变形注意力中的采样偏移。
  2. torch.softmax(...)对每路相机、每个采样点的注意力权重归一化,保证权重和为 1。
  3. F.grid_sample(feat, grid, align_corners=False)双线性插值采样,实现“目光聚焦画面关键位置”。
  4. torch.stack(outputs, dim=1)把六路相机采样结果堆叠起来,准备加权融合。
  5. assert out.shape == (B, Nq, C)验证输出形状不变,确保 BEV 查询点数量与特征维度在融合中保持一致。

常见误区

误区我觉得 BEVFormer 就是把 6 路摄像头拍到的画面简单拼接成一张大图,再丢给神经网络,就变成 BEV 了。

正解BEVFormer 不是像素级拼接,而是把每路特征图通过可变形注意力重新映射到 BEV 世界坐标系的查询点上。每个 BEV 查询点都去各路相机画面中寻找与自己相关的线索,像六个人从不同角度描述同一个地点,最后由主持人(查询点)综合成一份统一描述——而不是把六张照片物理粘在一起。

为何常见:因为“俯视图拼接”在业内确实存在(如基于 IPM 的鸟瞰图拼接),初学者很容易联想到这种做法,误以为 BEVFormer 也在做类似的贴图。

误区BEV 图是俯视图,我应该能直接从里面读出物体高度、遮挡关系,甚至直接量出 3D 框。

正解BEV 图本质上是一个二维网格上的高维特征图,不是卫星地图那样的 RGB 图像。3D 框的 x,y,z、长宽高、朝向是解码头从特征里推算出来的,不是直接在 BEV 图上量出来的。BEV 特征里包含的信息是隐式的,需要网络学习解码。

为何常见:人眼看到俯视图会自然联想到上帝视角地图,常识上会觉得俯视图直接带高度信息,但这个类比在特征层面并不成立。

误区把上一帧特征和当前帧特征做一个逐元素相加就是时序融合了,简单又高效。

正解直接相加会导致移动物体错位:上一秒的车在左边,下一秒车开到右边,如果位置不变地叠加,同一个物体会变成重影。BEVFormer 的时序自注意力要先做坐标对齐(自车运动补偿),再用可变形注意力让每个查询点主动去上一帧“正确的新位置”采样。简单说:它不是把照片叠一起,而是把记忆搬到当前坐标系后,再融合。

为何常见:初学者从 ResNet 的残差相加类比过来,且没有意识到 BEV 坐标系是随车移动的,才会误以为直接相加可行。

误区既然 BEVFormer 是 Transformer 做注意力,那它应该能从像素里自适应学出空间关系,不需要相机内外参。

正解相机外参(位置、朝向)决定了三维参考点在相机图像上的投影位置,这是“查询点去哪个像素采样”的物理前提。BEVFormer 在构造采样点投影时需要用到内外参;参数学得再好,没有标定,几何关系就是错的,注意力就会问错地方。

为何常见:端到端学习的思想深入人心,让大家误以为所有几何知识都能从数据中硬学出来。但多视图几何的硬约束(投影关系)依然是减少搜索空间、保证泛化性的关键。

误区自动驾驶现在是端到端大模型时代,BEVFormer 这种“老”方法已经过时,学它没有意义。

正解BEVFormer 代表“多视图+时序+Transformer 统一感知”的核心范式,大量新方法(如 BEVFormer V2、UniAD、Sparse4D)都在其基础上扩展。Transformer 做 BEV 融合依然是行业主流底座之一。学 BEVFormer 不是背老旧论文,而是学“问题该如何建模”。

为何常见:自媒体喜欢强调颠覆和新架构,让人误以为新方法完全抛弃旧思想。实际上学术演进往往是迭代式改进,新方法大多站在前人的肩膀上。

面试题

Q1. BEVFormer 中"BEV"指的是什么空间?

单选题 · easy

  • A.鸟瞰视角下的世界坐标系← 正确答案
  • B.图像像素坐标系
  • C.雷达点云坐标系
  • D.相机归一化平面

答案:A。BEV(Bird's Eye View)即鸟瞰视角,是车辆周围世界地平面的俯视图坐标系。B(像素)、D(归一化平面)都是图像域,C 是雷达域。BEV 统一空间正是 BEVFormer 整合多摄、时序等异构信息的“公共地图”。

Q2. BEVFormer 中“空间交叉注意力”主要负责什么?

单选题 · easy

  • A.融合上一帧的 BEV 特征
  • B.将 BEV 查询点与当前帧多摄特征关联← 正确答案
  • C.对相机内参做标定
  • D.生成车道线分割结果

答案:B。空间交叉注意力(Spatial Cross-Attention)的作用是让每个 BEV 查询点从当前帧六路相机特征中采样线索,完成“从多视角图像到统一 BEV 特征”的融合。A 是时序自注意力做的事,C 属于标定流程,D 是分割头的事。

Q3. 时序自注意力融合前一帧 BEV 特征时,必须进行哪一步操作?

单选题 · mid

  • A.对图像做直方图均衡化
  • B.用自车运动对采样坐标进行偏移补偿← 正确答案
  • C.对特征做随机 Dropout
  • D.对 BEV 图做边缘检测

答案:B。车辆运动导致坐标系变化,直接把上一帧 BEV 特征叠加会产生错位。BEVFormer 利用自车运动信息(位移+旋转)对采样坐标做偏移补偿,使“记忆”对齐到当前坐标系。A、C、D 均不涉及坐标对齐。

Q4. BEVFormer 编码器中不包含以下哪一层?

单选题 · mid

  • A.自注意力层
  • B.空间交叉注意力层
  • C.时序自注意力层
  • D.循环神经网络层← 正确答案

答案:D。BEVFormer 编码器由自注意力(查询点间通信)、空间交叉注意力(关联多摄)、时序自注意力(关联历史 BEV)构成,不包含 RNN。A/B/C 均是其组成层,D 是唯一不属于该 Transformer 编码器的结构。

Q5. 关于 BEVFormer 的注意力机制,下列说法正确的是:

单选题 · hard

  • A.空间交叉注意力是全局稠密注意力
  • B.可变形注意力只在采样点附近计算注意力← 正确答案
  • C.时序自注意力不依赖自车运动
  • D.自注意力层只处理图像特征

答案:B。BEVFormer 采用可变形注意力,只对参考点附近的少量采样点做注意力计算,以降低计算量,B 正确。A 恰好相反(它本质是稀疏的);C 错误,时序自注意力依赖运动补偿;D 错误,自注意力层处理的是 BEV 查询点,不是图像像素。

Q6. BEVFormer 相比单目 3D 检测的优势包括哪些?

多选题 · mid

  • A.可利用多个视角的互补信息← 正确答案
  • B.可对时序信息进行显式建模← 正确答案
  • C.在统一 BEV 坐标下做多任务感知← 正确答案
  • D.不需要相机标定即可工作

答案:ABC。BEVFormer 的核心优势正是多视角融合、时序建模与 BEV 统一坐标系,因此 A、B、C 均正确。D 错误:BEVFormer 的采样点投影依赖相机内外参,标定是必要前提。

Q7. BEVFormer 论文在 3D 检测任务上的主要评测数据集是哪个?

单选题 · easy

  • A.COCO
  • B.ImageNet
  • C.nuScenes← 正确答案
  • D.KITTI

答案:C。BEVFormer 在 nuScenes 数据集上验证性能,NDS 约 48.5%、mAP 约 41.6%。COCO/ImageNet 是 2D 视觉数据集;KITTI 是单目/立体 3D 检测常用数据集,但 BEVFormer 论文主要在 nuScenes 上报告环视 BEV 指标。

Q8. BEV 查询点(BEV Queries)的主要作用是什么?

单选题 · mid

  • A.存储相机原始图像
  • B.代表鸟瞰图上的空间位置并聚合多摄特征← 正确答案
  • C.完成图像分割的像素分类
  • D.保存雷达的点云数据

答案:B。BEV Queries 是一组在 BEV 平面上排列的网格向量,每个查询点代表一个空间位置。它们与多摄像头特征、历史 BEV 特征做注意力,逐步聚合出该位置的环境信息。A、D 是数据存储,C 是像素级任务,均与查询点的“位置特征聚合”角色无关。

Q9. 下列哪些操作属于 BEVFormer 降低计算量的关键技术?

多选题 · hard

  • A.仅在参考点周围采样少量点← 正确答案
  • B.使用可变形注意力← 正确答案
  • C.用全局稠密注意力遍历所有像素
  • D.限制 BEV 查询点数量← 正确答案

答案:ABD。可变形注意力只对参考点附近的少量采样点计算(A、B),避免全局注意力高复杂度;BEV 查询点数量是人为设定的网格分辨率,限制数量可控制显存(D)。C 是传统 Transformer 的做法,算力开销大,被 BEVFormer 刻意避免。

Q10. 关于 BEVFormer 的时序感知,下列说法最准确的是:

单选题 · extreme

  • A.直接把历史特征相加,无需坐标变换
  • B.通过自车运动补偿后,用可变形注意力从历史 BEV 中采样← 正确答案
  • C.仅用 LSTM 记忆历史信息
  • D.时序模块在训练时不依赖历史帧

答案:B。BEVFormer 的时序自注意力先用自车运动(位移+旋转)对历史 BEV 特征采样坐标做补偿,再用可变形注意力进行特征融合,B 正确。A 忽略对齐会产生重影;C 是另一类时序建模但与 BEVFormer 实现不符;D 错误,训练阶段需喂入历史帧。这正呼应了“记忆必须搬家才能与当下叠加”的比喻。