【单目3D检测】smoke(1):模型解析

SMOKE是纵目科技在2020年提出的单目3D检测新方法,论文展示了一种新的3D目标检测方法,该方法通过将单个关键点估计与回归3D变量相结合来预测每个检测到的目标3D bounding box。SMOKE延续了centernet的key-point做法,认为2d检测模块是多余的,只保留了3d检测模块,预测投影下来的3dbox中心点和其他属性变量得到3dbox。整体来说SMOKE框架简洁,性能当年还算不错,推理速度快,部署起来方便!

题目:SMOKE:Single-Stage Monocular 3D Object Detection via Keypoint Estimation
代码:https://github.com/lzccccc/SMOKE

摘要

本文延续了centernet的key-point做法,认为2d检测模块是多余的,只保留了3d检测模块,预测投影下来的3dbox中心点和其他属性变量得到3dbox,参考Disentangling Monocular 3D Object Detection 对预测属性进行了loss解耦。这个简单的结构收敛较快且推理耗时小。后续还有monodle、monoflex等一系列基于centernet模式的算法,后面将不定期进行更新解读。
而论文Delving into localization error 中证明了2d检测的必要性(帮助3d检测学习到共享特征),所以smoke中去掉2d检测模块的做法有待商榷。

问题

之前的单目3d目标检测一般基于region_based的RCNN或者RPN结构,基于得到的2d proposals,结合后序结构推理出3dbox。一般是多阶段的算法。
本文是怎么解决的?
仅3d模块,基于key-point直接回归3d属性。基于解耦loss来训练。

网络总述

网络结构非常简洁,backbone接两个head,分别为分类head(heatmap)和回归head。
在这里插入图片描述

backone

使用dla34,这与centernet中的网络结果一致,唯一的改变就是将BN替换为GN(group norm),因为GN对batch size不那么敏感。输出尺寸为[H/4, w/4,C]。网络结构中包含多个cross path、下采样与上采样。如下图(来自于centernet):
在这里插入图片描述

3d detection

3d检测模块(head)分为两部分:(1)key-point分支,即heatmap分类分支;(2)回归分支。结构图如下:
在这里插入图片描述

key-point(heatmap)分支

与centernet不同的是这里预测3d box中心点投影下来的在2d图像上的点,而不是2d box的中心点。因为本文中直接抛弃了2d检测分支,而通过3d box中心点的投影点可以辅助恢复相机坐标系下的3d box的xy,所以这里用3d box投影下来的点更合适,在其他文献中也指出了用投影下来的点更容易建立2d和3d的关系。heatmap制作与centernet类似,不再赘述。

两个点的差异在近处目标上尤其明显。如下图红色为2d box中心点,橙色为3d box中心点投影下来的点。这个问题在很多单目检测算法中都会提及到,我们在之后的文章解析中还会再次看到。
在这里插入图片描述

reg head预测与3d属性相关的变量。

在这里插入图片描述
这里使用e的幂次是为了保证正数乘到均值上,结果一定为正。实际在网络输出加了sigmoid来映射:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
来看下代码:smoke/smoke/modeling/smoke_coder.py:200

def decode_orientation(self, vector_ori, locations, flip_mask=None):
locations = locations.view(-1, 3)
rays = torch.atan(locations[:, 0] / (locations[:, 2] + 1e-7)) # 计算theta,用的gt
alphas = torch.atan(vector_ori[:, 0] / (vector_ori[:, 1] + 1e-7)) # arctan(sin/cos)
# get cosine value positive and negtive index.
cos_pos_idx = torch.nonzero(vector_ori[:, 1] >= 0) # 比较cos值是否大于0,判断属于哪个区间
cos_neg_idx = torch.nonzero(vector_ori[:, 1] < 0)
alphas[cos_pos_idx] -= PI / 2 # 通过这步转换为kitti中的alpha角度定义
alphas[cos_neg_idx] += PI / 2
# retrieve object rotation y angle.
rotys = alphas + rays # ry = alpha + theta

而且还对sin,cos做了norm,将值域放到了-1,1之间。
在这里插入图片描述
基于上面估计量,就可以计算出3dbox的8个角点坐标了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数据增广

heatmap分类分支。包括水平翻转、多尺度、平移。

针对回归分支,只做了水平翻转。因为3d属性会随着缩放平移变化,需要对标签也做相应修改。

结果

  1. 仅用了60epoch就收敛,说明确实收敛更快了。
  2. test数据上比其他算法好,而val上不如其他算法。说明smoke需要更多数据才能训好,也说明kitti的val(当然这个val是人为划分的)和set设置不是很合理。
    在这里插入图片描述
  3. 回归中将不同属性的loss解耦后,性能提升明显。不同属性间会相互影响,这是单目检测或者多任务中经常面临的问题,而解耦loss是常用的解决方案。具体可以参考:Disentangling Monocular 3D Object Detection。
    在这里插入图片描述
  4. 对比了GN和BN,GN效果更好,训练更快。
    在这里插入图片描述
  5. 其他细节还有使用本文中sin/cos编码角度比四元数效果要好。本文无2d模块,将3d结果投影到图像作为2d检测结果,性能也不错。

总结

优点:整体来看本文框架简洁,性能不错,推理也快。

缺点:在实测表现中说

实测表现

框架简洁带来的结果就是性能上限有限,对于实际使用需要慎重。
单卡训练性能较差,必须多卡才可能接近作者报告的指标
依赖dcn,对落地部署不友好。
漏检严重,主要是小目标时高斯半径为0导致的。
角度估计误差太大,实践中发现这个问题非常突出,而且算法的泛化性也不太好。

参考:https://zhuanlan.zhihu.com/p/452676265

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BILLY BILLY

你的奖励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值