资料来源:
https://github.com/zhiqi-li/BEVFormer
知识补充:
地图分割 是在鸟瞰 BEV 俯视平面上,对车辆周边每一块地面网格做语义分类,每一个 BEV 网格单元会被打上道路、车道线、人行道、绿化带、隔离带、路口、停止线等道路静态元素类别标签。
相机相比于激光雷达的优势:
-
便宜省钱
-
相机就像人的眼睛 ,虽然测不准绝对距离,但能看懂这个世界长啥样、是什么颜色;而雷达像盲人探路,虽然量距离极准,但没有色彩和细节。
摘要:
自动驾驶系统中的3D 视觉感知任务包含3D 目标检测、地图分割等。
BEVFormer借助时空 Transformer,创新性的地开创了pv to bev的新范式。
BEVFormer 利用预先定义的网格状 BEV 查询向量,分别与空间、时序维度交互,同步挖掘空间与时序信息。
为聚合空间特征,本文设计空间交叉注意力机制:每一个 BEV 查询向量都会从各相机视角的感兴趣区域提取空间特征。
针对时序信息,提出时序自注意力机制,循环融合历史帧的 BEV 特征。
全局网络架构图(Overall Architecture)

BEVFormer 共包含 6 层编码器。每层编码器沿用标准 Transformer 基础结构 42.
并增设三项定制化核心模块:BEV 查询向量、空间交叉注意力、时序自注意力。
BEV 查询向量为网格形状的可学习参数,作用是通过注意力机制,从多相机视角图像中检索 BEV 空间对应的视觉特征;
空间交叉注意力与时序自注意力是配合 BEV 查询工作的两层注意力模块,分别依据 BEV 查询从多相机图像中提取聚合空间特征、从历史 BEV 特征中提取聚合时序特征。
核心推理流程:

补充理解:
1. PV toBEV 的本质就是做特征融合,如何把多个相机的2D图像特征给融合成一个3D的BEV特征
-
PV toBEV 的难点就在于,BEV中每一个网格都相当于一个高维特征,这个高维特征可能和所有相机中的每一个特征都有关系,所以单独一个网格就得要对所有2D图像特征做运算,而至少又有200*200=4w个网格,所以计算量是非常夸张的,对于GPU以及显存都有非常高的要求。如何算力负担小,算得又准就是BEVformer的贡献。
-
BEVformer针对的是纯视觉的方案,没有雷达数据。
-
BEV 特征是三维张量,三个维度:高度 H、宽度 W、通道 C
-
特征在数学层面就是张量
-
BEV 平面内每个网格对应现实世界s米的实际尺寸,BEV 特征图中心默认对齐自车坐标系原点。BEV的尺寸,每个网格点之间的距离都是我们自己定的,决定了我们想要看到自车多大范围内的东西,想要看的多细致。
-
BEV 查询向量会叠加上可学习的位置编码。
-
所有五花八门的注意力变体,底层全部只是一套线性代数数学运算,只是加了不同约束、权重变换、分块、归一化、掩码改造,没有跳出矩阵运算的本质。
-
所有注意力机制 = **线性投影(矩阵乘)+ 相似度度量(点积 / 其他核函数)+ 归一化权重(softmax)+ 加权聚合值特征,**任何变种都不会脱离这个四步数学流水线,区别只在于:
- 哪些 token 允许互相计算(掩码 / 稀疏)
- 相似度怎么算(点积、余弦、线性近似)
- 中间加不加额外变换(旋转、门控、动态维度)
- BEV的输入:

