paper: http://arxiv.org/abs/2203.17270
git: https://github.com/fundamentalvision/BEVFormer
三个部分: back-bone(ResNet-101), spatial cross-attention module, temporal self-attention module
BEV query (BEV查询向量)
一组栅格状的可学习参数 Q(H,W,C)
作为BEVFormer的查询向量,其中H,W是BEV平面的空间尺度,位于p=(x,y)
位置的Q(p)(1,c)
负责查询对应在BEV平面的grid cell region 。每个BEV平面的grid cell对应实际世界坐标系的s
米。BEV特征的中心就是自车的位置。遵循常规操作,在输入BEVFormer之前,Q中增加了可学习的位置特征编码。
Spatial Cross-Attention
计算N张camera视角图像之间的注意力的计算量非常大,所以基于deformable attention开发了spatial cross attention:每个BEV query只在多个摄像头视角下和关注的roi进行交互(提取注意力特征),作者对deformable attention从2D到3D场景的迁移做了改动。
首先将每个BEV query提升到一个柱状query,从柱状query采样N个3D 参考点,然后将这些点投影到2D视角。对于一个BEV query,投影的2D点只能落在一些camera view上,另外一些视角则没有。将命中的视角记为V(hit)
,将这些点N(ref)
作为BEV query的参考点,围绕这些点从命中的视角中提取roi image feature。最后对多个roi image feature进行加权相加,作为spatial cross-attention的输出:
i为第i个摄像头视角,j为第j个3D参考点,N(ref)数每个BEV query的所有3D参考点数量。F(t,i)
是第i个摄像头视角的特征。P(p,i,j)
是一个投影函数,由第j个3D点(x',y',z'(j))
投影到第i个摄像头的2D点。
P(p,i,j)
如何得到?
根据对应Query在p=(x,y)
计算得到世界坐标系下(x',y')
H,W是BEV query的空间尺度,s是BEV一个网格对应世界坐标系的尺度。在3D空间中,在(x',y')
的目标会出现在z轴=z’的地方,所以作者还针对各个参考点预定义了一组候选高度{z'(j)}
,使得能够捕获不同高度的信息。通过这种方式,我们就能得到每个query对应的3D参考点集(x',y',z'(j))
(j属于第j个参考点)。最终,我们就可以将3D参考点投影到不同的摄像头视角,得到2D参考点(通过摄像头的投影矩阵):
P(p,i,j)
即由第j个3D点(x',y',z'(j))
投影到第i个摄像头的2D点,T(i)
是第i个摄像头的投影矩阵
总结:世界坐标系下第j个3D点p(x,y)
+ 第i个摄像头的投影矩阵 → 第i个摄像头画面的第j个3D点的2D投影坐标,以此类推,能够找到Q(p=(x,y))
包含多个z轴3D点在多个摄像头画面中的2D点的特征集合,然后做加权相加,来代表Q(p=(x,y))
的特征
Temporal Self-Attention
除了空间注意力,时序注意力对强遮挡目标的感知也有所帮助
第t帧的BEV query和缓存的历史BEV query,根据自身运动将q(t-1)
对q(t)
进行对齐,通过下面操作对不同时间的BEV feature构建联系
Q(p)
为BEV平面p=(x,y)
的query。不同于原始的deformable attention,通过融合Q
和B'(t-1)
也可以预测p的偏移量。