BEV感知算法 | M2BEV论文解读

容器NoSQLMySQL

本文首发于公众号【DeepDriving】,欢迎关注。

  1. 前言

自动驾驶感知系统中有两个很重要的任务: 3D目标检测和 BEV分割。传统的 3D目标检测主要依赖于激光雷达输出的点云,但是使用激光雷达的成本比较高,另一个选择是使用多个相机的图像作为输入去实现车身周围 360°的目标检测任务。 BEV分割的目标是在 BEV框架中对周围环境进行语义分割,比如可行驶区域和车道边界的分割。

在一个统一的框架中去感知周围物体和环境的能力是自动驾驶车辆的核心要求,但是现有的基于相机的方法并不适合做 360°多任务感知,M2BEV提出一种高效地将多个视角的 2D图像特征转换为基于自车坐标系的3D特征表示的方法,是第一个用统一的框架去实现 3D目标检测和 BEV分割的多任务模型

picture.image

  1. 实现细节

2.1 总体结构

M2BEV的总体结构如下图所示,模型的输入为 N张多视角的图像和相机的内外参,输出为 3D目标检测框和地图分割结果。 N张多视角的图像首先被送到图像编码器中用于提取图像特征,这些 2D图像特征会被映射到 3D空间中用于构建 3D体素特征,然后 3D体素特征被送入一个高效的 BEV编码器中用于提取 BEV特征,最后在 BEV特征的基础上加上特定任务头实现 3D检测和 BEV分割任务。

picture.image

每个子模块的具体实现细节如下:

2D图像编码器

对于输入的 N张维度为的图像,首先用一个 CNN主干网络( ResNet等)和一个特征金字塔网络( FPN)为每张输入图像提取出 4种尺度的特征,它们的尺寸可表示为,这 4种尺度的特征会被统一上采样到大小,然后把它们 Concat到一起并用一个的卷积层进行融合,得到最终的图像特征张量。

2D→3D映射模块

N张多视角图像的特征组成的张量需要通过一个 2D3D的映射模块映射到 3D空间去构建体素特征,这个体素特征包含了所有视图的图像特征,因此它是一个统一的特征表示。

如何把 2D的图像特征映射到 3D空间,这是一个关键问题 。假设用表示一个相机的图像,相机的外参和内参分别为和, 3D空间中的体素特征张量表示为,那么体素坐标可以使用下面的公式映射到 2D图像坐标:

其中是像素的深度值。如果是未知的,那么中的每个像素都映射到 3D空间中相机光线中的一组点。

LSS提出的方法是显式地预测一组非均匀 的离散深度分布,然后把 2D图像特征的维度从提升为,其中 是深度分布的大小。这个步骤非常耗时并且需要消耗大量的内存,因此限制了 LSS使用大的主干网络或者以高分辨率的图像作为输入,官方开源的模型使用了一个小的主干网络 EfficientNet-B0,输入图像的大小仅仅是 128x384

如果对 LSS还不了解的可以看我之前写的这篇文章BEV感知算法 | LSS论文与代码详解

LSS不同的是, M2BEV假设沿相机光线的深度分布是均匀 的,这意味着沿相机光线的所有体素都填充了与 2D空间中单个像素相对应的相同特征,这种深度均匀分布的假设通过减少学习参数的数量来提高计算和内存效率。 M2BEV2D3D映射方法消耗的 GPU内存与 LSS相比减少了 3倍。因此, M2BEV可以使用更大的主干网络(如 ResNet101)和更高分辨率(如 1600x900)的图像作为输入。

picture.image

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-50ResNeXt-10为主干网络的 Cascade Mask R-CNN目标检测模型,然后把这个 2D检测模型的主干网络权重作为M2BEV的 2D图像编码器的初始权重去训练M2BEV模型。

另外,作者还在不同尺度的图像特征上添加了一个 2D辅助检测头,并将自车坐标系下的 3D检测框投影到图像上作为 2D检测框的真值去计算损失, 2D检测头的设计与 FCOS中的一样。值得注意的是,这个 2D的辅助检测头仅在训练阶段使用,在推理阶段将被移除,因此它不会在推理阶段引入额外的计算成本。

picture.image

通过使用 2D检测作为预训练和辅助监督,图像特征可以更清楚地感知目标物体,从而提高 3D目标检测的精度。

BEV分割头

BEV分割头由 4个的卷积层和 1个的卷积层组成,预测结果的维度为,其中表示类别数量。与 LSS相同,文中设置,预测结果表示可行驶区域和车道线边界这两个类别的分割结果。

作者还提出了一种 BEV centerness策略,用于重新加权具有不同物理距离的每个像素的损失,其动机是 BEV空间中距离自车较远的区域对应于图像中较少的像素。因此,一个直观的想法是让网络更加关注更远的区域。 BEV centerness的定义如下:

picture.image

其中表示 BEV空间中的一个点,范围为 [-50,50]米;表示自车位置的中心点。 BEV centerness的取值范围为 [1,2],将作为损失函数的权重使用。通过这种方式,远离自车中心的样本预测错误将会受到更多惩罚,使得 BEV分割的效果更好。

picture.image

2.2 损失函数

M2BEV总的损失函数包括了 3D目标检测损失, BEV分割损失和 2D辅助检测损失:

picture.image

PointPillars中的损失函数相同:

picture.image

其中是正样本的数量,。作者发现对于视觉 3D目标检测任务,设置较大的值效果会更好。分类损失采用 Focal Loss;朝向损失为二元交叉熵损失; 3D检测框定义为,作者为每个属性都采用 Smooth L1损失,损失权重为 [1,1,1,1,1,1,1,0.2,0.2]

对于 BEV分割损失,作者采用 Dice损失与二元交叉熵损失相结合的损失函数:

picture.image

其中

2D辅助检测损失与 FCOS中定义的相同:

picture.image

  1. 参考资料

  • 《M2BEV: Multi-Camera Joint 3D Detection and Segmentation with Unified Bird’s-Eye View Representation》

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论