基于统一BEV表征的多任务多传感器融合

作者:Young  | 来源: 半杯茶的小酒杯

为了实现多传感器数据的统一表达(Unified Representation),以前常规的方法:

1)Lidar-To-Camera: 将激光雷达点云投影到图像上,使用2D CNN算法来完成数据处理。它会造成严重的几何扭曲(如下图a),影响3D Object Recognition等Geometric-Oriented任务的效果。

2)Camera-To-Lidar: 用Semantic Labels、CNN特征等信息增强点云,然后使用LiDAR-based Detector来预测3D Bounding Boxes。这种Point-Level Fusion的方法丢失了语义信息,在Semantic-Oriented任务中表现不佳(如下图b)。

48cd9898cf9d1f348900d11eb3deac45.png

BEV Fusion Method

BEVFusion在BEV空间实现了统一的多模态特征表达,同时保留几何结构和语义信息。

b5b061eb3519a042f7076b58a5e54da7.png

BEVFusion对不同模态的输入采取不同的编码器(Encodes)来提取Features,这种方法既保留了几何信息,又保留了语义特征信息;然后使用Fully-Convolutional BEV Encoder融合多模态的Features,缓解不用特征之间的局部偏准(Local Misalignment);最后添加一些特定Head来支持不同的3D场景理解。

BEVFusion优化后的BEV Pooling实现了40x的速度提升;它比Camera-Only的模型实现了6%的mIOU提升,比Lidar-Only的模型实现了13.6%的mIOU的提升。

Camera-to-BEV Transformation

Camera-to-BEV的变换首先要解决每个像素的Depth问题,文中采用了与论文LSS(Lift, Splat, Shoot)的方法来预测每个像素的离散深度分布。

cf0830a99e46019c9269952cd6c22d22.png

如下图所示,对每个Feature Pixel沿射线假设D个离散点(每个像素对应D个空间位置),每个离散点的可能性对应一个归一化的概率。

所有的Camera特征组合在一起,形成NHWD的Camera Feature点云,N是Camera的个数,HW是每个Camera Feature Map的大小。

沿着x,y两个方向,按照rxr的BEV网格,使用BEV Pooling对Camera Feature点云进行聚合量化。

最后,沿z轴Flatten这些特征。

这个过程中的BEV Pooling耗时严重,作者提出了Precomputation和Interval Reduction解决这个问题。

Precomputation

7b7fd6ffc15cd85d41688c5b85631c25.png

相机的外参是固定的,内参也是固定的,相机的射线上采样的D个离散点的采样间隔也是已知的,因此Camera Feature点云的每个点的x和y坐标是固定的,每个点在哪个BEV Grid中也是不变的。因此可以通过预计算的方式提前计算好,之后直接用即可。

Interval Reduction

6dccbaa6e3d7af397fce4022bfd05e79.png

LSS使用Prefix Sum计算每个BEV Grid的聚合结果。

如上图所示,index是网格的编号,BEV Pooling的目标是将相同index的Value加起来,即将同一个网格内的特征聚合在一起。

Pref.sum是一个累加和。1=1,4=1+3,11=1+3+7,10=1+3+7+(-1),…

Pref.sum只是一个中间结果,用来辅助计算最终的聚合值。在Index变化时,减去前一个index的Pref.sum值,得到聚合结果result。

LSS的Prefix Sum可以看做是单线程的计算过程,本文直接使用Specialized GPU Kernel对多个BEV Grid独立并发计算,没有计算和存储前缀和的开销,大大加速了计算过程。

优化后的BEV Pooling将Camera-To-BEV Transformation提升了40倍,Latency从500+ms降低到12ms。

Fully-Convolutional Fusion

Lidar和Camera的BEV Features可以简单的用Elementwise Operator(比如Concatenation)来做Fusion。

由于Depth估计的误差,Lidar BEV Features和Camera BEV Features可能会存在Spatially Misaligned的问题,因此需要Convolution-based BEV Encoder来解决这类问题。

class ConvFuser(nn.Sequential):
    def __init__(self, in_channels: int, out_channels: int) -> None:
        self.in_channels = in_channels
        self.out_channels = out_channels
        super().__init__(
            nn.Conv2d(sum(in_channels), out_channels, 3, padding=1, bias=False),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(True),
        )

    def forward(self, inputs: List[torch.Tensor]) -> torch.Tensor:
        return super().forward(torch.cat(inputs, dim=1))

效果测试

602c6553905def48e8b5de49fb152d09.png

C是camera模态,L是LiDAR模态,MACs用于评估计算量,Latency是延时,BEVFusion结合了Camera模态和LiDAR模态,达到了SOTA,并且计算量和Latency也比较低。

4587e85e1e580fa3dd899c75d8913a90.png

在nuScenes的BEV Map Segmentation中,BEVFusion达到了SOTA,并且对不同的地图元素的Segmentation Performance都有提升。

