向大家介绍一篇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框属性的关系。
根据深度偏移量可以求得目标的深度值,公式如下:
上式中的