BEVFormer

BEV (Bird’s Eye View) 是自动驾驶领域中常见的一种视角,其将车辆周围的环境投影到一个俯视的平面上,以便更好地理解车辆周围的环境。 本文通过对 BEVFormer 的学习,来理解 BEV 如何构建及如何使用。

仅阅读论文可能难以对该方法有全面的认识,之后需要对代码进行阅读以及理解。

为什么要使用 BEV?

BEV 全称是 Bird’s Eye View(鸟瞰视角),实现方法是把原本摄像头 2D 的视角通过算法校正和改变,形成基于上帝视角的俯视图。 从本质上来说,BEV算法就是将传感器输入转换到统一的俯视角度下进行处理,是一种特征融合的方法。

使用 BEV 有着以下几个优势:

  • 第一,BEV 视角下的物体,不会出现图像视角下的尺度(scale)和遮挡(occlusion)问题。 由于视觉的透视效应,物理世界物体在 2D 图像中很容易受到其他物体遮挡,2D感知只能感知可见的目标,而在BEV空间内,算法可以基于先验知识,对被遮挡的区域进行预测。
  • 第二,将不同视角在BEV下进行统一表达,能极大方便后续规划和控制任务。 主流规划和控制算法,不论上游传感器信息来自什么视角,经过融合之后,都会转换到以自车为中心坐标系中(Vehicle Coordinate System,VCS),对 VCS 来说,最适合的其实就是 BEV 视角,也就是 BEV 感知结果输出的空间是规划和控制任务的标准输入。
  • 第三,BEV 能够给系统带来巨大的提升。 摄像头感知算法工作在 2D 空间,而雷达感知算法工作在 3D 空间,在对 2D 与 3D 几何关系融合过程中,会丢失大量的原始信息,采用 BEV 感知系统中,摄像头、激光雷达、毫米波雷达感知均在 BEV 空间中进行,融合过程提前。 BEV还可以引入过去时间片段中的数据,实现时序融合,最终使感知效果更加稳定、准确。
  • 第四,BEV能够实现端到端优化。 感知任务中的识别、跟踪和预测本质是一个串行系统,系统上游误差会传递在下游误差,在 BEV 空间内,感知和预测都在同一个空间进行,可以通过神经网络做到端到端的优化,输出“并行”结果,而整个感知网络可以以数据驱动方式来自学习,实现快速迭代。

BEVFormer 架构

BEVFormer 是一个基于 transformer 的模型,用于处理 BEV 空间的感知任务。 如图所示,考虑到了空间 Spatial Attention 和时间 Temporal Attention,以及不同传感器的融合。

模型结构

特征提取

  • 模型整体的输入为一个六维的张量:(batch size,连续帧数,每帧图像数,图像高度,图像宽度,通道数)
  • Backbone + Neck (ResNet-101-DCN + FPN)提取环视图像的多尺度特征
    • 输入为单帧的张量:(batch size,每帧图像数,图像高度,图像宽度,通道数)
    • 对于 nuSences 数据集来说,每帧图像数为 6。
    • 输出为:(batch size,每帧图像数,通道数,特征高度/64,特征宽度/64)

Encoder 结构

首先使用的是一个 Encoder 结构的 Transformer 模型,包括 Temporal Self-Attention 模块和 Spatial Cross-Attention 模块,完成环视图像特征向 BEV 特征的建模。 两个模块中都运用到了多尺度的可变形注意力模块(Deformable Attention)用于将全局注意力变为局部注意力,用于减少训练时间。该思想来源于 Deformable DETR。 之后再使用 Eecoder 结构来进行下游任务。

Temporal Self-Attention 模块

通过当前时刻的 BEV Query QQ 和上一时刻的 BEV 特征 Bt1B_{t-1} ,首先对上一时刻的 BEV 特征进行对齐,Bt1B_{t-1}^{\prime} 是经过对齐后的 BEV 特征。 对齐的过程是通过车辆的运动信息进行的,使得相同网格的特征对应到相同的真实世界位置,但是由于物体在真实世界中的运动是不确定的,因此需要通过 Temporal Self-Attention (TSA) 模块来建模特征之间的时序关系。

TSA(Qp,{Q,Bt1})=V{Q,Bt1}DeformAttn(Qp,p,V),\operatorname{TSA}\left(Q_p,\left\{Q, B_{t-1}^{\prime}\right\}\right)=\sum_{V \in\left\{Q, B_{t-1}^{\prime}\right\}} \operatorname{DeformAttn}\left(Q_p, p, V\right),

QpQ_pp=(x,y)p=(x, y) 处的 BEV Query。 不同于普通的可变形注意力,时序自注意力中的偏移(offset)Δp\Delta p 是由 QQBt1B_{t-1}^{\prime} 的拼接预测的。 特别地,对于每个序列的第一个样本,时序自注意力将退化为一个没有时序信息的自注意力,其中我们将 BEV 特征 {Q,Bt1}\left\{Q, B_{t-1}^{\prime}\right\} 替换为重复的 BEV 查询 {Q,Q}\{Q, Q\}。 最后输出的 BEV Query 是对两个 BEV Query 的平均。