-
时序注意力机制:bev特征在提取图像特征之前,会和上一帧的bev特征(上一帧不是只是上一帧,而是融合了历史信息的)做一个时序自注意力机制,其实本质上就是做了一个可变形注意力机制。因为上一帧的特侦图与当前的查询向量Q的维度是相同的,但是时间上是不同的(差了一帧),所以他们所在的物理坐标系是错位的,也就是同一个坐标点对应的物体是不同的,所以第一步就是得要先做一下平移跟旋转矩阵,让他们在时空上对齐。然后下一步说的简单一点,说到具体某一个网格上(某一个特征)上,就是先通过全连接层看一下该网格与上一帧的哪几个网格有关系(也就是先学一下偏移量),同时通过全连接层看一下这几个网格对于该网格的重要性(权重)是多少,然后再让这几个网格做一个加权融合得到当前的这个网格(特征)。从而让当前帧的bev有了一个初值,有了一个先验特征,有了历史的时序信息。
-
时序注意力机制的作用:获得历史信息,解决物理遮挡导致的特征归零,求解速度与加速度,时序滤波抑制噪声
-
空间交叉注意力机制:在做空间交叉注意力机制之前,有一个升维的动作,这个动作的作用就在于解决二维网格索引缺乏 z 轴高度信息的问题。因为单个Q向量对应的坐标可以通过网格的分辨率,网格尺寸转换到以实车为中心的坐标系下的真实物理坐标P(x,y),然后对该坐标进行升维,得到(x,y,z0),(x,y,z1),(x,y,z2)......。然后再通过相机内外参矩阵,就可以把这些坐标对应投射到多个相机中具体的像素点位置A,B,C上。 此时这个Q向量还得要做一次可变性注意力机制,输出坐标偏移量,与权重。 然后把这个坐标偏移量加到对应的像素点位置A,B,C上。提取这些坐标上的特征,乘以对应的权重,然后加权融合赋值给Q。这样就完成了从相机二维特征到 BEV 三维特征的空间信息转移。核心作用:从各个视角的相机图像中,提取多视角特征。
论文读过,大概细节原理了解过,源码看过,服务器上浅跑过,debug了一下
BEVformer的一个提升思路:
-
使用多尺度特征特征图:因为在开车的时候,我们的注意力,我们的视线看到的物体的尺寸其实是不一样的,所以如果我们使用不同分辨率的图像作为输入,使得能够提取出不同尺度的特征图,能够模型能够认识更高层的语义与特征。
-
可变性注意力机制中的全连接换成卷积网络,使用更大的卷积核,能够得到更准确的偏移量与权重
-
使用更强大的backbone对图像进行特征提取
-
bevformer是基于纯视觉的,如果加上雷达数据,做多模态融合,应该能涨点不少
Bevformer训练全流程



