激光雷达作为一种可以直接并且精确获取3D信息的传感器,它与视觉的融合在多传感器感知系统中是非常重要的一环。既然是传感器融合,当然也逃不开老生常谈的两种模式:
后融合主要是基于一些传统的方法,比如多目标跟踪,卡尔曼滤波状态估计等,另外也有一些基于机器学习模型的方法。后融合方法基本上不会区分具体融合的是什么传感器,因为融合的输入是各个传感器的感知结果。不管是什么传感器,感知结果的形式都是类似的(最常见的就是目标框,而融合的核心则在于如何关联来自不同传感器的感知结果。下面这篇文章介绍了近期出现的一些基于深度学习模型的数据关联方法。
后融合方案目前在自动驾驶的量产系统里仍然是主流,但是随着端到端范式的兴起,前融合方法会变得越来越重要。其实,前融合就是感知模块的端到端,是端到端自动驾驶系统的一个组成部分。下面这边文章介绍了早期的一些激光雷达和视觉的前融合(或者混合融合)方法。
特征和决策层的混合融合,通常是一种传感器提供目标框proposal,另外一种传感器提供辅助特征。这种方式严重依赖于单一传感器提供的proposal质量,无法充分利用传感器数据之间的互补性。
特征层融合,在早期的方法中主要是在图像视图(Perspective View,PV)下进行融合。激光点云具有3D信息,因此可以准确的转换到图像平面,与图像像素进行关联。然后,我们可以选择图像像素附加上激光点云的几何特征,也可以反过来给激光点云附加上图像特征。后续的任务也就可以相应的在图像或者点云数据上进行,只不过这里无论是图像特征还是点云特征都是经过融合增强了的。但是,无论采取那种方式,都会带来信息的损失。如果以图像为主导,激光点云投影到图像平面会丢失3D信息。如果以激光点云为主导,由于其稀疏性,图像中丰富的语义信息也无法充分利用。
近几年,BEV方法逐渐成为视觉感知的主流方案,解决了视觉特征从PV到BEV的转换问题。LiDAR点云本来就在3D坐标下,可以很容易的生成BEV视图特征。统一到BEV视图后,两种传感器的特征融合变得更加方便,而且理论上没有信息的损失。接下来,本文就对最新的视觉和激光雷达融合方法进行梳理,尤其是BEV视图下的特征(前)融合。
这些特征融合方法大致可以分为两类。一种是图像和激光分支分别生成稠密的BEV特征(激光提供增强的深度信息),两种特征利用拼接操作或者交叉注意力进行融合。另一种是直接用稀疏的交叉注意力来融合不同传感器的特征(不要求特征在同一视图下),但是这种方式无法接下游的稠密感知任务。
下面的介绍会涉及到很多跟注意力机制和BEV感知相关的内容。如果对这部分还不是很熟悉的话,可以参考专栏之前的一些介绍文章。
BEVFusion的算法结构非常简洁,可以看作稠密特征融合的baseline方法。图像和激光雷达分支分别独立生成BEV特征。这里视觉特征的转换没有用到激光点云提供的深度信息。两种BEV特征拼接到一起,用卷积模块进行处理,以适应两种特征在空间上小的misalignment。除了卷积,我们还可以采用交叉注意力(用稠密的BEV网格作为 query),好处是对misalignment更加鲁棒,坏处是计算量变大。
稠密BEV特征融合的核心之一在于图像的视角转换,而图像视角转换的难点在于深度估计。针对这个问题,该方法提出了一种利用激光雷达点云辅助图像深度估计的方法。这其实也是激光和视觉融合的一种常见思路。EA-LSS方法可以和任何一种稠密BEV融合框架结合,比如上面介绍的BEVFusion。
下图展示了利用激光雷达点云辅助图像深度估计的流程。首先,激光点云投影到图像平面得到深度图。这个深度图是稀疏的,所以不能用来直接做图像视角转换。深度图与图像特征拼接后,就可以用来估计稠密的深度图。同时,它还可以用来生成上下文特征,与图像特征相加后用来给深度图加权。所以,深度图的值是每个像素在不同深度上的分布权重(或者说概率值)。整个深度估计的流程中还有一些附加的损失函数,用来辅助学习。
激光雷达点云除了可以直接为图像视角转换提供深度信息,也可以在交叉注意力框架中,隐含的提供深度信息。如下图所示,激光的BEV特征作为初始的query,跟图像PV特征进行可变形交叉注意力计算。这与BEVFormer中的BEV query类似,但是激光query具有很多的几何信息。通过交叉注意力,图像特征中包含的信息被嵌入到了BEV query中,也就相当于转换到BEV视图。转换后的图像特征可以与LiDAR BEV特征拼接,作为下一次的query。所以这是一个迭代的过程。
经过多次迭代后,图像特征和激光BEV特征再进行一次融合。这里采用的是最简单的特征拼接的方式。当然,BEVFusion4D中还有时序融合的模块,不过这个与传感器融合没有什么关系。
DeepInteraction提出让两个分支更多的交互,并且每个分支都保持原来的数据视图。而在前面介绍的几种方法中,除了提供额外深度信息以外,激光和图像分支的交互只有最后阶段的BEV特征融合。在原始的数据视图上,两种传感器并没有任何交互,视觉和激光分别独立的生成2D和3D特征。
对于图像分支,图像PV特征作为query,与激光BEV特征进行交叉注意力计算。相应的,对于激光分支,激光BEV特征作为query,与图像PV特征进行交叉注意力计算。
分支进行交互操作后,得到的仍然是图像PV特征和激光BEV特征。两种特征最终利用稀疏的注意力进行融合(具体方法可以参考下一节的介绍)。所以,该方法同时采用了稠密和稀疏的特征融合方式。
在UniTR中,图像和点云数据首先被划分为多个token(具体方法参考原文,这里就不赘述了),然后采用基于动态划分的窗口注意力机制分别提取特征。其背后的动机类似于SwinTransformer,在保证一定感受野的前提下,提高计算效率。
接下来,两种token分别在图像和点云的坐标系下进行交互,这种方式和DeepInteraction有些类似。具体来说,激光token映射到2D坐标后,与图像token一起进行动态划分,计算窗口注意力。然后,图像token映射到3D坐标(这里利用了点云的深度信息),与激光token一起进行动态划分,计算窗口注意力。经过这两轮交互操作,每种token中都同时包含了点云和图像的信息。最终,激光token被用来生成BEV特征,并接入下游的感知任务。
利用激光点云提供额外的深度信息,是图像视角转换的关键之一。但是相对图像来说,激光点云非常稀疏,只有少数的像素点可以与之关联。为了使给像素都找到一个深度值,最简单的就是采用最近邻方法。但是,当像素距离激光投影点较远时,深度的误差可能会很大(如下图a所示)。
为了解决这个问题,很多方法提出把图像特征与激光点云融合(拼接或者注意力),用来做稠密的深度估计。这其实相当于把单目深度估计和点云的深度信息做了一个融合。MSMDFusion中提出了一种更简单的方式,那就是用K近邻方式进行关联。具体来说,每个像素点都去找附近K个最近的激光投影点(如下图b所示,K=2),用它们的平均深度值作为该像素的深度值。
该方法也是基于BEVFusion的框架,主要的区别在于通过语义分割从图像特征中提取前景区域,只有这些区域的语义特征会保留下来做后续的处理。比如,只有这些语义特征会通过视角变换转到BEV视图,也只有这些特征会被用来给激光点云提供语义信息。根据文中的统计,前景区域只占图像的大约15%,这就大大降低了视角变换的计算量。
FUTR3D采用基于稀疏query的融合策略。它首先会随机初始化一些query,并将其编码为三维坐标,作为目标的初始位置(参考点),以此为基础从来自不同传感器的特征上进行采样。注意这里传感器的特征并不需要在同一视图下。融合的过程就是把这些采样的特征拼接到一起,用MLP进行处理,并附加相应的三维坐标信息。这个特征被用来更新query,同时也用来预测目标的位置,大小,速度等信息,并以此来更新三维参考点的位置。这是一个迭代的过程,每次迭代都会更新参考点位置,从而一步步逼近真实的目标位置。
TransFusion也是基于稀疏的query进行融合,但query是依次与激光和图像特征计算交叉注意力,而不是像FUTR3D那样直接融合不同来源的特征。
在基于稀疏query的方法中,query的初始化非常重要。如果初始化的位置比较靠近真实的目标,我们就可以减少解码层需要的层数,从而减少计算量。FUTR3D采用的是随机初始化,而TransFusion则利用图像和激光的特征,预测object heatmap,并选择局部极值点作为初始的BEV query。这里图像和激光特征是通过交叉注意力进行融合的。比较特别的是,图像特征在列的方向上进行压缩,再作为key和value。
CMT方法采用均匀采样的query,这些query同时与来自图像和激光点云的token特征进行交叉注意力计算。这与FUTR3D中的方式类似,与TransFusion中的图像和激光依次计算有所区别。此外,这个方法主要的贡献在于给query和token(key+value)都附加了位置编码。
与之前介绍的方法相比,SparseFusion主要有两点改进。首先,query分别由激光和图像特征生成。图像query转换到激光坐标后,两种query合并到一起作为最终的query集合。相比于FUTR3D(随机采样),CMT(均匀采样)和TransFusion(以激光为主),SparseFusion的query包含更多的目标信息,同时也具有较高的recall。
其次,在生成query之前,视觉和激光特征进行了相互融合。具体来说,激光特征为图像提供深度信息,包含深度信息的图像特征反过来为激光点云提供更多语义信息。从这个意义上来说,SparseFusion结合了稠密和稀疏两种融合方式。
该方法的主要思路也是由图像和激光分支分别生成query,合并到一起之后再与图像和激光特征计算交叉注意力,从而得到最终的3D检测结果。
激光分支(下图左)通过3D检测生成3D BBox,以此为基础生成query。query的特征包括两部分,一部分是BBox的长宽高和朝向经过编码之后与点云特征合并,另一部分是BBox的3D中心位置。
图像分支(下图右)通过2D检测生成proposal,以此为基础生成query。query的特征包括两部分,一部分来自ROI区域内的语义特征以及相机的内参矩阵,另一部分是proposal的深度分布(来自深度估计)。值得注意的是,这里没有用深度估计的值把图像特征或者proposal转换到3D空间,而只是把这些不准确的估计作为query的一部分。
如下图所示,初始的query由图像3D检测生成。同时为了提高recall,随机采样的query也被加入进来。初始的3D query通过类似可变形交叉注意力的方式与图像和激光特征交互,然后通过特征拼接生成refined query。合并的过程中用到了uncetrainty进行加权,uncetrainty是与query到坐标原点的距离相关的。距离越远,query离自车就越远,uncertainty也就越大。
对于稠密融合来说,典型就是BEVFusion中提出的多分支结构。在这种结构中,图像分支和激光分支分别单独生成2D和3D特征,两种特征转换到BEV视图下再进行融合。激光3D特征转BEV比较直观,因此这个框架里核心的部分是图像2D特征到BEV的转换,以及BEV特征融合。
必一运动官网
与视觉BEV感知类似,图像的视角转换可以采用深度信息(类似LSS)或者注意力机制(类似BEVFormer)。前者主要利用激光点云提供的深度信息作为辅助,与图像特征结合后生成稠密的深度图,比如EA-LSS。后者利用BEV query,隐含的将图像特征转换到BEV视图,比如BEVFusion4D。BEV特征的融合可以采用简单的拼接+卷积的方式,也可以采用复杂一些的交叉注意力机制。
此外,还有些方法提出增加融合的力度,比如在图像和激光特征生成的时候也进行一定程度的融合。从直觉上说,就是用激光特征来增强2D图像特征的几何信息,用图像特征来增强3D激光特征的语义信息。这些增强以后的特征,可以直接用来接下游的感知任务(比如UniTR),也可以再进行下一阶段的融合(比如DeepInteraction和SemanticBEVFusion)。
稠密融合的优点是可以生成通用的BEV特征表示,后面可以接任何感知任务,比如目标检测、地面元素检测,OccupancyMap等等。但是,稠密融合的计算量比较大。在线上系统中,为了降低算法延迟,我们可以根据后端的感知任务选择性的融合一部分特征,也就是稀疏融合。
对于稀疏融合来说,典型的就是FUTR3D中采用的方式。具体来说,稀疏的query利用类似可变形注意力的方式,跟图像和激光特征进行交互,从而更新query特征。这个过程不断迭代,query会逐渐接近真实的目标,比如物体框、地面元素等。
在稀疏融合中,核心模块是query的生成。高质量的query可以减少迭代的次数,降低计算量。随机采样(FUTR3D)和均匀采样(CMT)是两种比较简单的方式,它们的优点是可以保证recall的下限,缺点是需要较多的迭代次数。更好的方式是采用传感器的中间感知结果来初始化query(TransFusion,SparseFusion,MV2DFusion),这时候query已经比较接近真实的目标,迭代次数就可以大大减少。同时,为了保证query的recall,采样的方式也可以同步使用(SparseLIF)。
有些方法中同时采用的两种融合方式,比如SparseFusion和DeepInteraction。在特征生成阶段,可以采用稠密融合,增加特征中的信息量。然后,稀疏的query再与这些特征进行交互。
必一运动官网
下表给出了各种方法在nuScenes数据库上的性能对比,分别用NDS(nuScenes Detection Score)和FPS(Frame Per Second)作为3D目标检测准确率和运行速度的指标。需要注意的是,运行速度取决于很多因素,比如特征提取网络的规模,硬件的算力,以及算法的优化情况等等,所以这里FPS的对比仅仅只是作为一个参考。