【多模态融合】BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird‘s-Eye View Representation

论文链接:BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird's-Eye View Representation

代码链接:https://github.com/mit-han-lab/bevfusion

作者:Zhijian Liu,Haotian Tang,Alexander Amini,Xinyu Yang,Huizi Mao,Daniela Rus,Song Han

发表单位:MIT、上海交通大学

会议/期刊:ICRA 2023

一、研究背景

自动驾驶系统上往往部署了多个传感器,例如,Waymo 的自动驾驶汽车有 29 个摄像头、6 个雷达和 5 个激光雷达。不同的传感器提供互补信号:例如,摄像头捕获丰富的语义信息,LiDAR 提供准确的空间信息,而雷达提供即时速度估计。因此,多传感器融合对于准确可靠的感知具有重要意义。

来自不同传感器的数据以本质不同的方式表示:例如,摄像头以透视视图捕获数据,而激光雷达以 3D 视图捕获数据。为了解决这种视图差异,我们必须找到一个适合多任务多模态特征融合的统一表示。

如图(a)所示,LiDAR→camera,原本的3D点位置关系会发生扭曲,本来红点和蓝点距离比较远,结果投影后便相邻了;如图(b)所示,一个密集的2D图像区域,可能只被很少的点云数据覆盖(因为点云近密远疏)。

目前在多模态融合上有2套常见的方法:(1)LiDAR→camera,这会造成几何畸变;(2)camera→LiDAR,仅少量像素点会和3D特征匹配,造成语义密度差异。

对于方案(1),由于 2D 感知取得了巨大成功,自然而然的想法是将 LiDAR 点云投射到相机上,并使用 2D CNN 处理 RGB-D 数据。然而,这种LiDAR到相机的投影引入了严重的几何畸变(见图1a),这使得它对面向几何的任务(如3D物体识别)的效果较差。

当将LiDAR数据投影到相机上时,通常使用2D表示形式(例如2.5D深度图),这种转换是几何上有损的。这意味着原始3D LiDAR数据中的空间关系在映射到2D相机图像时可能会发生扭曲。例如,在深度图上靠近的两个点在3D空间中实际上可能相距很远。这种畸变使得数据在依赖精确几何结构的任务中效果不佳,如3D物体检测。

对于方案(2),使用语义标签、CNN 特征或来自 2D 图像的虚拟点来增强 LiDAR 点云,然后应用现有的基于 LiDAR 的探测器来预测 3D 边界框。尽管它们在大规模检测基准测试中表现出了卓越的性能,但这些点级融合方法几乎不适用于面向语义的任务,例如BEV分割。当将相机数据投影到LiDAR上时,会导致语义密度的损失。这是因为与相机捕获的密集像素数据相比,LiDAR数据是稀疏的。在典型的设置中,如32束LiDAR,只有不到5%的相机特征将直接对应于一个LiDAR点。这种稀疏的匹配意味着很多相机捕获的语义信息(细节和上下文数据)未被使用,这降低了融合数据在语义导向任务(如鸟瞰图(BEV)地图分割)中的有效性。

作者提出了第三种方案——BEVFusion 将摄像头和 LiDAR 功能统一在一个共享的 BEV 空间中,而不是将一种模式映射到另一种模式。它保留了相机的语义密度和激光雷达的几何结构。

本文贡献:

(1)提出BEVFusion,在共享鸟瞰图(BEV)表示空间中统一多模态特征,保持了3D几何结构和2D语义密度,可以支持各自的3D感知任务(task-agnostic);

(2)作者在实验中发现,BEV 池化操作就占用了模型运行时间的 80% 以上,是视图转换中主要的效率瓶颈,提出了一个具有预计算和间隔减少的专用内核来消除这一瓶颈,实现了40倍加速;

(3)BEVFusion在nuScenes基准上设置了最先进的新性能,成本更低,指标更高。(2022年6月3日,nuScenes第一;2022年8月16日,Waymo第一)。

二、整体框架

BEVFusion 从多模态输入中提取特征,并使用视图转换有效地将它们转换为共享鸟瞰图 (BEV) 空间。它将统一的 BEV 功能与全卷积 BEV 编码器融合在一起,并通过特定任务的head支持不同的任务。

(1)BEVFusion对每种类型的传感器数据(如相机图像和LiDAR点云),使用专门的编码器来提取特征;

(2)随后,将不同传感器的特征转换到一个共享的BEV表示空间中。这一步骤关键在于保留了从相机得到的丰富语义信息和从LiDAR得到的准确空间信息;

