因为项目要用到3D目标检测,所以拜读了这篇经典的纯单目视觉的3D检测论文。
该篇论文发表于2017年,影响很大,百度阿波罗引用过,许多文章都是以他为基础开展的。不过,以现在的眼光来看,有不少缺点,但仍然不妨碍咱们体会他的精髓。
1.预备工作
阅读该篇读书笔记前,我建议先看一看这篇博主的文章Deep3Dbox 复现笔记【附部分code】 - 知乎 (zhihu.com) 复现的十分好。
但是有一点小谬误,虽然无伤大雅,但必须指出,那就是该博主theta角的解算是不准确的,只有在视场角小的时候才可以这样等效。
在正式开始前,还必须要了解KITTI这部分数据集,该博主也贴出来了,非常好。 KITTI数据集--参数_cuichuanchen3307的博客-CSDN博客_kitti
还需要注意的是KITTI数据集,存在类别不平衡、样本不均衡,所以做训练的时候,一定要使用focal loss。
(即使使用focal loss也无法完全解决这种问题,原因比较复杂,感兴趣的可以了解一下多标签分类问题。)
2.核心思想
Deep3Dbox有一个很强的假设:物体的3D框在2D框中。虽然这个假设不总是成立,但是足以应付大多数情况。
他的另一个重要观点,就是不要直接回归物体的方向角,要把他转为alpha角,利用多分类加偏移量的方法来求取。
作者给出了他用来训练的网络,用的是VGG模型,输出了物体的尺寸、角度偏移量、类别的置信度这几种。
这是一个典型的分支任务网络,用的是传统的hard parameter sharing,一种老当益壮的做法。
3.读后疑惑
该篇文章的核心思想十分简单,就是先对目标进行2D框检测,再用一个网络输出2D框中物体的尺寸、角度偏移量、类别的置信度,最后直接求出T矩阵。
读完之后,我大吃一惊,原来如此简单。可是复现的时候,笔者遇到了极大的困难。
首先,一点是如何确定与xmin或xmax或ymin或ymax对应的XYZ点。其次是R旋转矩阵到底怎样的。最后是lamda似乎也是一个未知量。
我们先解决第一点,如何寻找与xmin对应的XYZ点。笔者认为可以利用EM算法进行迭代,就是先给出一个先验量T,然后带回到公式中求出x坐标最小的XYZ点,认为是与xmin对应的XYZ点。利用该对应关系求出更新后的T,再将该T带入矩阵中,一直迭代优化。
第二点,R旋转矩阵只考虑yaw角度。
第三点,lamda并非未知量而是深度。
以上三点,都需要利用EM算法和最小二乘法进行计算。
4.复现效果
效果真不咋地,有些角度的估计有大问题,我觉得是因为KITTI的样本不均衡问题。