〇、Introduction
BEVFormer是现在端到端无人驾驶中常使用的一个Backbone,用于将六个视角下的图像转换为鸟瞰图视角下的特征,转换出的BEV特征则会被用于后续模块的特征交互。然而在这个模型设计的初期,其最本质的意图是为了提取用于各种CV任务的BEV特征。相机本身作为一个简单的感知设备,具有开销小、便于检测远处物体的特点。在多视角感知的领域,最简单直接的方法是在各个视角下都进行一次检测,最后将检测结果进行融合,然而这种方法忽略了视角之间存在的联系。从整体的角度来看,BEV视角是一个很好的选择,因为BEV能够从全局角度进行感知。但是从2d的成像平面提取出BEV有些困难,这一点导致了在BEV场景中进行的CV任务比较困难。主要的困难点在于转换过程需要从图像这一2d结构转换为3d场景,得益于Transformer结构,现在我们可以不完全依赖于深度信息动态学习BEV特征。
这篇文章中作者提出了BEVFormer,利用多相机输入得到场景的BEV表示,这个输出的BEV特征可以用于各种的CV任务。提出了时间自注意力机制和空间交叉注意力机制,利用可学习的BEV query进行两种注意力的计算,得到时空关联的BEV特征输出。
一、模型结构
整体结构
BEVFormer采用的也是传统的Transformer结构,具有六个编码器层,除了BEV query、时间自注意力和空间交叉注意力,其余的部分与穿砼结构一致。其中BEV query是一个网格形状的可学习参数,用于从多视角下利用注意力进行特征的提取。空间交叉注意力和时间自注意力都会与BEV query进行交互,从而增强输出的BEV特征时间和空间联系。
在一次推理中,六个视角下的图像首先会各自利用Resnet进行特征的提取,转换为六个视角下的特征图。每次推理我们利用上一帧输出的BEV特征与BEV query进行时间自注意力机制的计算,从而增强当前帧的BEV query,之后利用空间信息与多视角的特征图进行空间交叉注意力的计算。经过六层编码器最终得到当前帧的BEV特征。
BEV query
因为BEV本身具有一个二维的坐标结构,所以这里BEV query也可以用二维结构来解释。BEV query是一个网格状的可学习参数,它的大小为H×W×C,其中H和W是BEV平面的大小,我们可以将其拆解为H×W个维的向量,每个query对应的就是一个坐标下的特征信息,这个H和W我们可以理解为网格的数量,所谓BEV平面实际上就是一个二维的矩形网格结构,类似于2dNDT里面的网格,每个网格的大小为超参数S,H和W就是网格在两个方向上的数量,每个query对应的位置就是每个网格的中心。对于每个query,我们为其加入最基本的可学习的空间位置编码来增强。
空间交叉注意力
空间交叉注意力实际上是可变形注意力的一个优化版本。对于目前的一个BEV query,其实它本身是一个二维结构,是一个H×W的矩阵,这里我们首先将其补充为3d结构,做法是将H×W直接进行拉伸。比如说原本一个BEV query的坐标是(x, y),利用预设好的高度值,我们将起补充为(x, y, z),z的取值完全是认为选择的,相当于我们将2d的平面在纵向上复制了很多次。这样子我们就得到了很多3d的点,利用点的坐标、相机的内外参,我们可以利用小孔成像原理计算在六个视角下的投影位置,也就是在六个视角下能否观测到这些点,对于能够观测到的视角,我们将其记录在Vhit里面,之后对于每个3d点,我们对所有能够观测到的视角Vhit计算可变形注意力,我们在投影点的位置的基础上,利用可学习的偏移量,加权求和得到当前视角下的特征向量,之后所有的可观测视角都进行这个操作,最后加权求和,得到的特征向量就是BEV query中一个点的特征向量。
这里补充一个想了很久的问题,在这个计算的过程中,既然每个BEV query的坐标(x, y)是固定的,3d点在自车坐标系下的位置固定,自车坐标系与相机坐标系的变换关系也是固定,那么它会被哪几个相机观测不就是确定的吗,这里为什么又要使用内外参动态计算会被哪个相机观测。我和ScholarGPT讨论了半天,它提供的说法是,这套解释理论上是成立的,但是太过暴力,实际上这个转换过程引入了世界坐标系,固定的3d点首先利用自车坐标系与当前位姿,转换为世界坐标系下的点,之后再根据世界坐标系和相机坐标系的关系进行投影,这个过程当前位姿是变化的或者是不完全准确的,所以哪个点能被哪个相机观测也就不确定了,所以需要动态计算。
时间自注意力
由于帧与帧之间并不是完全独立的,它们之间也存在一个相互关联的关系,所以作者引入了时间自注意力机制来优化这一点。对于上个时刻输出的BEV特征,我们首先根据位姿真值进行投影,转换到当前帧的坐标系下,这一步和SLAM中的坐标投影是一样的。转换之后,我们使用当前帧的BEV query与投影后的BEV特征进行可变形注意力的计算,这里虽然名字叫做时间自注意力,但是使用的可变形注意力计算是可变形交叉注意力,即使用可学习的偏移量对上一帧的BEV特征进行处理,将加权求和后的结果与原始的特征向量进行叠加,得到增强后的BEV query。
由于第一帧时没有上一帧的BEV特征,所以第一帧时采用两个BEV query进行可变形注意力的计算,也就是自己和自己计算可变形交叉注意力。
这里的投影其实存在一些问题,投影实际上相当于SLAM中的坐标系变换,那么必然会存在一个投影后裁切的问题,因为车辆在前移,以车辆坐标系来看,必然有些点变得太远而消失,有些点因为靠近而突然出现,但是BEV特征的大小是固定的,这就有可能导致投影后的BEV特征,一些部分因为超出了范围被丢弃,一些部分因为根本就投影不到而保持为0。这种情况下会通过降低该部分的权重来避免BEV query无法被强化。投影的过程实际上就是取整的过程,会根据位置自动分配一个网格,网格内如果存在多个投影点,则对于这个网格的特征向量来说,其等于所有投影过来的点对应的特征向量的平均。
整体流程
从整个流程来看,在非第一帧的情况下,每次推理的输入是上一个时刻的BEV特征和训练好的可学习参数组成的BEVquery,首先利用自车的位姿变化将上一个时刻的BEV特征转换到当前时刻,之后用BEVquery与转换后的BEV特征做可变形交叉注意力,由于BEV query和BEV特征的大小是一样的,所以如果query的坐标是xy,那么可以直接将BEV特征xy位置作为采样点的初始位置,之后利用可学习的偏移在每个位置采样并加权求和,得到一个与原BEV特征大小相同的特征图,之后将这个特征图从2d补充高度变成3d,利用内外参矩阵投影到不同视角的相机成像平面,如果点可以投影到某个相机视角下,就利用投影位置在当前视角对应的特征图中计算可变形交叉注意力,最后得到一个新的特征图,作为当前帧的BEV特征。