BEV感知和交叉注意力机制
1. 前言
在本专题的前两篇文章中,我们分别介绍了一般的注意力机制和自注意力机制,以及它们在感知任务中的应用。
巫婆塔里的工程师:环境感知中的注意力机制 (一) :视觉感知中常用的注意力机制
巫婆塔里的工程师:环境感知中的注意力机制(二) :Transformer和自注意力机制
除了自注意力以外,交叉注意力(Cross Attention)也是目前应用比较广泛的一种注意力机制,那么它与自注意力的区别在哪里呢?
其实,在Transformer的编码-解码结构中,解码器就采用了交叉注意力:query来自解码器,是当前要解码的词经过多头注意力模块处理后的特征,而key和value来自编码器的输出。这与自注意力中key/value/query来源于同一个输入是有明显区别的。正因为交叉注意力中query和key/value的来源不同,它经常被用于不同域(Domain)之间的数据转换。
那么,为什么交叉注意力会在BEV感知中被广泛应用呢?要回答这个问题,就得先了解什么是BEV感知。
2021年,Tesla在AI Day上展示了一个纯视觉的FSD(Full Self Driving)系统。除了采用了很多深度学习领域的成功经验,这个系统在多摄像头融合方面也非常有特点:先把来自多个相机的图像特征转换到一个向量空间,然后融合来自多个相机的特征,最后在向量空间中完成所有的感知任务。这里所谓的向量空间,其实就是世界坐标系下的鸟瞰视图,也就是BEV坐标。该系统的核心思路就是将图像特征转换到BEV视图下进行融合,在此基础上完成各种感知任务。至于为什么要在BEV视图下完成感知任务,可以参考我之前写的一个回答。
自动驾驶BEV感知有哪些让人眼前一亮的新方法?
图1 通过交叉注意力机制建立图像空间到BEV空间的对应关系
BEV感知的概念一经提出,就在工业界和学术界引起了广泛的关注。简单的说,视觉BEV感知包含两个部分:一个是视图转换,也就是从透视图(Perspective View, PV)到鸟瞰视图(Bird’s Eye View, BEV)的转换;另一个是多传感器的特征层融合。这两个部分统一起来看,可以认为是从单摄像头的PV视图到统一的BEV视图的转换,也可以认为是两个域(Domain)之间的转换。既然是不同域之间的转换,那么交叉注意力就可以在这里派上用场了。
如前所述,BEV感知的核心是视图转换和特征融合。本文接下来会对这个两个部分,以及交叉注意力在其中起到的作用,进行详细的介绍。
2. 视图转换
在自动驾驶应用中,常用的传感器包括摄像头,激光雷达和毫米波雷达。前者的数据形式是图像,而后两者的数据形式是点云。对于感知任务来说,我们需要得到的是场景中各种目标在车辆坐标系(或者说BEV坐标)下的位置。摄像头图像采用透视视图,因此需要将其转换到BEV视图,再进行后续的处理。这种转换在基于多摄像头的视觉感知系统中会起到非常重要的作用。至于激光雷达和毫米波雷达,由于可以直接获取场景的深度信息,其数据可以被认为已经处于以车辆为中心的世界坐标系中,并不需要像图像那样进行复杂的视图转换。
因此,在视图转换这个部分我们主要关注的是图像从透视视图到BEV视图的转换。激光雷达和毫米波雷达主要涉及的是点云特征如何在BEV视图下与图像特征进行融合,这个内容我们会在下一节介绍。
透视视图到BEV视图的转换,其思路主要有两种。一种是采用几何信息,利用场景的高度或者深度信息将图像转换到BEV视图;另一种是采用交叉注意力直接进行视图转换,不需要任何的假设,也不需要中间步骤来估计高度或者深度。
2.1 基于几何信息的方法
专栏之前在关于3D视觉感知的文章里,介绍了图像从透视视图到BEV视图的反变换方法。理论上说这是一个病态问题,但是可以通过一些额外信息来辅助解决。这些额外的信息包括深度和高度,前者可以由图像深度估计或者深度传感器(比如激光雷达)获得;后者通常来源于一些假设,比如像素位于地面,也就是高度为零。相关的一些方法可以参考以下文章。
巫婆塔里的工程师:视觉传感器:3D感知算法
下面我们主要介绍一下可以进行端对端学习的基于深度分布估计的方法。
LSS(Lift,Splat,Shoot)
LSS算法的输入是多张图像(来自于安装在车身不同位置的相机)和相机的内外参,输出则是BEV视图下的感知结果,比如目标分割或者运动预测等。
LSS方法示意图
多张图像首先用一个共享的CNN主干网络提取特征,然后分别对每个特征图进行视图转换。这个步骤的核心是估计特征图每个像素处的深度分布。这里并没有预测具体的深度值,而是给每个可能的深度值分配一个概率。假设有D个可能的深度值,那么网络在每个像素处会预测D个概率值( alpha_{1},alpha_{2},…,alpha_{D} )以及该像素处的上下文特征c(维度是C)。用 alpha 对c进行加权就得到了对应每个深度的上下文特征。这样做的好处是可以处理深度的模糊性,因为从二维图像上推测深度是有歧义的。
假设特征图大小为HxW,每个像素有D个可能的深度值。通过相机的内外参,每个像素都可以转换为三维空间中的D个点,因此每个相机的特征图都可以转换为HxWxD个点。如果有N个相机的话,那么最终就有NxHxWxD个点。这些三维点可以通过类似PointPillar中的方式转换成BEV视图下的特征。每个Pillar对应BEV中的一个网格,落到网格中的点进行Pooling操作后仍然还得到一个C维的特征。所以BEV特征的维度维XxYxC,其中X和Y是BEV网格横向和纵向的个数。
LSS中的深度分布估计和特征加权
有了融合多相机的BEV特征,后续就可以在此基础上完成不同的BEV感知任务,这里就不详细介绍了。
BEVDet和BEVDet4D
BEVDet以LSS中的视图转换为基础,在图像域和BEV域都采用了有效的主干网络来提取的特征,并以此完成3D目标检测。该方法在nuScenes基准测试上取得了非常好的效果,也进一步验证了利用深度估计进行视图转换以及在BEV视图下设计感知算法的有效性。
BEVDet主要包括四个部分。首先是图像域的编码器,可以采用经典的ResNet或者基于注意力的Swin-Trainsformer结构。然后,多幅图像的特征通过LSS中提出的方法转换到BEV视图,在该视图下进行再一次的特征提取。最后,采用CenterPoint中的Head结构来完成3D目标检测任务。
BEVDet网络结构图
BEVDet之后又增加时序融合模块,扩展为了BEVDet4D。在这个流程中,单帧数据的处理采用BEVDet中的方法,将图像转换到BEV视图下,并提取特征。BEV视图的优点之一就是对运动信息的建模比较方便。BEVDet4D中对多帧特征的处理方法非常简单,就是将T-1时刻的BEV特征对齐到T时刻的BEV特征进行对齐。具体来说,由于自车的运动,T-1和T时刻BEV特征所处的坐标系是不同的。通过平移和旋转,可以将T-1时刻的坐标对齐到T时刻的坐标。也就是说,T-1时刻的BEV特征通过平移和旋转后,其坐标与T时刻的BEV特征相同,因此就可以通过简单的叠加操作来完成融合。
时序融合也可以采用更复杂的方式,比如采用RNN来编码所有的历史信息,而不是只考虑前后两帧。之后在介绍BEVFormer时,还会出现利用交叉注意力的时序融合方法。但是,无论采用哪种方法,特征对齐都是其中一个重要的步骤。
BEVDet4D网络结构图
2.2 基于交叉注意力的方法
上一小节介绍了基于深度分布估计的视图转换方法,这种方法一个显著的特点就是需要深度估计的输出,并以此为基础把图像像素映射为三维点云。与此不同的是,基于交叉注意力的方法并没有显式的深度估计,而是用注意力的方式来直接进行不同域(这里就是指不同视图)之间的转换。
前面介绍的特斯拉FSD系统中就是采用交叉注意力来将多个相机的图像转换到BEV视图,但是AI Day的发布会上并没有提供太多的技术细节。下面我们以学术界的一个工作BEVFormer为代表,来详细介绍基于交叉注意力的BEV感知方法。
BEVFormer网络结构图
空间交叉注意力模块
如上图所示,在BEVFormer中,多幅图像首先经过主干网络进行特征提取,然后输入空间交叉注意力模块(Spatial Cross-Attention)转换为BEV特征。为了降低计算量,BEVFormer中采用了可变形注意力(Deformable Attention)来实现交叉注意力的计算。
在一般的自注意力计算中,我们需要定义query,key和value。假设元素个数为N,那么query,key和value的个数都是N。在可变形注意力中,key和value只在与query临近的位置选取,因此其个数远小于N。如果将可变形注意力用于视图转换(比如图像到BEV),那么query来自于BEV视图,而key和value则来自于图像视图。可变形注意力中key和value的定义方式也与一般的注意力计算略有不同,具体细节可以参考本系列的上一篇文章。
从上图(b)中可以看到,为了完成视图转换,我们首先需要一个BEV视图下的query。如果没有时序融合模块,那么这个query就是可学习的BEV网格特征,大小为HxWxC,其中H和W是BEV网格的个数,C是特征维度。如果包含时序融合模块,那么query就是融合后的BEV特征,这个我们后面再讲。
为了提取3D特征,BEV query上的每一个网格 Q_{p} 都被扩展为高度不同的 N_{ref} 个三维点,也就是上图(b)中红色的点。对于每一个三维点来说,都会在某些图像( upsilon_{hit} )上存在对应的位置( P(p,i,j) )。在这些位置周围,通过可变形注意力可以得到如何从图像特征( F )上选取key和value,从而得到 Q_{p}处的BEV特征。这个过程不是特别直观,需要对照着可变形注意力的公式来理解。