Spatial Cross-Attention 模块

用于建模空间维度的信息,同样的,由于多头自注意力的计算量较大,因此仍使用可变形注意力模块来减少计算量。 Spatial Cross-Attention (SCA) 可以写作:

SCA(Qp,Ft)=1Vhit iVhit j=1Nref DeformAttn(Qp,P(p,i,j),Fti)\operatorname{SCA}\left(Q_p, F_t\right)=\frac{1}{\left|\mathcal{V}_{\text {hit }}\right|} \sum_{i \in \mathcal{V}_{\text {hit }}} \sum_{j=1}^{N_{\text {ref }}} \operatorname{DeformAttn}\left(Q_p, \mathcal{P}(p, i, j), F_t^i\right)

其中 Vhit\mathcal{V}_{\text {hit}} 是在当前 BEV Query QpQ_p 中的 2D 点可能命中的相机视角集合,FtiF_t^i 是其中第 ii 个相机视角的特征。 jj 是参考点的索引,NrefN_{\text {ref}} 是每个 BEV 查询的总参考点数。 对于每个 BEV 查询 QpQ_p,我们使用投影函数 P(p,i,j)\mathcal{P}(p, i, j) 从第 ii 个相机视图中获取第 jj 个参考点。

x=(xW2)×s;y=(yH2)×s,x^{\prime}=\left(x-\frac{W}{2}\right) \times s ; \quad y^{\prime}=\left(y-\frac{H}{2}\right) \times s,

其中 H,WH, W 是 BEV 查询的空间形状,ss 是 BEV 网格的分辨率大小,(x,y)\left(x^{\prime}, y^{\prime}\right) 是车辆位置为原点的坐标。 在 3D 空间中,位于 (x,y)\left(x^{\prime}, y^{\prime}\right) 处的物体将出现在 zz 轴上的高度 zz^{\prime} 处。 因此,我们预定义一组锚点高度 {zj}j=1Nref \left\{z_j^{\prime}\right\}_{j=1}^{N_{\text {ref }}},以便我们可以捕捉出现在不同高度的线索。 这样,对于每个查询 QpQ_p,我们获得了一根 3D 参考点柱 (x,y,zj)j=1Nref \left(x^{\prime}, y^{\prime}, z_j^{\prime}\right)_{j=1}^{N_{\text {ref }}}。 最后,我们通过相机的投影矩阵将 3D 参考点投影到不同的图像视图中。

P(p,i,j)=(xij,yij) where zij[xijyij1]T=Ti[xyzj1]T.\begin{aligned} \mathcal{P}(p, i, j) & =\left(x_{i j}, y_{i j}\right) \\ \text { where } z_{i j} \cdot\left[\begin{array}{lllll} x_{i j} & y_{i j} & 1 \end{array}\right]^T & =T_i \cdot\left[\begin{array}{llll} x^{\prime} & y^{\prime} & z_j^{\prime} & 1 \end{array}\right]^T . \end{aligned}

这里,P(p,i,j)\mathcal{P}(p, i, j) 是从第 ii 个视图投影的第 jj 个 3D 点 (x,y,zj)\left(x^{\prime}, y^{\prime}, z_j^{\prime}\right) 的 2D 点,TiR3×4T_i \in \mathbb{R}^{3 \times 4} 是第 ii 个相机的已知投影矩阵。

前向网络及输出

Spatial Cross-Attention 模块的输出通过一个前向网络,得到最终的 BEV 特征。 该 BEV 特征将作为后续 Decoder 的输入,可以用于完成不同的感知任务。

下游任务

目标检测

需要预测 10 个参数,包括 3 个尺度参数 (l,w,h)(l,w,h),3 个中心位置参数 (x,y,z)(x,y,z),2 个旋转参数 (cos(θ),sin(θ))(cos(θ),sin(θ)),2 个速度参数 (vx,vy)(v_x ,v_y)。 参考 Detr3D 中的 Decoder 模块,推理阶段使用 900 个 object queries,并保留 300 个具有最高置信度分数的预测框。 L1L_1 损失在训练阶段被使用,对预测值和真值十个维度的差值进行计算。 采用 Transformer 中常用的匈牙利匹配算法,Focal Loss + L1 Loss 的总损失和最小。

全景分割

全景分割的模型结构如上图所示,是一个遮罩分割头,参考 Panoptic SegFormer,用 query 来预测每个像素的类别,并生成 segmentation mask。

总结

本问介绍了 BEVFormer 的模型结构,主要包括特征提取、Encoder 结构和下游任务。 BEV 作为 Query,贯穿了整个 transformer 模型结构,包含了当前的位置信息。 这种基于 transformer 的模型结构,构建了 BEV 空间,更好的对应了下游的感知任务,也为进一步规划控制任务提供了更好的输入。

Reference