Paper name
BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird’s-Eye View Representation
Paper Reading Note
URL: https://bevfusion.mit.edu/assets/paper.pdf
TL;DR
- BEV 下雷达与图像多模态的结合方案,并对 bevpooling 进行加速,发表时取得了 nuscenes SOTA 效果
Introduction
背景
-
自动驾驶系统中多传感器融合有助于提升准确性与可靠性
-
不同传感器的优缺点
- 相机:丰富的语义信息
- LiDAR:准确的空间信息
- Radar:瞬时速度估计
-
传统融合方案:
- LiDAR-to-camera 投影:缺点是引入 geometric distortion,对于面向几何的任务不友好,比如 3d 物体识别
- camera-to-LiDAR:优点是精度相对较高,不过有 semantic-lossy 问题,导致在 semantic-oriented 任务上效果不佳,比如 bev 分割任务;对于 32 线LiDAR,只有 5% 的相机特征能被加在 LiDAR 点上
- LiDAR-to-camera 投影:缺点是引入 geometric distortion,对于面向几何的任务不友好,比如 3d 物体识别
-
当前的融合方法主要是在 point-level 进行融合:利用图片特征增强 LiDAR point
- 缺点:camera-to-LiDAR 的变换降低了图像特征的 semantic density,导致性能降低,尤其在 semantic-oriented 任务更明显(比如 3d 场景分割)
本文方案
-
选择 bev 作为特征融合的视角
- 所有传感器的特征可以无损失地转换到 bev 上
- 适用于不同的任务
-
提出了一种 BEV 下的多传感器、多任务融合方法,同时保留几何与语义信息
- 优化的 bevpooling,降低 latency 40x
Dataset/Algorithm/Model/Experiment Detail
实现方式
- 整体流程
- camera encoder 提取多视角的图像特征,然后经过 camera-to-bev 的视角变换转换到 bev 下
- 转换方式和 LSS 一致,首先显式预测每个像素的深度分布,然后将图像特征分散到 camera ray 上的 D 个离散点,并且通过对应的深度概率对特征进行 rescale (生成特征维度 NHWD),最后基于 BEV pooling 转换到 bev 下
- 优化了 bev pooling 的速度
- LiDAR encoder 提取雷达特征,然后经过在 z 轴上的 flatten 转换到 bev 下
- concat bev 下的图图像特征与雷达特征
- 使用 bev encoder 融合图像特征和雷达特征,缓解两个特征的局部不对齐问题
- camera encoder 提取多视角的图像特征,然后经过 camera-to-bev 的视角变换转换到 bev 下
bev pooling 优化
- precomputation: 提前计算出图像特征中的每个点对应的 3d 坐标与在 bev grid 上的 index,并提前根据网络索引对所有点进行排序记录每个点的排名,在测试阶段就仅需要更根据预先计算的排名来取特征。这个 caching 机制能将 grid association 的 latency 由 17 ms 降低到 4 ms
- interval reduction:经过 grid association 后,bev grid 中的所有点需要经过一些对称函数(比如 mean、max、sum)进行聚合,之前的方法是计算前缀和然后减去 indices 变化的边界值,其中前缀和需要 gpu 上的 tree reduction,并且会产生 unused partial sums(因为只需要边界上的值)需要额外的 DRAM 操作;这里采用并行方式进行加速,为每个 grid 分配一个 gpu 显存,计算区间和,将特征聚合的时间由 500ms 降低到 2ms
全卷积融合
- 图像特征与 LiDAR 特征 concat 后经过 bev encoder 进行融合,来补偿两个特征之间的不对齐问题(因为深度预测不准导致)
多任务训练
- 3d 检测:center heatmap head
- bev map 分割:使用 CVT 的head,因为不同类别的 map 可能有重合部分(比如人行横道也是可行驶区域中的一部分),因此这里将 map 分割分解为多个 binary 语义分割问题,每个类都分别预测一个二值掩码
实验结果
- LiDAR 点云的 voxelize 最小单位分别是 0.075m(检测) 和 0.1m(分割)
- 因为检测和分割任务需要的 bev 特征图的 spatial range 和 size 不一样,在每个任务特定头之前应用网格采样和双线性插值,以在不同的BEV特征映射之间显式变换
nuscenes 数据集 3d 检测
nuscenes 数据集 map 分割
- 之前的方法都认为 LiDAR 模态对于 map 分割更有效,但是在这里的结论是 camera 更有效
不同目标距离、尺寸、不同 LiDAR beam 下的对比实验
消融实验
- sensor fusion 相比于单模态稳定涨点
- BEVFusion的检测变种模型对于体素和图像分辨率都具有良好的适应性
- FPN 使用 1/8 下采样特征就足够了,再增加计算量也不涨点
- SwinT 精度高于res50,且不 freeze 精度更高
多任务
- 训练方式:loss rescale 到相同 magnitude 上,每个任务用单独的 bev encoder,为了学习更 task-specific 的特征
结果上来看多任务会掉点,bev encoder 分开后掉点幅度能降低
Thoughts
- 多任务部分作者提到后续会更新一种不掉点的更复杂的训练策略,比较好奇具体操作是什么;并且多任务的实验不是完全训练的实验,实际掉点幅度可能和文章中不一致
- 文章创新点感觉挺一般,主要就是 bev pooling 算子的优化,不过文章写得很不错,代码开源做得也好