以上就是BEVFormer中的视图转换过程,我们可以把它跟LSS中的方法进行一个对比。LSS首先通过深度估计将图像点转换为三维点云,点特征直接来自于对应的图像特征;而BEVFormer首先定义三维网格(Htimes Wtimes N_{ref}),也就是三维点云,点特征同样来自于图像特征,但并不是直接对应,而是通过可变形注意力在对应图像点的邻近区域计算获得。因此,LSS和BEVFormer的视图转换都是通过二维图像到三维点云的对应来实现的,但主要区别在于三维点云(位置和特征)的获取方式不同。
空间注意力模块最后会输出一个BEV下的特征图,这个特征图融合了 t 时刻多幅图像的信息(key和value),同时也包含了 t-1 时刻中存贮的历史信息(BEV query)。
时序自注意力机制
时序融合部分采用的是自注意力机制,因为query和key/value都来自BEV视图,并没有视图的转换。在这个过程中,query( Q )的初始值是可学习的BEV网格特征。如果空间和时序模块被重复多次(文章中设置为6次),那么query也可以是空间注意力模块的输出。key和value则来自于上一帧输出的BEV特征( B_{t-1} )。
首先, B_{t-1} 需要对齐到 t 时刻的坐标系,记为 B’_{t-1} 。上一节介绍了,BEVDet中直接将对齐后的BEV特征与当前帧进行叠加。这是最简单的做法,理论上说可以对齐静态的场景。为什么说是理论上呢,那是因为自车的运动信息也会有误差,影响对齐的精度。即使静态场景可以精确对齐,场景中的动态目标也无法通过叠加的方式对齐。运动目标无法进行全局的对齐,只能用局部的方式来处理。因此,BEVFormer中采用了局部的可变形注意力来进行时序融合。