注意力机制本质上就是一系列的矩阵运算 ,以bevformer为例
1. Q, K, V 到底是什么
在神经网络中,Q、K、V 是三个矩阵:
- Query (Q):
1. 它的物理形态:一个多维矩阵
在自动驾驶系统中,如果我们设定车辆周围的 BEV 鸟瞰图范围是
,并且把网格分辨率设定为
,那么整个 BEV 空间就会被划分成 200 × 200 = 40,000 个网格。
对于这 40,000 个网格中的每一个网格,系统都会初始化一个长度通常为 256 的一维浮点数数组(即向量)。
因此,在这个例子中,完整的 Query (Q) 矩阵的维度(Shape)就是
[40000, 256]。2. 它如何"代表"空间位置?(核心机制:位置编码)
为了让这个向量真正与物理空间绑定,算法会强制注入位置编码(Positional Encoding),并直接加到256向量当中。
3. 这 256 个数字代表什么意思?
"我在哪里": 这是由刚才注入的正余弦位置编码决定的。当它去和图像特征矩阵 Key(K)做点积乘法时,如果 Key 里面也包含了类似的物理位置编码,两者点积的数值就会激增,从而在数学上锁定目标区域。
"我要提取的特征": 这个向量的基础数值在网络初始阶段是随机的,但在成千上万次的数据训练中,它是通过反向传播(Backpropagation)不断更新的可学习参数(Learnable Parameters)。
它会被训练成一种特定的"滤波器"------例如,某一行代表"车道线"的数值可能会被训练得特别大,以便更敏锐地捕捉图像矩阵 Value (V) 中关于白色线条的数值特征。
- Key (K): 它是相机图像经过卷积网络处理后,代表每个像素点空间位置的特征向量 。
1. 它的物理形态:图像展平后的二维矩阵
环视相机(比如 6 个摄像头)拍到的原始图像是庞大的 3D 张量(RGB 通道 *高 * 宽)。在进入 Transformer 之前,这些图像必须经过"预处理"。
特征提取与降维: 原始图像会先通过一个骨干网络(如 ResNet),变成尺寸较小的"特征图"(Feature Map)。假设一张特征图的分辨率是
像素。
展平操作(Flatten): 矩阵运算需要规整的维度。系统会把这
的特征图强行展平,变成 1024 个特征点。如果车上有 6 个相机,加起来就是
个特征点。
维度对齐: 为了能和上一节长度为 256 的 Query (Q) 进行数学运算,系统会用一个线性层把这些特征点统一映射到 256 维。
最终形态: 此时,Key (K) 矩阵在显存中的维度(Shape)通常就是
[6144, 256]。这代表有 6144 个图像特征点,每个点由 256 个浮点数来描述。2. 它内部的 256 个数字包含了什么?
就像 Q 包含了"目标位置"和"寻找意图"一样,K 矩阵里的这 256 个浮点数也叠加了两种数学信息:
视觉特征信息: 骨干网络从图像中提取的数值化特征(如边缘的梯度值、特定纹理的激活值)。
相机位置编码: 类似于 Q 的位置编码,系统也会生成一组正余弦数值,代表这个特征点"属于哪个相机(前视还是后视)"以及"在该相机画面中的哪个像素坐标"。这组位置编码同样会被加(Add)到视觉特征向量中。
因此,K 矩阵中的每一行向量,表示:"我是什么画面特征" 以及 "我在 2D 图像的哪个物理位置" 。
- Value (V):
1. 它的物理形态:与 K 矩阵同源的二维矩阵
V 矩阵的数据来源和 K 矩阵是一模一样的,都是那 6 个环视相机经过骨干网络提取并展平后的特征图。
- 它内部的 256 个数字包含了什么?(与 K 的核心区别)
虽然 K 和 V 同源,但它们在数学网络的分支处理上有所不同:
K 矩阵(定位用): 包含了视觉特征叠加位置编码(Positional Encoding) 。它的任务是和 Q 做点积,帮助 Q 进行空间坐标的匹配。
V 矩阵(内容实体): 通常只保留纯粹的视觉特征数值(Image Features)。它代表的是那个像素点"长什么样",而不是"它在哪里"。
2. 所谓的"搜寻与融合"
其实底层执行的是严格的数学公式:
这个公式可以拆解为三个无感情的计算步骤:
-
第一步:计算相关性矩阵(向量点积
) ,建立空间联系 。在线性代数中,两个向量的点积结果代表它们的相似度。如果 BEV 坐标和图像像素坐标在空间映射上高度匹配,点积的数值就会非常大;反之很小
-
第二步:计算权重分布(Softmax 操作)
-
将上一步得出的大量数值输入 softmax 函数。该函数会在数学上将这些数值转化为一个概率分布(总和为 1 的权重值)。高度相关的像素位置,权重会被放大。不相关区域的权重接近 0。
得到的 40000, 6144 矩阵(经过softmax后)的含义
前置条件:
矩阵的维度是 40000, 256 ,
矩阵的维度是 256, 6144 。相乘并经过 Softmax 之后,得到维度为 40000, 6144 的权重矩阵。
**该矩阵的实际含义:**它是一个巨大的对应关系表,在数学上描述了 3D 俯视空间(BEV)与 2D 透视空间(多相机图像)之间的几何联系 ,只记录"物理位置与像素位置的匹配度"。
每个元素
代表什么: 矩阵中的第
行、第
列的元素(一个位于 0 到 1 之间的小数),代表第 i 个 BEV 网格,与第 j 个图像特征点的关联度有多高
- 第三步:特征的加权求和(乘以
),提取视觉特征。 将上一步算出的权重矩阵去乘以图像实际的视觉特征矩阵
。因为不相关区域的权重接近 0,相乘后(
)其特征就被过滤掉了;而相关区域的特征保留了下来,并通过加权求和的方式,合并写入到当前计算的 BEV 网格张量中 。
解析 40000, 6144 权重矩阵
6144, 256 得到的新矩阵
该矩阵的实际含义:填充了真实视觉数据的 BEV 特征图(BEV Feature Map)。 原本的 Q 矩阵 40000, 256 虽然代表 BEV 网格,但里面的数值主要是位置编码,没有实际画面 。而经过这次乘法生成的新矩阵 40000, 256,已经利用权重矩阵从 V 中"吸取"了真正的视觉数据(如车辆边缘、车道线语义)。
每个元素
代表什么:
新矩阵中第 i 行、第 k 列的数值,代表第 i 个 BEV 网格,在第 k 个视觉特征维度上的具体绝对数值。
- 在线性代数的底层,这个单一的数值
,是把 V 矩阵中所有 6144 个像素在第 k 维度(每个维度都是6144)的特征值,按照权重矩阵第 i 行的 6144 个小数比例,进行加权求和(相乘再相加)得出的最终结果 。
如何理解第 k 个视觉特征维度:
在普通的rgb照片中,一共有3个视觉特征维度,分别是R(红)、G(绿)、B(蓝),假设是6144*3。
但是在神经网络中,一张照片可能会被重新构建为高维的特征向量,假如是6144*256.
这就意味着他的特征维度编程了256,也就是通道数变成了256.
也就是说,现在 2D 图像上的每一个特征点(像素点),不再是由 3 个数字描述(加权组合得到),而是由 256 个浮点数组成的数组来描述。
不同于 RGB 是人类定义的物理规则,这 256 个维度的具体含义,是神经网络在成千上万次的训练中自己摸索并定义出来的抽象语义概念 。
虽然网络不会输出文字告诉你每个维度是什么,但通过反向推导,我们通常能发现它们各自有了明确的分工:
比如 k=10 时: 这个维度可能被训练成了专门对"白色车道线"敏感的激活值 。如果原图那个位置拍到了车道线,这第 10 个数字就会飙得极高。
比如 k=45 时: 这个维度可能专门记录"车辆金属边缘的梯度值" 。
比如 k=200 时: 这个维度可能对"红绿灯的红色光晕"产生强烈的数值响应。
一句话总结:
注意力机制没有意识是通过计算矩阵向量之间的点积来生成权重,然后利用这些权重对图像特征矩阵进行加权求和。这是一种纯粹基于数值相似度进行信息过滤和提取的数学操作。