一、简介
多传感器融合对于精确可靠的自动驾驶系统至关重要。最近的方法是基于点级融合:用相机特征增强激光雷达点云。然而,相机到激光雷达的投影丢弃了相机特征的语义信息,阻碍了这些方法的有效性,特别是对于面向语义的任务(如3D场景分割)。
BEVFusion是一种高效且通用的多任务多传感器融合框架。它在共享鸟瞰图(BEV)表示空间中统一了多模态特征,很好地保留了几何和语义信息。为了实现这一目标,我们通过优化的BEV池化来解决视图转换中的关键效率瓶颈,将延迟减少了40倍以上。BEVFusion基本上是任务无关的,支持不同的3D感知任务,几乎没有架构上的变化。它在nuScenes数据集,3D物体检测上提高了1.3%的mAP和NDS,在BEV地图分割上提高了13.6%的mIoU,计算成本降低了1.9倍。代码见https://github.com/mit-han-lab/bevfusion。
二、创新点
1. BEVFusion将相机和激光雷达特征统一在一个共享的BEV空间中,而不是将一种模式映射到另一种模式(LiDAR-to-camera或camera-to-LiDAR)。它保留了相机的语义信息和激光雷达的几何信息。任务无关,支持大多数的3D感知任务。
2. 确定了视图转换过程中的效率瓶颈。BEV池化操作占用运行时间的80%以上。因此,提出了具有预计算(precomputation)和间隔缩减(interval reduction)的专用核来消除这一瓶颈,实现了超过40倍的加速。
3. 应用全卷积BEV编码器融合统一的BEV特征,并加入一些任务头来支持不同的目标任务。
现有方法缺点:
1:LiDAR-to-camera ,几何失真
由于在二维感知方面取得的巨大成功,自然的想法是将激光雷达点云投影到图像上,并用二维CNNs处理RGB-D数据。 然而,这种点云到图像的投影引入了严重的几何失真,这使得它对面向几何的任务(如三维物体识别)的有效性降低。
2:camera-to-LiDAR,语义信息损失
最近的传感器融合方法也是朝着另一个方向发展的。 它们用semantic lables、CNN features、virtual point from 2D image 来增强激光雷达点云,然后使用基于激光雷达的检测器器来预测三维包围盒。 虽然它们在大规模检测基准上表现出了显著的性能,但这些点级融合方法几乎不能用于面向语义的任务,如BEV地图分割。 这是因为相机到激光雷达的投影在语义上是有损的。
三、算法流程
上图是BEVFusion的框架,流程如下:
给定不同的传感器输入,应用特定模态的编码器(modality-specific encoders)提取特征。
将多模态特征转换为一个统一的BEV表示,保留了几何和语义信息。
将基于卷积的BEV编码器应用到统一的BEV特征中,以缓解不同特征之间的局部失调。
添加不同的任务头进行不同的3D任务。
3.1 统一表示 (Unified Representation)
不同的特征可以存在于不同的视图中。 例如,相机特征在透视图中,而激光雷达/雷达特征通常在3D/鸟瞰视图中。 即使对于相机特征,它们中的每一个都有一个不同的视角(前后左右)。 这种观点差异使得特征融合变得困难,因为不同特征张量中的相同元素可能对应于完全不同的空间位置(在这种情况下,原始的元素特征融合将不起作用)。 因此,寻找一种共享的表示方式是至关重要的,而且需要
(1)所有传感器特征都可以很容易地转换成共享的表示方式而不丢失信息
(2)共享的表示方式适合于不同类型的任务。
我们采用鸟瞰视图(BEV)作为融合的统一表示。 这个视图对几乎所有的感知任务都很友好,因为输出空间也在BEV中。 更重要的是,到BEV的转换既保持了几何结构(来自激光雷达特征),又保持了语义信息(来自相机特征)。 一方面,Lidar-to-BEV投影使稀疏的Lidar特征在高度维度上变平,从而不会在图形上产生几何畸变。另一方面, Camera-to-BEV投影将每个相机特征像素投射到三维空间中的一条射线,这可以导致密集的BEV特征映射, 保留来自相机的全部语义信息。
3.2 高效的摄像机到BEV的转换 (Efficient Camera-to-BEV Transformation)
camera→BEV的转换是非常重要的,因为每个相机特征像素的深度本质上是模糊的。
转换方法:camera特征 (显式预测像素离散深度)→ 3D 点云特征(BEV pooling聚合点云特征)→BEV特征
如同LSS和BEVDet方法,我们显式预测每个像素的离散深度分布。 然后,我们将每个特征像素沿着摄像机光线分散成D个离散点,并根据它们对应的深度概率重新确定相关特征。 这生成大小为N × H × W × D 的相机特征点云,其中N是相机的数量,(H,W)是相机特征图大小。 这样的3D特征点云以r (例如,0.4m)的步长沿着X、Y轴被量化。 我们使用BEV pooling 操作来聚合每个r × r BEV网格中的所有特征,并沿着Z轴压平特征。
虽然简单,但BEV pooling 极其低效和缓慢,在RTX 3090 GPU上需要500ms以上(模型的其余部分只需要100ms左右)。 这是因为相机功能点云非常大:对于典型的工作负载每帧可能会产生大约200万个点,比激光雷达特征点云密度高两个数量级。 为了解决这一效率瓶颈,我们提出了通过precomputation和interval reduction来优化BEV pooling。
Precomputation :
通过预计算,把点云中的每个点赋予在BEV网格的排序编号。
BEV池化的第一步是将相机特征点云中的每个点与一个BEV网格关联起来。网格关联后,同一BEV网格内的所有点将在张量表示中是连续的。与激光雷达点云不同的是,相机特征点云的坐标是固定的(只要相机内参和外力保持不变,通常经过正确的校准后就是这样)。在此基础上,我们预先计算了每个点的三维坐标和BEV网格索引,我们还根据网格索引对所有点进行排序,并记录每个点的rank,在推理过程中,我们只需要根据预先计算的rank对所有特征点进行重新排序,这种缓存机制可以将网格关联的时延从17ms降低到4ms
Interval Reduction:
BEV pooling 的下一步是通过某种函数(例如,均值、最大值和总和)聚合每个BEV网格中的特征。
原来的方法:
如图3(b)所示现有执行情况首先计算所有点的前缀和,然后减去索引变化边界处的值。 然而,前缀和操作需要在GPU上进行tree reduction,并产生许多未使用的部分和,这两种操作都是低效的。
解决方案:
为了加速特征聚合,我们采用一个专门的GPU核直接在BEV网格上并行化:我们为每个网格分配一个GPU线程,该线程计算其间隔和并将结果写回。 该内核消除了输出之间的依赖关系(因此不需要多级tree reduction),并避免将部分和写入DRAM(动态随机存储器),将特征聚合的延迟从500ms减少到2ms
3.3 全卷积融合 (Fully-Convolutional Fusion)
当所有的模态特征转换为共享的BEV表示时,我们可以很容易地用元素操作(如级联)将它们融合在一起。 在同一空间中,由于视图变换中的深度不准确,激光雷达和摄像机的BEV特征在空间上仍会出现一定程度的错位。 为此,我们应用了一个基于卷积的BEV编码器(带有少量残差块)来补偿这种局部不对齐。
3.4 多任务头 (Multi-Task Heads)
我们将多个特定于任务的头应用于融合的BEV特征映射。 我们的方法适用于大多数三维感知任务。 我们展示了两个例子:三维物体检测和BEV地图分割。
Detection
我们使用一个特定于类的中心HeatMap头来预测所有对象的中心位置,并使用一些回归头来估计对象的大小、旋转和速度。 我们向读者介绍以前的3D检测论文了解更多细节。
Segmentation
不同的地图类别可能会重叠(例如,人行横道是可驾驶空间的子集)。 因此,我们将此问题表述为多个二进制语义分割,每类一个。 我们遵循CVT用标准焦损训练分段头.
四、未来优化方向
我们的方法可能受益于更精确的深度估计(例如,用地面真实深度来监督视图)。