在时序融合的公式中,query Q 分别和 Q 自身以及对齐后的B’_{t-1}计算可变形注意力,然后再通过累加的方式合并到一起。这个输出会作为空间注意力模块的BEV query。
其它相关方法
BEVFormerV2. BEVFormer主要关注视图变换和时序融合,对于图像特征和BEV特征的提取则采用传统的卷积网络或者transformer结果,并没有进行深入的探讨。其实,在图像特征提取中,为了能够更好的获得深度信息,通常会采用基于深度预训练的主干网络结构,但这也限制了主干网络的选择。为了消除这种限制,BEVFormerV2中提出给主干网络增加一个额外的3D物体检测任务。这是一个辅助任务,可以帮助主干网络更好的提取三维特征。在训练阶段,这个额外任务与下游任务的损失合在一起,同时进行优化。除此之外,BEVFormerV2在时序融合和检测头方面也进行了相应的改进。
BEVFormerV2网络结构图
DETR3D. BEVFormer采用交叉注意力将多幅图像从透视视图转换到BEV视图,其中所用的query是稠密的。BEV视图下的每一个网格都会扩展出多个高度不同的点,这些三维点被映射到图像空间后,图像特征就可以与三维空间建立联系。因此,这是一种稠密的视图变换,所生成的BEV特征可以支持多种下游任务,比如稀疏的目标检测和稠密的语义分割。DETR3D的视图变换也采用类似的思路,但是它的query是稀疏的目标级别的,而不是稠密的网格级别的。目标query所对应的三维中心点映射回图像视图后,就可以从多幅图像来获取目标的特征,从而进一步预测目标的三维信息。更新后的目标query,又可以再从图像上提取特征,因此这是一个迭代的过程。
总的来说,DETR3D采用稀疏的视图变换,直接从二维图像来预测3D目标,没有产生BEV视图下的中间特征。这样做的好处是可以忽略稠密视图变换的部分误差,将注意力集中在需要预测的稀疏目标上,而缺点则是无法支持下游的稠密任务,比如语义分割。
DETR3D网络结构图
DETR4D. 如上所述,DETR3D是采用稀疏的目标级query,而且只考虑目标的中心点,这就限制了目标特征的感受野范围,并且会对目标位置的误差比较敏感。DETR4D针对这个问题进行改进,将一个中心点扩展为多个采样点。这些采样点的位置也不是固定的,而是由query特征预测得到的。这与可变形注意力中的offset预测有类似之处。多个采样点映射回相应的图像空间后,可以提供更为丰富的目标特征描述。
不同的query生成方法对比
除了中心点扩展,DETR4D还在时序融合以及query初始化方面进行了改进。
对于时序融合,DETR4D提出在query和图像特征两部分都利用前一帧的信息。具体来说,第T帧和第T-1帧的query进行自注意力计算,从而得到融合后的query。这个query同时映射回T帧和T-1帧的图像位置,从两帧特征上同时提取目标信息。这里无论是query还是特征的时序融合,都考虑了车辆自身的运动,用来消除两帧之间坐标的差异。
对于query初始化,DETR4D没有采用一般的随机方法,而是设计了一个“简化版”的BEV目标检测器,用来提供query的初始位置。具体来说,DETR4D中定义了一个三维网格,并将图像特征按照相机参数映射到这些网格中。这与BEVFormer中的BEV特征生成方式类似,只不过网格特征直接来源于对应位置的图像特征,并没有相对复杂的交叉注意力计算。然后,三维网格被压缩成BEV特征,通过一个轻量的卷积网络生成heatmap。而heatmap上响应比较大的点就作为初始的query。这个过程其实非常类似CenterNet的目标检测,因此也可以理解为先用一个简化的目标检测器来为每一帧提供目标query,再采用复杂的注意力机制和时序融合对目标位置进行细化。
DETR4D网络结构图
PETR. 在之前介绍的方法中,不管是采用稠密的还是稀疏的query,图像特征都要通过一个“采样”的过程映射到三维空间,而这个过程对系统的运行速度有一定影响。为了避免特征采样,PETR中提出在图像特征上附加三维空间信息的编码。目标检测过程还是是在二维图像空间上完成,只不过这里的特征已经包含了三维信息,可以看作是一个加强版的图像特征。

