不用激光雷达,照样又快又准!3D目标检测之SMOKE

向大家介绍一篇CVPR 2020 Workshop的文章:SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation。

0. 动机

3D目标检测用于估计目标的类别、位置和姿态,与2D目标检测相比,3D目标检测更具有挑战性。有很多工作研究使用激光雷达进行3D目标检测,激光雷达成本较高、寿命较短,与之相比,相机成本低、寿命长,且易于安装。

很多基于单目相机做3D目标检测的算法都是多阶段(multi-stage)的,即基于2D目标检测网络得到的2D框,在后面添加额外的分支预测3D框,亦或者是产生点云作为点云检测网络的输入,这种方法的弊端是:2D框检测的少许偏差可能会引起3D框检测的较大偏差。

作者提出了一个直接预测3D目标框的单阶段端到端算法,包含1个分类分支和1个回归分支,计算量小,易于训练且精度高。

1.建模

使用单目相机做3D目标检测,可以提炼为:输入RGB图像

分别表示输入图像的宽度和高度,输出图像中目标的类别

和3D框

使用

表示3D框

,其中

表示目标的高、宽、长;

表示目标在相机坐标系中的坐标,单位为米;角度

表示3D框的航向角。

需要特别指出的是,要准确地预测3D框,需要知道相机内参

2. 网络结构

网络的总体结构如下图所示:

2.1 Backbone

使用与论文《Objects as points》类似的DLA-34作为Backbone,输出特征图的长和宽分别为输入图像的1/4。

与之不同的是,作者将网络中的BN(BatchNorm)替换为GN(GroupNorm),实验表明使用GN能减小网络性能对batch size的敏感程度,还能减少训练时间。

2.2 关键点检测分支

将目标3D框的中心点在图像平面的映射点

定义为关键点,关键点检测分支的目标就是寻找输入图像中的关键点。

在训练时,需要根据3D框确定关键点的位置,若知道相机内参

和目标3D框的中心点

根据如下公式求得关键点:

参考论文《Objects as points》中的做法,使用高斯函数作为关键点检测分支的学习目标。使用

表示3D框的8个顶点在图像中的位置,则

表示在图像中包围3D框的最小长方形,通过

确定高斯函数的标准差。

2.3 回归分支

使用向量

编码目标的3D框,它们的含义是:

  • 表示深度偏移;

  • 对下采样产生的量化误差进行补偿;

  • 分别表示高、宽、长的残差(residual dimensions);

  • 用于确定角度

相比于直接学习3D目标框各个属性的值,学习偏移量更容易训练。

因为要使用8个标量组成的向量

确定3D框,那么回归分支输出的feature map尺寸为

用于控制feature map的尺寸。

下面讲述网络输出的向量

与3D框属性的关系。

根据深度偏移量可以求得目标的深度值,公式如下:

上式中的

是预定义的值,

单位为米。

已知目标的深度

,根据回归分支输出的

以及关键点检测分支输出的

可以得到目标在相机坐标系下的三维坐标:

根据回归分支输出的

以及预定义的

使用如下公式求目标的长、宽、高,单位为米。

网络输出的

所确定的角度

的含义为下图中的

所表示的角度:

根据KITTI数据集中航向角的定义,可以根据角度

和目标在三维空间中的位置求得航向角

已知航向角

、长宽高三个维度的值

以及3D框中心点在相机坐标系下的坐标

可以得到相机坐标系下3D框的8个顶点坐标,公式如下:

上式中的

表示根据航向角

得到的旋转矩阵,

是如下矩阵的简写形式:

3. 损失函数

3.1 关键点分类损失

关键点检测分支的输出为

通道的feature map,

为类别总数,为了描述简单,以下只叙述针对其中一个通道(即1个类别)的损失函数。

使用focal loss构造关键点分类损失函数,令

表示网络前向计算时关键点检测分支的输出feature map在位置

处的值,

表示根据数据集中的标注、利用高斯函数得到的目标值。

首先分别定义

定义分类损失函数如下:

上式中

是超参数,

,N表示关键点个数。

下面分别描述损失函数中

项和

项的作用:

时,由于

,因此 

,若此时

接近于1,则

项令损失函数急剧衰减;若此时

接近与0,则

令损失函数轻微衰减。使得优化器更关注

接近0的样本。

时,由于

,因此

,若此时

接近于1,则