(3)通过预计算和区间缩减优化的BEV池化操作,有效地处理大量的数据点,将特征聚合到BEV网格中;

(4)在BEV空间中,将来自不同传感器的特征合并,使用全卷积网络(如BEV编码器)来处理可能存在的局部不对齐问题;

(5)根据不同的3D感知任务,比如3D对象检测和BEV地图分割,添加特定的head。

三、核心方法

3.1 Unified Representation

选择鸟瞰图(BEV)作为多模态特征融合的统一视图是因为大多数3D感知任务的输出空间也是在BEV中。这种表示不仅对于不同任务具有通用性,而且能够更自然地集成多种传感器数据。

  • LiDAR到BEV的投影:通过将LiDAR数据投影到BEV视图,可以将空间信息(高度信息)进行压平处理,而不会引入几何畸变。这是因为LiDAR数据本身是三维的,而在BEV中,这种三维结构被压缩到二维平面上,高度信息通常以其他方式(如颜色编码)表示,从而保持了物体的基本几何结构。

  • 相机到BEV的投影:相机数据的转换则是通过将每个像素特征“投射”回三维空间中的一条射线来实现的。这意味着,相机捕捉的每个像素点都被映射回其对应的三维位置,并在BEV map中以相应的密度填充。这样不仅保留了来自相机的丰富语义信息,还能够在BEV map中生成一个密集的特征图。

3.2 Efficient Camera-to-BEV Transformation

Camera-to-BEV transformation

相机捕捉的图像数据中,每个像素的深度信息不是直接可知的,这导致从相机视角到BEV视角的转换具有固有的不确定性。为了解决深度的不确定性问题,采用了类似LSS和BEVDet的方法,通过预测每个像素点的离散深度分布来明确其深度。流程如下:

(1)首先,对于图像中的每个像素点,预测它的深度分布。这意味着为每个像素点计算一组可能的深度值及其对应的概率。

(2)每个像素点根据其深度分布沿着相应的射线被分散成多个点(D个离散点)。例如,如果一个像素点的深度概率预测显示它可能位于2米、4米和6米处,那么这个像素点将在这三个深度位置上各生成一个点。

(3)这些生成的点将继承原始像素点的特征(如颜色、强度等),但会根据它们的深度概率进行调整。这可能涉及到根据距离调整特征的强度,因为对象越远,其在图像中的表现可能越弱。(如上图a所示)

此过程生成一个三维特征点云,其中包含了原始二维特征映射到三维空间的结果。单个点云的大小由相机数量N、相机特征图大小(H, W)决定,并且每个特征点都被分散到若干离散的三维点上。整个点云的数据大小就是 �×�×�×� 。

为了进一步处理这种3D点云信息,采用BEV池化。沿着x,y轴进行量化,步长是r(比如0.4m)。BEV池化操作聚合每个 �×� BEV网格内的所有特征,然后沿着z轴展平特征(比如取平均、取最大值等统计操作)。

然而,现有的池化操作效率很低,在 RTX 3090 GPU 上需要超过 500 毫秒。每帧可能产生大约200万个点(相机图像从256x704进行8倍下采样到32x88,N=6,D=118(因为深度分布范围是[1, 60],步长是0.5),118x32x88x6=1193728),比LiDAR特征点云的密度高两个数量级。为了消除这一效率瓶颈,作者建议通过预计算和区间缩短来优化BEV池化。

3.2.1 Precomputation

BEV 池化的第一步是将相机特征点云中的每个点与 BEV 网格相关联。

Lidar点云通过发射激光并测量激光返回时间来确定距离,每次扫描可能涵盖不同的物体或物体的不同部分,特别是在动态环境中。而扫描的结果受多种因素影响,包括设备的精确位置、扫描角度、环境条件(如雨、雾)等。这些因素都可能导致即使在相同位置,不同时间点的扫描结果也会有所不同。

相比于Lidar点云,相机特征点云的坐标是固定的。因为相机通过光学透镜将外部环境投影到感光元件上,形成图像。这个过程遵循几何光学原理,当相机的内参(焦距、主点位置等)和外参(相机在空间中的位置和朝向)固定时,同一个三维场景点在相机图像中的位置也是固定的。

一旦相机经过校准,其内外参数在没有物理移动或调整的情况下通常保持稳定。这意味着在相同的拍摄条件下,每个图像像素对应的三维空间坐标是固定的,即使多次拍摄同一场景,每个像素点对应的空间位置也基本不变。

