SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation

纵目发表的这篇单目3D目标检测论文不同于以往用2D预选框建立3D信息,而是采取直接回归3D信息,这种思路简单又高效,并不需要复杂的前后处理,而且是一种one stage方法,对于实际业务部署也很友好。

来源:杰读源码 微信公众号

论文:SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation

  • 论文:https://arxiv.org/pdf/2002.10111.pdf
  • 代码:https://github.com/open-mmlab/mmdetection3d

Introduction

2D目标检测目前已经在精度和速度上都取得了不错的成绩,而3D目标检测由于需要同时估计出目标的位置与姿态,因此相比2D是一个更具挑战的方向。
目前性能最好的3D目标检测还是需要依赖激光雷达的点云或者点云+图像融合,考虑到成本因素,仅依靠单目摄像头的3D目标检测还是非常值得研究的。
本作有以下几个贡献点:

  • 提出了一个one-stage单目3D检测方法,思路简答,且end-to-end。
  • 3D框8个角点的计算使用了多种方式得到,每种方式都参与了loss的计算,使训练更容易收敛。
  • 在KITTI数据集上达到了SOTA。

Detection Problem

为了方便下面对细节详细展开描述,这里先将3D目标检测概述下:
给定一张RGB图像SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint EstimationSMOKE: Single-Stage Monocular 3D Object Detection via Keypoint EstimationSMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation分别代表图像的宽高,需要识别出图像中每个目标的分类SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation以及SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint EstimationSMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation的信息,SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation将由下面7个变量代表SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint EstimationSMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation代表目标的高度、宽度、长度单位为SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint EstimationSMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation是目标的中心坐标,单位为SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint EstimationSMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation代表目标框的航向角SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint EstimationSMOKE: Single-Stage Monocular 3D Object Detection via Keypoint EstimationSMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation这两个角度在KITTI数据集中为0,此外,还假定相机的内参SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation是已知的。

SMOKE Approach

Backbone

主干网络选择使用DLA-34,其中部分卷积换成了DCN,最后的输出相对于原始图4次下采样的特征图。论文还将BN换成了GN(GroupNorm),因为GN对batch size的大小不那么敏感,且在训练中对噪声更鲁棒。

3D Detection Network

head部分一共两条分支,一条用于检测目标中心点位置同时分类,另一条回归目标的3D信息。

Keypoint Branch

中心点的估计与SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation那片论文的思路相似,不同的是SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation里用的是2D框的中心点,而这里用的是3D框的中心点在图像上的投影点,如下图所示:

Regression Branch

回归分支在每张热图上预测3D信息,3D信息被编码成SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation,其中SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation为深度补偿值,SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint EstimationSMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation为下采样造成的误差所需的坐标补偿值,SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint EstimationSMOKE: Single-Stage Monocular 3D Object Detection via Keypoint EstimationSMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation为尺寸的补偿值,SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint EstimationSMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation为计算航向角所需的值。

深度值SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation由预先定义的缩放系数和补偿值计算得到:

SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation

得到了深度值SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation,加上下采样中的补偿值SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation和特征图上中心点的投影点SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation以及相机内参的逆矩阵SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation,可得目标的3D位置(单位SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation):
SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation

在3D框尺寸的计算前,先分析整个数据集得到得到所有目标的均值SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation,然后使用预测得到的补偿系数SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation即可获取真正的尺寸:
SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation

在航向角SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation的估计中,论文中采取回归角度SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation(如下图),来作为计算航向角SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation:
SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation

最终,可得3D框的8个角点:
SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation
其中SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation代表航向角SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation转变而来的矩阵,SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation代表8个角点表示的3D框。

Loss Function

Keypoint Classification分支的loss跟SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation中一样,用的是focal loss。

Regression分支的loss计算比较有新意,没有采取直接计算SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation中8个参数的loss,而是通过在角度、尺寸、坐标位置三种分支下得到的3D框的8个角点去和真值比较计算loss。

总loss:

SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation
其中SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation代表中心点的分类loss,SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation代表分支,SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation代表预测框的8个角点,SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation代表角点回归loss。

# mmdetection3d/mmdet3d/models/dense_heads/smoke_mono3d_head.py
# 角度分支下计算得到的3D框,所谓角度分支即只有角度用的是预测值,而坐标位置和尺寸两个用的是真值
bbox3d_yaws = self.bbox_coder.encode(gt_locations, gt_dimensions, orientations, img_metas)
# 尺寸分支下计算得到的3D框
bbox3d_dims = self.bbox_coder.encode(gt_locations, dimensions, gt_orientations, img_metas)
# 坐标位置分支下计算得到的3D框
bbox3d_locs = self.bbox_coder.encode(locations, gt_dimensions, gt_orientations, img_metas)
...
...
# 三种分支下分别计算推理出的8个角点的和真值8个角点的loss
loss_bbox_oris = self.loss_bbox(pred_bboxes['ori'].corners[reg_inds, ...], target_labels['gt_cors'][reg_inds, ...])

loss_bbox_dims = self.loss_bbox(pred_bboxes['dim'].corners[reg_inds, ...], target_labels['gt_cors'][reg_inds, ...])

loss_bbox_locs = self.loss_bbox(pred_bboxes['loc'].corners[reg_inds, ...], target_labels['gt_cors'][reg_inds, ...])

loss_bbox = loss_bbox_dims + loss_bbox_locs + loss_bbox_oris

Conclusion

纵目发表的这篇单目3D目标检测论文不同于以往用2D预选框建立3D信息,而是采取直接回归3D信息,这种思路简单又高效,并不需要复杂的前后处理,而且是一种one stage方法,对于实际业务部署也很友好。

如果本文对你有帮助,更多内容请关注微信公众号【杰读源码】

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2022年5月26日
下一篇 2022年5月26日

相关推荐