1. 前言
自动驾驶感知系统中有两个很重要的任务:3D
目标检测和BEV
分割。传统的3D
目标检测主要依赖于激光雷达输出的点云,但是使用激光雷达的成本比较高,另一个选择是使用多个相机的图像作为输入去实现车身周围360°
的目标检测任务。BEV
分割的目标是在BEV
框架中对周围环境进行语义分割,比如可行驶区域和车道边界的分割。
在一个统一的框架中去感知周围物体和环境的能力是自动驾驶车辆的核心要求,但是现有的基于相机的方法并不适合做360°
多任务感知,M^2^BEV提出一种高效地将多个视角的2D
图像特征转换为基于自车坐标系的3D特征表示的方法,是第一个用统一的框架去实现3D
目标检测和BEV
分割的多任务模型。
2. 实现细节
2.1 总体结构
M^2^BEV的总体结构如下图所示,模型的输入为N
张多视角的图像和相机的内外参,输出为3D
目标检测框和地图分割结果。N
张多视角的图像首先被送到图像编码器中用于提取图像特征,这些2D
图像特征会被映射到3D
空间中用于构建3D
体素特征,然后3D
体素特征被送入一个高效的BEV
编码器中用于提取BEV
特征,最后在BEV
特征的基础上加上特定任务头实现3D
检测和BEV
分割任务。
每个子模块的具体实现细节如下:
2D图像编码器
对于输入的N
张维度为的图像,首先用一个CNN
主干网络(ResNet
等)和一个特征金字塔网络(FPN
)为每张输入图像提取出4
种尺度的特征,它们的尺寸可表示为,这4
种尺度的特征会被统一上采样到大小,然后把它们Concat
到一起并用一个的卷积层进行融合,得到最终的图像特征张量。
2D→3D映射模块
由N
张多视角图像的特征组成的张量需要通过一个2D
到3D
的映射模块映射到3D
空间去构建体素特征,这个体素特征包含了所有视图的图像特征,因此它是一个统一的特征表示。
如何把2D
的图像特征映射到3D
空间,这是一个关键问题。假设用表示一个相机的图像,相机的外参和内参分别为和,3D
空间中的体素特征张量表示为,那么体素坐标可以使用下面的公式映射到2D
图像坐标:
其中是像素的深度值。如果是未知的,那么中的每个像素都映射到3D
空间中相机光线中的一组点。
LSS
提出的方法是显式地预测一组非均匀的离散深度分布,然后把2D
图像特征的维度从提升为,其中 是深度分布的大小。这个步骤非常耗时并且需要消耗大量的内存,因此限制了LSS
使用大的主干网络或者以高分辨率的图像作为输入,官方开源的模型使用了一个小的主干网络EfficientNet-B0
,输入图像的大小仅仅是128x384
。
如果对LSS
还不了解的可以看我之前写的这篇文章:BEV感知算法 | LSS论文与代码详解
与LSS
不同的是,M^2^BEV假设沿相机光线的深度分布是均匀的,这意味着沿相机光线的所有体素都填充了与2D
空间中单个像素相对应的相同特征,这种深度均匀分布的假设通过减少学习参数的数量来提高计算和内存效率。M^2^BEV的2D
到3D
映射方法消耗的GPU
内存与LSS
相比减少了3
倍。因此,M^2^BEV可以使用更大的主干网络(如ResNet101
)和更高分辨率(如1600x900
)的图像作为输入。
3D BEV编码器
对于一个4D
的体素特征,BEV
编码器首先通过一个"Spatial to Channel(S2C)"
操作把的维度从变换为,然后用一系列的2D
卷积提取BEV
特征并减少通道数量。通过把体素特征张量从4D
变换为3D
,然后用2D
卷积提取特征,可以避免在模型中使用笨重而低效的3D
卷积。
3D检测头
有了统一的BEV
特征,那么就可以使用为激光点云设计的检测头去实现3D
目标检测了。M^2^BEV采用了PointPillars
的检测头实现3D
目标检测任务,该检测头会在BEV
空间中生成稠密的3D
锚框,然后预测每个目标的类别、框的大小和朝向。PointPillars
检测头简单而高效,仅使用3
个并行的卷积去预测物体的类别、3D
框的属性和朝向。
如果对PointPillars
还不了解的可以看我之前写的这篇文章:激光点云3D目标检测算法之PointPillars
与原生PointPillars
不同的是,M^2^BEV提出一种动态检测框分配策略用于把锚框分配给真值。在模型训练过程中,很多像PointPillars
这样的基于激光点云的3D
目标检测算法都是采用固定阈值的IoU
匹配策略把3D
锚框分配给真值。然而,作者认为这种手工设计的分配策略对于纯视觉BEV
感知问题来说是不是最优的,因为视觉BEV
特征没有考虑激光点云中的深度,因此BEV
特征可能会对不太准确的几何信息进行编码。作者把FreeAnchor
的思想从2D
扩展到3D
,在训练过程中,首先为每个锚框预测一个类别和位置,然后基于IoU
给每个真值选择一组锚框。作者使用分类分数和定位精度的加权和来区分真阳性的锚框,其余分类分数低或定位误差较大的锚框则设置为负样本。这种做法的出发点是,作者认为一个理想的真阳性锚框点应该在分类和定位方面都具有很高的置信度。
作者通过实验发现,在大规模的2D
目标检测数据集(比如nuImage
)上预训练的模型可以有效地提升3D
目标检测的精度,具体做法是先在nuImage
数据集上训练以ResNet-50
或ResNeXt-10
为主干网络的Cascade Mask R-CNN
目标检测模型,然后把这个2D
检测模型的主干网络权重作为M^2^BEV的2D
图像编码器的初始权重去训练M^2^BEV模型。
另外,作者还在不同尺度的图像特征上添加了一个2D
辅助检测头,并将自车坐标系下的3D
检测框投影到图像上作为2D
检测框的真值去计算损失,2D
检测头的设计与FCOS
中的一样。值得注意的是,这个2D
的辅助检测头仅在训练阶段使用,在推理阶段将被移除,因此它不会在推理阶段引入额外的计算成本。
通过使用2D
检测作为预训练和辅助监督,图像特征可以更清楚地感知目标物体,从而提高3D
目标检测的精度。
BEV分割头
BEV
分割头由4
个的卷积层和1
个的卷积层组成,预测结果的维度为,其中表示类别数量。与LSS
相同,文中设置,预测结果表示可行驶区域和车道线边界这两个类别的分割结果。
作者还提出了一种BEV centerness
策略,用于重新加权具有不同物理距离的每个像素的损失,其动机是BEV
空间中距离自车较远的区域对应于图像中较少的像素。因此,一个直观的想法是让网络更加关注更远的区域。BEV centerness
的定义如下:
其中表示BEV
空间中的一个点,范围为[-50,50]
米;表示自车位置的中心点。BEV centerness
的取值范围为[1,2]
,将作为损失函数的权重使用。通过这种方式,远离自车中心的样本预测错误将会受到更多惩罚,使得BEV
分割的效果更好。
2.2 损失函数
M^2^BEV总的损失函数包括了3D
目标检测损失,BEV
分割损失和2D
辅助检测损失:
与PointPillars
中的损失函数相同:
其中是正样本的数量,。作者发现对于视觉3D
目标检测任务,设置较大的值效果会更好。分类损失采用Focal Loss
;朝向损失为二元交叉熵损失;3D
检测框定义为,作者为每个属性都采用Smooth L1
损失,损失权重为[1,1,1,1,1,1,1,0.2,0.2]
。
对于BEV
分割损失,作者采用Dice
损失与二元交叉熵损失相结合的损失函数:
其中
2D
辅助检测损失与FCOS
中定义的相同:
3. 参考资料
- 《M2BEV: Multi-Camera Joint 3D Detection and Segmentation with Unified Bird’s-Eye View Representation》