因此,可以进行预计算。

(1)对每个像素点,根据相机的内外参数,计算它在三维空间中的位置;

(2)根据这些三维坐标,提前确定每个点应该属于哪一个BEV网格;

(3)每个点按照它们的BEV网格索引进行排序;

(4)记录每个点在排序后的位置(排名),这个排名反映了点在BEV网格中的顺序。

在实际推理阶段,就不再需要重新计算每个点的BEV网格位置,而是直接根据预先计算好的排名来重新排序点云。这种方法是一种高效的缓存机制。

通过这种预计算和快速重排序的方法,将原本可能需要更长时间的网格关联过程(从17ms)缩短到仅需4ms。这显著提高了数据处理速度,降低了系统的响应时间。

3.2.2 Interval Reduction

BEV池化的第一步,每个点根据其空间位置被分配到相应的BEV网格中。在张量(Tensor)表示中,属于同一网格的所有点会连续排列。那么,下一步就是通过一些对称函数(例如,平均值、最大值和总和)聚合每个 BEV 网格中的特征。

比如LSS中用的就是求总和的方法进行聚合特征,比如1+3=4,7-1-2=4

在过去的实现方法(LSS,上图)中,首先计算所有点的前缀和。前缀和是一种累加的方式,即从第一个元素开始,逐个加上后续元素的值。

在计算前缀和后,需要在每个BEV网格的边界处进行减法操作,以获得该网格内所有点的特征总和。

这是因为前缀和包含了前面所有点的累计结果(如上图的下面部分Pref. Sum所示,第一个值是1,第二个是1+3=4,第三个是1+3+7=11,存储了大量中间过程的值)。前缀和操作需要在GPU上进行树形归约(Tree Reduction),这不仅计算量大,而且会生成许多不需要的中间结果(部分和)。此外,这种方法需要多级内存访问和数据依赖,导致效率低下。

实际上,对于一个网格,它的特征总和可以通过取该网格最后一个点的前缀和与该网格第一个点前一个点的前缀和之差来获得。例如,如果一个网格包含点索引从i到j,那么这个网格的特征总和为:

prefix\_sum[j] - prefix\_sum[i-1]

但是,前缀求和操作需要在 GPU 上进行树形归约,这是一种将所有元素逐步合并直到只剩一个元素(总和)的过程。这需要多个步骤,每个步骤处理不同级别的归约,每次归约将并行宽度减半,增加了计算的复杂度。

在实际的BEV聚合中,通常只关心每个网格的总和,而不需要所有的前缀和中间结果。这意味着许多通过树形归约生成的部分和实际上是不必要的,它们占用了计算资源且未被最终使用。

因此,作者为了提高特征聚合的效率,开发了一个专门的GPU内核,这个内核直接在每个BEV网格上并行执行计算。GPU内核为每个网格分配一个线程,直接计算该网格内所有点的特征和,而不是使用前缀和。这种方法消除了输出之间的依赖性(每个网格的计算是独立的),并避免了将部分和写入DRAM(动态随机存取内存),这大大减少了内存访问和提高了数据处理速度。

通过这种优化,特征聚合的延迟从原来的500毫秒降低到了2毫秒,效率得到了显著提升。

作者在这里写了一个Takeaways,说明其他研究也识别出了在仅使用相机进行3D检测时存在的效率瓶颈。而这些方法采用了一些近似手段来简化计算:

  • 假设均匀深度分布:假设场景中的深度分布是均匀的,以此简化深度的计算。

  • 在每个BEV网格内截断点:在每个BEV网格内部简化计算,只处理部分点,而非全部点。

与上述方法相比,本文描述的技术能够在不进行任何近似的情况下,精确地执行转换,同时还能提供更快的处理速度。这意味着该技术在保持高精度的同时,也优化了执行效率。

3.3 Fully-Convolutional Fusion

一旦所有传感器数据都转换到BEV格式,就可以通过简单的逐元素操作(如拼接)来融合这些特征。这种方法基于假设不同传感器的数据已经在相同的空间尺度上对齐。

尽管数据都转换到了BEV空间,由于视图转换器中深度估计的不准确性,LiDAR和相机的BEV特征之间仍然可能存在一定程度的空间错位。这种深度不准确可能来自于转换过程中的近似处理或者传感器自身的精度限制。

