BEV感知---BevFormer详解

趁热打铁 ,写完了BEVFusion论文,今天讲BEVFormer: Learning Bird’s-Eye-View Representation from Multi-Camera Images via patiotemporal Transformers这篇,后续只写纯视觉下的BEV感知(可能还有3篇经典论文的笔记?)。
因为本文也很经典,网上资源比较多,后续笔者会贴参考网址,希望读者都能够去看一看,加深印象。
本博客适用于刚看BEV感知的读者,如有错误还请指正。

论文网址:https://arxiv.org/pdf/2203.17270v1.pdf
代码网址:https://github.com/fundamentalvision/BEVFormer

笔者前言

论文名字
BEVFormer: Learning Bird’s-Eye-View Representation from Multi-Camera Images via patiotemporal Transformers
其中关键词是Spatiotemporal 时空的 , 分开即 spatia 空间的l ,temporal 时间的。可见本论文在BEV感知上引入了时间和空间的因素。相比之前的BEV算法来说,这是比较有创新的一点。具体的,下图所示,上面的分支进行空间特征(多视角图像特征)注意力(spatial cross-attention)。下面的分支进行时间特征注意力(temporal self-attention),可以看到作者这里把前一时刻(t-1时刻)的BEV特征当作是时间特征。通过时空特征来预测当前时刻(t时刻)的BEV特征。
在这里插入图片描述

标准attention 和 deformable attention区别

上图(figure1) 中有两个attention模块,具体的,作者这里使用了deformable attention 而不是标准attention,用来做加速运算。下面笔者简单讲述下deformable attention。
deformable attention 首先是 《Deformable DETR》这篇论文提出来的,目的是用来改善并加速DETR。

deformable attention前身 deformable conv

讲deformable attention之前,可以先了解deformable conv,《可变性卷积》。
Deformable Convolution 将固定形状的卷积过程改造成了能适应物体形状的可变的卷积过程,从而使结构适应物体形变的能力更强。

传统的CNN卷积核是固定大小的矩形,只能在固定为位置对固定输入特征进行采样, 为了解决这个问题,为解决该问题,研究人员提出了 Deformable Convolution—可变性卷积 方法,它对感受野上的每一个点加一个偏移量 ,偏移的大小是通过学习得到的 ,偏移后感受野不再是个正方形,研究人员期望感受野是和物体的实际形状相匹配。这么做的好处就是无论物体怎么形变,卷积的区域始终覆盖在物体形状的周围。

下图为Deformable Convolution的示意图,a 为原始感受野范围,b ~ c 是对感受野上的添加偏移量后的感受野范围,可以看到叠加偏移量的过程可以模拟出目标移动、尺寸缩放、旋转等各种形变。(当然b,c,d 并不是人为控制的,而是学习偏移量得到的,偏移量是不可知的,所以出现b,c,d是研究人员所假想的比较好的情况)
在这里插入图片描述

完整的可变性卷积如下图所示,注意上面的卷积用于输出偏移量,该偏移量的长宽和输入特征图的长宽一直,维度是输入的两倍 , 因为同时输出了x和y方向的偏移量。

在这里插入图片描述

deformable attention

以下图源自《DAT:Vision Transformer with Deformable Attention》(虽然是Deformable DETR提出的,但是这篇文章更详细的讲解了deformable attention)
在这里插入图片描述
在这我就不具体分析了,只讲attention和deformable attention的区别:
普通的attention : Output = softmax ( Q ⋅ K T ) ⋅ V d k \text{Output} = \frac{\text{softmax}(Q \cdot K^T) \cdot V}{\sqrt{d_k}} Output=dk softmax(QKT)V
类比的看
Deformable attention : Output = softmax ( Q ⋅ K T ) ⋅ V d k \text{Output} = \frac{\text{softmax}(Q \cdot K^T) \cdot V}{\sqrt{d_k}} Output=dk softmax(QKT)V
只不过这里的K和V不是全部的,而是通过采样得到的。

其中的采样过程如下:
1 在输入的x中总均匀采样K个点(做好是平方数) 。
2 然后计算K个偏移量offset ,offset=Conv(X)
3 最终采样点的坐标= 初始采样的K1个点+K1个offsets 。通过点坐标去得到每个点的特征
4 K1中每个点§对应的特征= 离点P最近的K2个点通过插值方式得到最终特征
(具体的插值方式是 周围K2个点的权重 × K2个点的特征。 其中权重是K2个点的距离到P点的距离(可以是1范数也可以是2范数)。插值方式也可以是双线性插值)

具体的实现中,BevFormer中temporal self-attention中K1,K2都为4,采样方式为双线性。 在spatial cross-attention中K1为8,K2为4,采样方式为双线性。

