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》