项令损失函数轻微衰减;若此时

接近与0,则

令损失函数急剧衰减。使得优化器更关注

接近于1的样本。

时,由于

,因此

,该项不起作用。

时,由于

,因此

,此时若

接近于1,即

接近高斯函数中“峰值”的位置,代表

在关键点附近,则

令损失函数急剧衰减,使得优化器不太关注

位置处的损失值,因为

在关键点附近,理应让

大一些。

3.2 回归损失

回归损失用于让网络输出更接近真值的

3D框高、宽、长的残差由回归分支输出的值进行非线性变换得到,变换表达式如下:

上式中

表示回归分支输出的值,

表示sigmoid函数。

角度值也要由回归分支输出的值进行非线性变换得到,变换表达式如下:

上式中的

表示回归分支输出的值。

向量

中的其他值直接使用回归分支的输出值。若得到向量

,根据2.3中的描述,容易得到相机坐标系下3D框的8个顶点坐标,记作

,使用该值和训练集中标注框的8个顶点坐标

构造损失函数,表示如下:

上式中的

为平衡关键点分类损失和回归损失的权重。

受到论文《Disentangling monocular 3d object detection》的启发,作者将回归分支的输出结果分为三组:

  • ,根据

    以及预定义的

    可以求出深度值

    ,根据深度值

    以及从标注数据中得到的3D框中心点在图像平面上的投影

    ,可以得到目标3D框中心点在相机坐标系下的坐标

  • ,根据

    可以得到

    ,从标注数据中得到目标3D框中心点在相机坐标系下的坐标

    ,可以得到航向角

  • ,根据这三个值以及预定义的

    可以得到目标3D框的长、宽、高。

只使用上面任何一组参数求取3D框的8个顶点坐标是不可能的,因为参数量不够,利用标注数据中的参数进行补全,使得上述三组参数能分别求出同一目标的3个3D框的8个顶点坐标,分别记作

,利用

分别构造3个回归损失函数,将它们的和作为新的回归损失函数。这样做的好处是,能够将向量

中的多组参数对损失函数的贡献解耦开,使得优化器能分别优化上述3组参数。

整个网络的损失函数如下:

4. 实验

4.1 实验配置

使用KITTI数据集训练网络,实验时将3D框中心点在图像平面映射时超出图像区域的目标清除掉。在训练关键点检测分支时使用了数据增强,比如random horizontal flip、random scale and shift。GroupNorm操作中的group number设置为32,对于通道数小于32的层,group number设置为16。

网络的输入图片分辨率为1280x384,在4台TITAN X GPU上训练,batch size为32。

推理时,在关键点检测分支输出的feature map中选取100个得分最高且大于0.25的点作为关键点。


4.2 性能

训练完成后,使用KITTI的测试集评估性能,计算IoU大于0.7的

值,结果如下:

相比于其他方法,SMOKE算法取得了很好的结果,且推理时间只有30ms,完全满足实时性要求。

将SMOKE生成的3D框用于位置估计,并与其他方法比较,结果如下:

相比其他两种方法,SMOKE在位置估计上有明显优势。

此外,SMOKE也可以用于2D目标检测,将能包围3D框的最小2D框定义为2D目标检测的结果,结果如下:

5. 总结

本文有如下亮点:

  • 直接通过单阶段网络预测3D框的属性,而不是先检测2D框,再利用2D框的信息生成3D框;

  • 在构造回归分支的损失函数时,将多个属性对损失函数的贡献解耦,加速模型收敛;

  • 模型结构简单,推理时间为30ms,具有实时性。

论文:https://arxiv.org/abs/2002.10111

源码:https://github.com/lzccccc/SMOKE

END

备注:目标检测

目标检测交流群

2D、3D目标检测等最新资讯,若已为CV君其他账号好友请直接私信。

我爱计算机视觉

微信号:aicvml

QQ群:805388940

微博知乎:@我爱计算机视觉

投稿:amos@52cv.net

网站:www.52cv.net

在看,让更多人看到  

版权声明:本文为CSDN博主「我爱计算机视觉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/moxibingdao/article/details/113777935

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

Cross Stage Partial Network(CSPNet)

Cross Stage Partial Network(CSPNet) 一. 论文简介 降低计算量,同时保持或提升精度 主要做的贡献如下(可能之前有人已提出): 提出一种思想,特征融合方式(降低计算量的