本文首发于公众号【DeepDriving】,欢迎关注。
- 前言
自动驾驶感知系统中有两个很重要的任务: 3D
目标检测和 BEV
分割。传统的 3D
目标检测主要依赖于激光雷达输出的点云,但是使用激光雷达的成本比较高,另一个选择是使用多个相机的图像作为输入去实现车身周围 360°
的目标检测任务。 BEV
分割的目标是在 BEV
框架中对周围环境进行语义分割,比如可行驶区域和车道边界的分割。
在一个统一的框架中去感知周围物体和环境的能力是自动驾驶车辆的核心要求,但是现有的基于相机的方法并不适合做 360°
多任务感知,M2BEV提出一种高效地将多个视角的 2D
图像特征转换为基于自车坐标系的3D特征表示的方法,是第一个用统一的框架去实现 3D
目标检测和 BEV
分割的多任务模型 。
- 实现细节
2.1 总体结构
M2BEV
的总体结构如下图所示,模型的输入为 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
不同的是, M2BEV
假设沿相机光线的深度分布是均匀 的,这意味着沿相机光线的所有体素都填充了与 2D
空间中单个像素相对应的相同特征,这种深度均匀分布的假设通过减少学习参数的数量来提高计算和内存效率。 M2BEV
的 2D
到 3D
映射方法消耗的 GPU
内存与 LSS
相比减少了 3
倍。因此, M2BEV
可以使用更大的主干网络(如 ResNet101
)和更高分辨率(如 1600x900
)的图像作为输入。
3D BEV编码器
对于一个 4D
的体素特征, BEV
编码器首先通过一个 "Spatial to Channel(S2C)"
操作把的维度从变换为(),然后用一系列的 2D
卷积提取 BEV
特征并减少通道数量。通过把体素特征张量从 4D
变换为 3D
,然后用 2D
卷积提取特征,可以避免在模型中使用笨重而低效的 3D
卷积。
3D检测头
有了统一的 BEV
特征,那么就可以使用为激光点云设计的检测头去实现 3D
目标检测了。 M2BEV
采用了 PointPillars
的检测头实现 3D
目标检测任务,该检测头会在 BEV
空间中生成稠密的 3D
锚框,然后预测每个目标的类别、框的大小和朝向。 PointPillars
检测头简单而高效,仅使用 3
个并行的卷积去预测物体的类别、 3D
框的属性和朝向。
如果对 PointPillars
还不了解的可以看我之前写的这篇文章:激光点云3D目标检测算法之PointPillars
与原生 PointPillars
不同的是, M2BEV
提出一种动态检测框分配策略用于把锚框分配给真值。在模型训练过程中,很多像 PointPillars
这样的基于激光点云的 3D
目标检测算法都是采用固定阈值的 IoU
匹配策略把 3D
锚框分配给真值。然而,作者认为这种手工设计的分配策略对于纯视觉 BEV
感知问题来说是不是最优的,因为视觉 BEV
特征没有考虑激光点云中的深度,因此 BEV
特征可能会对不太准确的几何信息进行编码。作者把 FreeAnchor
的思想从 2D
扩展到 3D
,在训练过程中,首先为每个锚框预测一个类别和位置,然后基于 IoU
给每个真值选择一组锚框。作者使用分类分数和定位精度的加权和来区分真阳性的锚框,其余分类分数低或定位误差较大的锚框则设置为负样本。这种做法的出发点是,作者认为一个理想的真阳性锚框点应该在分类和定位方面都具有很高的置信度。
作者通过实验发现,在大规模的 2D
目标检测数据集(比如 nuImage
)上预训练的模型可以有效地提升 3D
目标检测的精度,具体做法是先在 nuImage
数据集上训练以 ResNet-50
或 ResNeXt-10
为主干网络的 Cascade Mask R-CNN
目标检测模型,然后把这个 2D
检测模型的主干网络权重作为M2BEV的 2D
图像编码器的初始权重去训练M2BEV模型。
另外,作者还在不同尺度的图像特征上添加了一个 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 损失函数
M2BEV
总的损失函数包括了 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
中定义的相同:
- 参考资料
-
《M2BEV: Multi-Camera Joint 3D Detection and Segmentation with Unified Bird’s-Eye View Representation》