BEV query 式图片点云视觉特征融合
从BEV查询图像
BEVFormer的核心思想是 “从BEV查询图像”。它首先在BEV空间中定义一组“查询员”(BEV Queries),然后让每个“查询员”主动地、有选择性地去多个摄像头的图像中“拉取”自己所需的信息,从而构建出最终的BEV特征图。
假设我们的目标是生成一个 200x200
大小的BEV特征图,每个位置用一个 256
维的向量表示。
步骤 1: 初始化BEV查询向量 (BEV Queries)
- 操作: 创建BEV特征图的“骨架”。
- 输入: 无。这是一个初始化学到的参数。
- 输出: 一个张量
bev_queries
,形状为[40000, 256]
。40000
是BEV网格的总点数 (200 * 200
)。256
是每个BEV位置的特征维度C
。
- 含义: 这里的每一个
bev_query
向量都是一个可学习的“占位符”。它代表了BEV空间中一个独一无二的、具体的位置(例如,第0号查询向量代表BEV网格的(0,0)
位置)。在初始状态,它不包含任何关于场景的信息,它的任务就是去“填充”自己。
步骤 2: 生成3D参考点 (3D Reference Points)
- 操作: 将抽象的BEV查询向量与真实世界的三维空间位置关联起来。
- 输入: BEV网格的坐标。
- 输出: 一个张量
reference_points_3d
,形状为[40000, 3]
。 - 含义与流程:
- 我们知道每个
bev_query
对应BEV网格中的一个索引(i, j)
。 - 根据预先定义的BEV物理范围(例如,x轴从-50米到+50米,y轴从-50米到+50米),可以将网格索引
(i, j)
转换为自车坐标系下的一个具体的(x, y)
坐标。 z
坐标通常被假定在一个或几个固定的高度,例如地面z=0
。- 这样,每个
bev_query
就拥有了一个与之对应的、在自车坐标系下的三维空间锚点(x, y, z)
。例如,第k
号bev_query
可能对应于自车前方10米、左侧3米的地面位置。
- 我们知道每个
步骤 3: 将3D参考点投影至2D图像平面
- 操作: 计算每个3D参考点会出现在哪些摄像头的哪个像素位置。
- 输入:
reference_points_3d
(形状[40000, 3]
)- 所有相机的内外参数矩阵 (Camera Intrinsics & Extrinsics)。外参定义了相机在自车坐标系中的位置和姿态;内参定义了相机的成像模型(焦距等)。
- 输出: 一个张量
reference_points_2d
,形状为[40000, N_cam, 2]
。N_cam
是相机的数量(例如6)。- 最后的
2
代表每个相机图像上的(u, v)
像素坐标。
- 含义与流程:
- 对40000个3D参考点中的每一个点
(x, y, z)
。 - 遍历
N_cam
个相机。 - 使用每个相机的外参矩阵,将点
(x, y, z)
从自车坐标系变换到该相机的坐标系。 - 使用该相机的内参矩阵,将相机坐标系下的点投影到其2D图像平面上,得到像素坐标
(u, v)
。 - 同时,记录下哪些点投影后超出了图像边界或者在相机后方,这些点对于该相机是无效的。
- 对40000个3D参考点中的每一个点
- 实例: 经过这一步,模型知道了:对于BEV网格中代表“车前10米,左侧3米”的那个
bev_query
,它应该去前置摄像头的(450, 320)
像素位置和左前摄像头的(880, 350)
像素位置寻找视觉信息。
步骤 4: 通过可变形注意力机制采样图像特征
这是整个流程的核心。它在标准的注意力机制上做了改进。
- 操作:
bev_query
作为查询(Query),从多尺度图像特征图中采样信息来更新自身。 - 输入:
- Q (Query):
bev_queries
(形状[40000, 256]
)。 - K (Key) & V (Value): 来自图像骨干网络(如ResNet)输出的多尺度2D特征图。这些特征图是形状类似于
[N_cam, C, H_img, W_img]
的张量。 - Reference Points:
reference_points_2d
(形状[40000, N_cam, 2]
),它告诉注意力机制应该去哪里采样。
- Q (Query):
- 输出: 一个更新后的
bev_queries
张量,形状仍为[40000, 256]
,但现在填充了从图像中提取的视觉信息。 - 详细流程:
- 对于每一个
bev_query
,模型通过一个微小的全连接网络,基于bev_query
自身,预测出一组采样点偏移量 (sampling offsets) 和注意力权重 (attention weights)。假设模型要采样M
个点(例如M=4
)。 - 这些偏移量被加到步骤3中计算出的2D参考点
(u, v)
上,得到M
个最终的、精确的采样坐标。例如,参考点是(450, 320)
,模型可能会学会去(448, 319)
,(452, 321)
,(450, 330)
,(450, 310)
这四个位置采样,因为这可能对应物体的不同部分,能提供更丰富的上下文。 - 模型使用双线性插值,从2D图像特征图中精确地提取出这
M
个采样点的特征向量。 - 之前预测出的注意力权重被应用到这
M
个特征向量上,进行加权求和。这允许模型动态地决定这M
个采样点中,哪个更重要。 - 这个加权求和后的特征向量,最终被用来更新
bev_query
。
- 对于每一个
- 含义: 这一步极其关键。它没有被动地接收投影信息,而是让每个BEV位置主动地、智能地去图像的多个相关位置进行探索和采样,从而汇集最有效的视觉证据。
步骤 5: BEV空间内的信息交互 (BEV Self-Attention)
- 操作: 在BEV特征图内部进行信息传递,增强空间上下文感知。
- 输入: 经过步骤4更新后的
bev_queries
。 - 输出: 再次更新的
bev_queries
。 - 含义与流程:
- 模型应用一个标准的自注意力(Self-Attention)层。
- 每个
bev_query
都会与其他所有的bev_query
计算相似度,并根据相似度加权聚合来自其他位置的信息。 - 这使得信息可以在BEV空间中流动。例如,一个表示大型卡车车头位置的查询向量,可以从表示该卡车车身和车尾的查询向量中获取信息,从而理解到它们共同构成了一个完整的、连续的物体。
步骤 6: 与LiDAR等其他模态特征融合
- 操作: 将纯视觉的BEV特征图与其他模态(如LiDAR)的BEV特征图进行融合。
- 输入:
- 纯视觉的
bev_queries
(来自步骤5,重塑为[256, 200, 200]
)。 - 由点云处理分支生成的
lidar_bev_features
(形状也为[256, 200, 200]
)。
- 纯视觉的
- 输出: 一个融合后的多模态BEV特征图。
- 流程: 最简单的方式是将两个特征图在通道维度上拼接(Concatenate),然后通过一个卷积层来压缩通道并进行特征融合。更复杂的方法也可以使用注意力。
步骤 7: 迭代优化与输出
上述的步骤4和步骤5(即BEV Cross-Attention和BEV Self-Attention)通常会组成一个“BEVFormer Layer”,并且会堆叠多层(例如6层)。上一层的输出 bev_queries
会作为下一层的输入,每一层都会对BEV特征图进行一次更精细的优化。
最终,最后一层输出的BEV特征图将被送入下游的检测头或分割头,来完成最终的感知任务。
交叉注意力(Cross-Attention)融合
下面将解析如何使用注意力机制,特别是交叉注意力(Cross-Attention),来替代简单的拼接融合方法。
这种方法的核心思想是,让两种模态的特征图不再是简单地“堆叠”在一起,而是进行一次智能的、有选择性的“信息问询”,从而实现更深层次的融合。
构建一个双向交叉注意力融合模块(Bi-directional Cross-Attention Fusion Module)。这个模块包含两个平行的信息流:
- 路径A: LiDAR特征图作为“主导”,去查询图像特征图,用视觉信息来“增强”自己。
- 路径B: 图像特征图作为“主导”,去查询LiDAR特征图,用精确的几何信息来“校准”自己。
假设输入是两个BEV特征图:
lidar_bev_features
: 由点云分支生成,形状为[C, H, W]
。image_bev_features
: 由图像分支(例如BEVFormer-style Attention)生成,形状也为[C, H, W]
。
步骤 1: 输入准备 (Tokenization & Positional Encoding)
注意力机制处理的是一系列“令牌”(Tokens),而不是2D的图像网格。因此,第一步是进行预处理。
-
1a. 展平 (Flattening):
- 操作: 将两个
[C, H, W]
的2D特征图展平为1D的令牌序列。 - 数据变换:
[C, H, W]
->[H * W, C]
。令N = H * W
,则形状变为[N, C]
。 - 输出:
lidar_tokens
(形状[N, C]
)image_tokens
(形状[N, C]
)
- 含义: 现在我们有了两个令牌序列,每个令牌代表了BEV空间中的一个特定位置,并携带了该位置的特征信息。
- 操作: 将两个
-
1b. 添加位置编码 (Positional Encoding):
- 操作: 为每个令牌添加其在原始
H x W
网格中的位置信息。 - 数据变换: 将一个预先定义或可学习的位置编码张量(形状
[N, C]
)与lidar_tokens
和image_tokens
相加。 - 输出: 带有位置信息的
lidar_tokens
和image_tokens
。 - 含义: 标准的注意力机制是“置换不变”的,它不关心令牌的顺序。而BEV特征具有强烈的空间属性,因此必须显式地将位置信息注入到令牌中,模型才能理解每个令牌代表的几何位置。
- 操作: 为每个令牌添加其在原始
步骤 2: 双向交叉注意力 (Bi-directional Cross-Attention)
这是融合的核心。我们将并行执行两个交叉注意力计算。
-
路径 A: LiDAR 查询 Image (LiDAR Queries Image)
- 目标: 对于BEV中的每一个位置,LiDAR特征想知道:“在图像特征中,哪些信息与我最相关?请把它们提供给我。”
- 注意力角色分配:
- Query (Q): 来自
lidar_tokens
。 - Key (K): 来自
image_tokens
。 - Value (V): 来自
image_tokens
。
- Query (Q): 来自
- 计算流程:
- 线性投影: 使用三个独立的全连接层(Linear layers)将Q, K, V分别进行线性变换,得到
Q_lidar
,K_image
,V_image
。 - 计算注意力分数: 通过点积计算
Q_lidar
和K_image
的相似度,并进行缩放和Softmax归一化。
AttentionScoresA=Softmax(Qlidar⋅KimageTdk)AttentionScores_A = \text{Softmax}\left(\frac{Q_{lidar} \cdot K_{image}^T}{\sqrt{d_k}}\right)AttentionScoresA=Softmax(dkQlidar⋅KimageT)
这个分数矩阵的每一行代表一个LiDAR令牌对所有Image令牌的关注度分布。 - 生成上下文向量: 将注意力分数与
V_image
相乘。
OutputA=AttentionScoresA⋅VimageOutput_A = AttentionScores_A \cdot V_{image}OutputA=AttentionScoresA⋅Vimage
- 线性投影: 使用三个独立的全连接层(Linear layers)将Q, K, V分别进行线性变换,得到
- 输出:
enhanced_lidar_tokens
(形状[N, C]
)。 - 含义: 这是“被图像信息增强过的LiDAR特征”。每个令牌现在不仅包含原始的LiDAR几何信息,还融合了从图像特征图中所有位置加权平均得来的、与之最相关的视觉上下文信息。
-
路径 B: Image 查询 LiDAR (Image Queries LiDAR)
- 目标: 对于BEV中的每一个位置,图像特征想知道:“我的特征可能存在不确定性,请告诉我LiDAR特征中哪些精确的几何信息能对我进行校准和确认。”
- 注意力角色分配:
- Query (Q): 来自
image_tokens
。 - Key (K): 来自
lidar_tokens
。 - Value (V): 来自
lidar_tokens
。
- Query (Q): 来自
- 计算流程: 与路径A完全相同,只是Q, K, V的来源不同。
- 输出:
enhanced_image_tokens
(形状[N, C]
)。 - 含义: 这是“被LiDAR信息校准过的图像特征”。每个令牌现在融合了来自LiDAR特征图的、与之最相关的几何结构信息,使其空间定位更加可靠。
步骤 3: 特征聚合 (Aggregation)
- 操作: 将两个并行路径的输出结果和原始输入结合起来。
- 输入:
- 原始的
lidar_tokens
和image_tokens
。 - 增强后的
enhanced_lidar_tokens
和enhanced_image_tokens
。
- 原始的
- 输出: 融合后的令牌序列
fused_tokens
(形状[N, C]
)。 - 流程:
- 聚合增强特征: 将两个增强后的特征进行合并,最简单的方式是相加:
aggregated_enhancement = enhanced_lidar_tokens + enhanced_image_tokens
。 - 残差连接 (Residual Connection): 将聚合后的增强特征与原始特征相加。这对于稳定训练至关重要。例如,只增强LiDAR特征:
fused_tokens = lidar_tokens + aggregated_enhancement
。更常见的是将两个原始特征也先融合一下:fused_tokens = (lidar_tokens + image_tokens) + aggregated_enhancement
。 - 层归一化 (Layer Normalization): 对
fused_tokens
进行层归一化。
- 聚合增强特征: 将两个增强后的特征进行合并,最简单的方式是相加:
步骤 4: 前馈网络 (Feed-Forward Network, FFN)
- 操作: 对融合后的令牌进行进一步的非线性变换,增加模型的表达能力。这是Transformer模块的标准组件。
- 输入:
fused_tokens
(来自步骤3)。 - 输出: 最终的融合令牌
final_fused_tokens
(形状[N, C]
)。 - 流程:
- 将
fused_tokens
通过一个MLP(通常是两层全连接层,中间有一个ReLU或GELU激活函数)。 - 同样,应用残差连接和层归一化。
final_fused_tokens = LayerNorm(fused_tokens + MLP(fused_tokens))
。
- 将
步骤 5: 输出
- 操作: 将处理完成的令牌序列还原为2D BEV特征图的格式。
- 输入:
final_fused_tokens
(形状[N, C]
)。 - 数据变换:
[N, C]
->[H * W, C]
->[H, W, C]
->[C, H, W]
。 - 输出: 最终融合后的BEV特征图,可以送入下游的检测头。
通过以上步骤,模型不再是盲目地拼接特征,而是智能地让两种模态相互“协商”,提取对彼此最有价值的信息,从而得到一个质量更高、信息更丰富的融合BEV特征图。
我们将按照数据流动的顺序,一步步拆解从独立的传感器输入到最终特征融合的完整过程。
FocalsConv 多模态融合策略 (Focals Conv-F) 详解
该策略的核心思想是:利用轻量级的图像特征来增强点云体素特征,特别是在预测哪些体素区域更重要(即包含物体)以及增强这些重要体素的特征表达上。 融合操作本身非常直接高效,即求和 (Summation)。
步骤 1: 独立的LiDAR特征提取
- 操作: 将原始的LiDAR点云转换为主干网络可以处理的BEV(鸟瞰图)稀疏体素特征。
- 输入: 原始LiDAR点云数据。
- 输出: 稀疏的3D体素特征 (
LIDAR Features
)。在论文的图示中,这被表示为Sparse features
。这些特征以一种稀疏格式存储,即只保存有“活动”体素的位置及其对应的特征向量。 - 含义: 这一步是所有基于体素的3D检测器的标准流程,它将无序的点云转化为规整的、带有空间位置信息的特征表示,为后续的3D卷积操作做准备。
步骤 2: 独立的2D图像特征提取
- 操作: 从同步的RGB图像中提取2D特征图。
- 输入: RGB相机图像 (
RGB Features
)。 - 输出: 一个2D图像特征图。
- 含义与流程:
- 该模块被设计为轻量级的,仅包含几个卷积层、批归一化(BN)、ReLU激活层和一个最大池化层,而不是一个完整的、沉重的2D检测或分割模型。
- 输入图像首先被下采样(例如,到1/4分辨率),然后通过几个带有残差连接的卷积层来提取特征。
- 最后,通过一个MLP(全连接层)将特征图的通道数调整到与LiDAR体素特征的通道数一致,以便后续进行求和操作。
- 关键点: 这一步的目标不是进行2D目标检测,而仅仅是提取出包含颜色、纹理等丰富语义信息的2D特征,作为LiDAR特征的补充。
步骤 3: 特征对齐 (3D到2D的投影)
这是实现多模态融合最关键的一步,它解决了“哪个3D体素对应哪个2D图像像素”的问题。
- 操作: 将稀疏的3D体素特征的位置,通过坐标系变换,投影到2D图像特征图上,从而找到每个体素对应的图像特征。
- 输入:
- 3D体素的位置坐标(来自步骤1)。
- 2D图像特征图(来自步骤2)。
- 传感器标定参数(相机内外参)和数据增强中记录的变换参数。
- 输出: 对于每个3D体素,都能索引到一个与之对应的2D图像特征向量。
- 含义与流程:
- 处理坐标变换: 训练过程中,点云数据会经过一系列的数据增强操作,如随机翻转、缩放、旋转和平移。这些变换是可逆的。为了正确投影,模型会记录这些变换的参数,并对体素的坐标进行逆变换,将其恢复到原始的、未增强的坐标系中。
- 3D到2D投影: 使用相机的标定矩阵,将恢复后的3D体素中心点坐标投影到2D图像的像素平面上。
- 特征索引: 根据投影得到的2D像素坐标,从步骤2生成的图像特征图中进行索引,提取出对应的图像特征向量。
- 关键点: 经过这一步,原本在不同空间(3D和2D)的特征被打通了。现在,对于每一个LiDAR体素,我们都有了一个来自图像的、描述其颜色和纹理的特征向量。
步骤 4: 两次求和融合 (Fusion via Summation)
根据FocalsConv的设计(见论文图3),融合操作在两个地方以求和的方式发生。
-
4a. 第一次融合 (用于重要性预测):
- 操作: 将对齐后的图像特征与输入的LiDAR体素特征相加。
- 数据流动:
LIDAR Features
与对齐后的RGB Features
进行求和。 - 输出: 一个临时的、融合了多模态信息的特征张量。
- 目的: 这个融合后的特征专门被送入一个额外的卷积分支,用于预测“立方体重要性图 (Cubic importance)”。因为图像特征(如颜色)对于判断一个区域是否是前景物体(例如,区分车辆和路面)非常有帮助,所以用它来辅助预测重要性是十分有效的。
-
4b. 第二次融合 (用于增强输出特征):
- 操作: 将对齐后的图像特征与输出的、被判断为“重要”的LiDAR体素特征相加。
- 数据流动: 在主干的稀疏卷积计算完成后,模型会得到一个输出的稀疏特征图。此时,对齐后的
RGB Features
只与那些根据步骤4a的预测被认为是“重要”的输出体素特征进行求和。 - 输出: 最终的多模态BEV特征图,它将被送入网络的下一层。
- 目的: 这是对模型特征的最终增强。它只增强那些模型认为值得关注的区域(前景物体),避免了将图像信息盲目地添加到所有区域(包括大量背景),从而使得特征表达更具判别力。
通过这种设计,FocalsConv以一种高效且有针对性的方式利用了图像信息:首先用它来帮助模型“聚焦”到场景中的关键物体上,然后再用它来丰富这些关键物体的特征表达,最终实现了两种模态的有效协同。