为了补偿这些局部的空间错位,采用了基于卷积的BEV编码器。这种编码器包含了几个残差块,能够有效地处理空间上的微小偏差,调整和细化特征的对齐。

作者指出,未来的工作可能会通过使用真实的深度数据来监督BEV视图转换器,从而获得更准确的深度估计。

3.4 Multi-Task Heads

本论文中的方法适用于大多数3D感知任务,比如检测和分割。

对于检测,使用类别特定的中心热图head,负责预测图像中所有物体的中心位置。通过生成每个类别的热图,网络可以学习到不同类别物体中心的空间分布。热图中的每个点的值表示该位置是物体中心的置信度,值越高,置信度越大。多个回归头部被用来估计物体的尺寸、旋转和速度等属性。这些回归任务是根据物体的中心位置来进行的,即首先确定物体的中心,然后对这些中心点附近的属性进行回归预测。

对于分割,不同的地图类别(如道路、人行横道、停车区等)可能会在空间上有所重叠。例如,人行横道通常是可行驶区域的一部分,因此在地图标注中两者会有交集。为了有效处理这种重叠,将问题定义为多个二元语义分割任务,即为每个类别单独进行语义分割。这种方法允许网络同时为每个像素点预测多个可能的类别标签,而不是将其限制在单一的类别。

四、实验结果

nuScenes在test和val的结果

nuScenes (val)分割结果

3D 目标检测和 BEV 地图分割上的定性结果。它可以准确识别远处和小物体(上图),并识别拥挤的夜间场景(下图)。

在不同的照明和天气条件下都具有鲁棒性,在具有挑战性的雨天和夜间场景下显着提高了单模态基线(标记为灰色)的性能

在不同的物体尺寸、物体距离和LiDAR稀疏度中,BEVFusion 的性能始终优于最先进的单模态和多模态探测器,尤其是在更具挑战性的设置(即稀疏的点云、小/远的物体)

消融实验。默认设置标记为灰色

联合检测和分割训练,可以看出,将不同的任务联合训练在一起会对每个单独任务的性能产生负面影响,这被广泛称为“负迁移”,这是后续需要改进的地方

五、总结

结论:

BEVFusion在共享的BEV空间下统一camera feature和Lidar点云feature, 为了实现camera-to-BEV转换的高效,文中提出实现并行计算的GPU kernel,将速度提升40倍。BEVFusion打破了以往将point-level fusion作为最佳解决方案的经验,并在3D检测和BEV segmentation均实现新SOTA(小目标、雨天和夜间的效果也非常好)。

思考:

(1)加入深度图参与监督训练:在训练中加入额外的深度信息监督,也就是增加一个额外的深度估计任务,但是只用于辅助训练主干网络,并不参与推理的过程(比如显式方法——激光雷达的点云被投影到图像上、隐式方法——深度信息的监督形式化为一个知识蒸馏模型);

(2)引入时序信息融合:进行物体运动建模,将T-1和T时刻的BEV特征进行空间对齐,提高鲁棒性;

(3)多任务融合:不同分支支持目标检测,语义分割、路径规划和车道线检测。

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BevFusion是一种基于深度学习的三维点云重建方法,其主要思想是将点云转换为体素表示,然后使用神经网络进行体素的重建。以下是BevFusion的简单复现步骤: 1. 数据准备:使用3D扫描仪或其他方式获取物体的点云数据,并将其转换为体素表示。在这个过程中,需要选择合适的体素大小和分辨率,以保证重建的准确性和效率。 2. 构建神经网络:使用TensorFlow或PyTorch等深度学习框架,搭建BevFusion的神经网络模型。该模型包括编码器、解码器和重建器三个部分,其中编码器负责将体素表示转换为低维特征向量,解码器负责将特征向量转换回体素表示,而重建器则负责整合编码器和解码器,实现点云重建。 3. 训练模型:使用已准备好的数据集对神经网络模型进行训练。训练过程中需要选择合适的损失函数和优化器,以及设置合理的训练参数(如学习率、批次大小、迭代次数等)。 4. 进行点云重建:使用训练好的神经网络模型对新的点云数据进行重建。在此过程中,需要将点云数据转换为体素表示,并输入到神经网络中进行重建。最终,可以得到重建后的点云数据,并进行后续的处理和分析。 需要注意的是,BevFusion的复现过程较为复杂,需要具备一定的深度学习和计算机视觉基础,同时还需要大量的计算资源和时间。因此,建议在有相关经验或团队支持的情况下进行复现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值