60366a5206d4b855daebab87f08166c2.png

在晴天、雨天、白天、夜晚场景下,BEVFusion都有不错的表现。

88b6edd94a1ec5e6b746c71dd54b61d3.png

BEVFusion对于大物体、小物体、远处的物体、近处的物体的Performance都有提升;并且它在稀疏的Lidar波束上仍有不错的表现。

论文和代码:

Paper: https://arxiv.org/pdf/2205.13542.pdf

Code: https://github.com/mit-han-lab/bevfusion

参考材料

  1. https://blog.csdn.net/zyw2002/articl e/d

    etails/128021162

  2. https://zhuanlan.zhihu.com/p/61007 7583

  3. https://zhuanlan.zhihu.com/p/53797 2934

—END—

高效学习3D视觉三部曲

第一步 加入行业交流群,保持技术的先进性

目前工坊已经建立了3D视觉方向多个社群,包括SLAM、工业3D视觉、自动驾驶方向,细分群包括:[工业方向]三维点云、结构光、机械臂、缺陷检测、三维测量、TOF、相机标定、综合群;[SLAM方向]多传感器融合、ORB-SLAM、激光SLAM、机器人导航、RTK|GPS|UWB等传感器交流群、SLAM综合讨论群;[自动驾驶方向]深度估计、Transformer、毫米波|激光雷达|视觉摄像头传感器讨论群、多传感器标定、自动驾驶综合群等。[三维重建方向]NeRF、colmap、OpenMVS等。除了这些,还有求职、硬件选型、视觉产品落地等交流群。大家可以添加小助理微信: dddvisiona,备注:加群+方向+学校|公司, 小助理会拉你入群。

a00d53ed560c130c4e1054714eae1418.jpeg
添加小助理微信:cv3d007, 拉你入群
第二步 加入知识星球,问题及时得到解答

针对3D视觉领域的视频课程(三维重建、三维点云、结构光、手眼标定、相机标定、激光/视觉SLAM、自动驾驶等)、源码分享、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答等进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业、项目对接为一体的铁杆粉丝聚集区,6000+星球成员为创造更好的AI世界共同进步,知识星球入口:「3D视觉从入门到精通」

学习3D视觉核心技术,扫描查看,3天内无条件退款 4f32ef3aad7aef4097240fd36432867a.jpeg
高质量教程资料、答疑解惑、助你高效解决问题
第三步 系统学习3D视觉,对模块知识体系,深刻理解并运行

如果大家对3D视觉某一个细分方向想系统学习[从理论、代码到实战],推荐3D视觉精品课程学习网址:www.3dcver.com

科研论文写作:

[1]国内首个面向三维视觉的科研方法与学术论文写作教程

基础课程:

[1]面向三维视觉算法的C++重要模块精讲:从零基础入门到进阶

[2]面向三维视觉的Linux嵌入式系统教程[理论+代码+实战]

[3]如何学习相机模型与标定?(代码+实战)

[4]ROS2从入门到精通:理论与实战

[5]彻底理解dToF雷达系统设计[理论+代码+实战]

工业3D视觉方向课程:

[1](第二期)从零搭建一套结构光3D重建系统[理论+源码+实践]

[2]保姆级线结构光(单目&双目)三维重建系统教程

[3]机械臂抓取从入门到实战课程(理论+源码)

[4]三维点云处理:算法与实战汇总

[5]彻底搞懂基于Open3D的点云处理教程!

[6]3D视觉缺陷检测教程:理论与实战!

SLAM方向课程:

[1]深度剖析面向机器人领域的3D激光SLAM技术原理、代码与实战

[1]彻底剖析激光-视觉-IMU-GPS融合SLAM算法:理论推导、代码讲解和实战

[2](第二期)彻底搞懂基于LOAM框架的3D激光SLAM:源码剖析到算法优化

[3]彻底搞懂视觉-惯性SLAM:VINS-Fusion原理精讲与源码剖析

[4]彻底剖析室内、室外激光SLAM关键算法和实战(cartographer+LOAM+LIO-SAM)

[5](第二期)ORB-SLAM3理论讲解与代码精析

视觉三维重建

[1]彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进)

自动驾驶方向课程:

[1] 深度剖析面向自动驾驶领域的车载传感器空间同步(标定)

[2] 国内首个面向自动驾驶目标检测领域的Transformer原理与实战课程

[3]单目深度估计方法:算法梳理与代码实现

[4]面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)

[5]如何将深度学习模型部署到实际工程中?(分类+检测+分割)

最后

1、3D视觉文章投稿作者招募

2、3D视觉课程(自动驾驶、SLAM和工业3D视觉)主讲老师招募

3、顶会论文分享与3D视觉传感器行业直播邀请

猜你喜欢

转载自blog.csdn.net/Yong_Qi2015/article/details/132913587