PETR网络结构图
三维特征编码,其实就是给图像特征的每一个像素附加D个可能的深度,这样就可以从图像坐标生成三维坐标。这些三维坐标经过全连接层的处理之后,作为附加特征与图像特征进行拼接。这个过程与前面介绍的LSS中对深度信息的处理有些类似,只不过PETR中没有根据深度信息生成点云,而是直接把三维坐标作为特征来使用。
3. 特征融合
自动驾驶系统中通常都需要多个传感器,不同传感器具有不同的视图,比如相机采用透视视图,激光雷达和毫米波雷达采用三维视图或者BEV视图。即使同样是相机,其透视视图也会随着相机的安装位置而变化。视图的不同会给传感器融合带来不便,尤其是特征层的融合。BEV感知的优点之一就是把所有的传感器都转换到统一的BEV视图,这样就消除了不同视图带来的影响。
前面介绍的BEVDet和BEVFormer,都是将多幅图像转换为三维点云(虽然方法不同)。而从点云生成BEV特征的过程就自然的包括了多相机的特征融合:BEVDet中是简单的Pooling操作,而BEVFormer中则是基于注意力机制的加权求和。虽然基于注意力的方法具有更大的可学习空间,但是目前从performance的角度来看,二者基本处于同一水准。
将多相机的图像转换到BEV视图以后,图像和激光雷达或者毫米波雷达点云的融合也会变得非常容易。以激光雷达点云为例,它本身已经处于三维世界坐标系下,将其转换为BEV视图非常简单。当多传感器的数据都处于BEV视图时,我们就可以很容易的把它们都拼接到一起,从而完成融合。
BEVFusion采用了上述策略,将多相机和激光雷达的数据在BEV视图下融合到一起。由于深度估计会有一定误差,图像进行视图转换后并不能够完全与激光雷达的BEV特征对齐。因此,BEVFusion中提出在拼接后的BEV特征上进行一些卷积操作,以消除局部的对齐误差。
BEVFusion的融合流程
在2.2节中我们介绍了两种不同的query生成策略:稠密 vs. 稀疏。BEVFusion中采用的是稠密的query策略,每个传感器都生成了BEV特征,再进行融合。同样的,特征融合也可以在稀疏query的基础上进行,也就是在目标级别上进行。
FUTR3D采用的就是这种基于稀疏query的融合策略。它首先会随机初始化一些query,并将其编码为三维坐标,作为目标的初始位置(参考点),以此为基础从来自不同传感器的特征上进行采样。融合的过程就是把这些采样的特征拼接到一起,用MLP进行处理,并附加相应的三维坐标信息。这个特征被用来更新query,同时也用来预测目标的位置,大小,速度等信息,并以此来更新三维参考点的位置。这是一个迭代的过程,每次迭代都会更新参考点位置,从而一步步逼近真实的目标位置。