强烈推荐看这篇博客,来加深了解deformable attention 《Deformable DETR 原理分析》,该篇从deformable attention的源头-----deformable conv讲起,过渡丝滑。

BEVFormer 模型架构

在这里插入图片描述
之前讲过2d图像到bev特征的通常做法是 2d图像+预测的深度值----转变为---->3d特征,然后通过voxel/pillar处理把3d特征转变为Bev特征。BevFormer作者认为这种范式对深度值或深度分布的准确性很敏感。因此本文作者设计一种不依赖于深度信息的BEV生成方法,该方法可以自适应地学习BEV特征,而不是严格依赖于3D先验。

backbone部分就不讲了,多视角图像送入Backbone,得到多视角特征。

图中灰色区块做的是先时间再空间,因为前面时刻BEV( B t − 1 B_{t-1} Bt1)有很多信息,相当于要充分利用先验知识,在此基础上再继续融合当前帧的特征,从而构建当前BEV,重复多次(6次)得到最后的BEV空间特征 B t {B_t} Bt

temporal sefl-attention

这一部分有点像RNN的处理流程,把bev_t当作是RNN中的能够传递信息的记忆体。每一时刻生成的BEV特征 B t {B_t} Bt都是基于上一时刻BEV特征 B t − 1 B_{t-1} Bt1得到。这种就让每一时刻的BEV特征 B t B_{t} Bt保留了时间上的信息。
在这里插入图片描述
下面来看看实现:
初始随机生成t时刻初始BEV特征 Q t Q_{t} Qt,利用Deformable attention来计算temporatl self-attention。其中的Q,K,V分别是 Q t Q_{t} Qt B t − 1 B_{t-1} Bt1 B t − 1 B_{t-1} Bt1。其中Q上的每个点只采样K,V中K1=4个点做attention。
官方代码中TSA的调用
在这里插入图片描述
源代码中SpatialCrossAttention类
(感觉没什么可以讲的了,如读者对此还有疑问,可以留言评论,笔者来回复)

spatial cross-attention

光有历史BEV特征约束不行,还需要有当前的图像特征来进行辅助。
在这里插入图片描述

首先会把BEV2D空间转变为3D空间。得到ref_3d(refrence_3d 3d参考点),这个ref_3d是基于BEV 空间产生的三维空间规则网格点,同时在 z 轴方向上人为的选择了 4 个坐标点(可以看成pillar中只有4个点)。
这里扩充到3d实际上是要使用 z 轴,并在 z 轴方向上采样的物理意义,作者是为了提取每个 BEV 位置处不同高度的特征;可以理解一下,假如对于 BEV 平面上的(x,y)处有一辆汽车,它所对应的特征应该由车底、车身、车顶处等位置的特征汇聚而成,但是这些位置对应的高度是不一致的,而为了更好的获取在 BEV 空间下的(x,y)处的特征,就将(x,y)的坐标进行了 lift(升维) ,从而将 BEV 坐标系下的三维点映射回图像平面后可以去查询并融合更加准确的特征;

在映射的过程中,论文中也提到,由于每个3d参考点映射回2d图像坐标系后,不会落到六个图像上,只可能落在其中的某些图像的某些位置上,所以只对这些参考点附近的位置进行采样,可以提高模型的收敛速度(其实就是deformable attention的思想,从config文件中可以看到每个Query_bev的采样点是8个。)

官方代码中SCA的调用
在这里插入图片描述

原代码中具体的SpatialCrossAttention类

head

在这里插入图片描述
作者在原论文的3.5中讲了head的细节:

1) For 3D object detection, we design an end-to-end 3D detection head based on the 2D detector
Deformable DETR ,再去看对应的config文件,作者这里设置的查询Query=900,表示最多会检测900个物体(足够了)。
如下是deformable DETR的架构,看其中的decoder能更加的了解3d检测的heads部分:
在这里插入图片描述

在Bevformer中,最终传入到decoder的是当前时刻的BEV( B t B_{t} Bt)。

2) For map segmentation, we design a map segmentation head based on a 2D segmentation method Panoptic SegFormer 。

在这里插入图片描述
panoptic segformer全景分割的模型不是很了解,估计和deformable detr一致,传入decoder的部分
换成了当前时刻的BEV( B t B_{t} Bt)。

参考

Deformable DETR 原理分析
panoptic segformer 模型讲解
BEVFormer论文解析
B站佬手撕BEVFormer源码

欢迎指正

因为本文主要是本人用来做的笔记,顺便进行知识巩固。如果本文对你有所帮助,那么本博客的目的就已经超额完成了。
本人英语水平、阅读论文能力、读写代码能力较为有限。有错误,恳请大佬指正,感谢。

欢迎交流
邮箱:refreshmentccoffee@gmail.com

  • 21
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值