FUTR3D网络结构图
无论是稠密的还是稀疏的策略,上述方法中的query都是在三维空间中定义,并独立于传感器的。也就是说不同的传感器特征会通过特定的映射对应到这些共用的query上,以此为纽带来完成特征融合。除此以外,还有一种融合的策略,并没有共用的query,而是以一种传感器的特征为query,通过交叉注意力把其他传感器的特征与之进行融合。谷歌提出的相机和激光雷达融合的DeepFusion方法采用的就是这种策略。
传统的点云+图像融合和DeepFusion的对比
这种融合方法与传统的给点云附加图像特征的方式(上图左侧)更加类似,但是是在点云特征(而不是点云)的基础上采用了更为复杂的注意力机制来完成融合。
4. 总结
BEV感知近两年来引起了学术界和工业界很多的关注,重要的原因之一在于它可以将多个相机的图像转换并融合到一个统一的三维坐标系下,可以很好的支持下游的感知任务,同时也方便了与激光雷达和毫米波雷达进行特征层融合。
粗略的说,BEV感知的技术路线有两大类:一种是生成稠密的BEV特征,可以支持多种下游感知任务;另一种则是直接生成稀疏的三维目标,但是无法支持输出稠密结果的下游感知任务,比如语义分割。
在稠密的BEV感知中,通常会定义一个三维的BEV网格,通过相机的内外参矩阵与图像空间建立对应关系,从而把图像特征映射到BEV空间。这个映射可以是简单的双线性插值(Simple-BEV),也可以基于图像的深度估计进行加权(LSS,BEVDet),也可以通过交叉注意力来进行加权(BEVFormer)。从目前各种方法提供的实验结果来看,不同映射方法之间的差别并不大。反而是一些训练的细节,比如BatchSize,Augmentation,图像大小等对算法结果影响较大(可以参考Simple-BEV文章中的实验结果)。这应该也是后续需要进一步研究和探讨的地方。
在稀疏的BEV感知中,通常会采用DETR的目标检测框架,直接根据稀疏的query来获得三维目标框。这些query是在三维空间中定义的,同样通过相机的内外参矩阵与图像空间建立对应关系,从而把图像特征映射到query上。这个过程与稠密的BEV感知是类似的,比如DETR3D和DETR4D中就是采用了双线性插值来进行采样。此外,也可以不采用显式的空间映射,而是将三维空间信息附加在图像特征之上,直接由增强的图像特征来预测三维目标,比如PETR中的做法。
BEV感知将多个相机的视觉信息映射到BEV空间,这样就可以非常方便的与激光雷达和毫米波雷达进行融合。这种融合同样可以在稠密(比如BEVFusion)和稀疏(FUTR3D)两种方式下进行。

发表回复