抓取检测之抓取角的训练方法

这段时间在看抓取检测相关的资料,注意到一个细节,不管哪种抓取表示方法,都包含了抓取旋转角φ,即夹持器垂直接近目标时,沿z轴旋转的角度,范围是[-π/2,π/2]。为了训练由输入图像到旋转角的转换关系,一般采用将角度值编码为单位圆上的点坐标(sin2φ, cos2φ)的方法,目的是消除原始角度在训练过程中产生的不连续性。我一开始看不懂这么做的意义,后来根据某篇论文的参考文献查到该方法的来源《Kota Hara, Raviteja Vemulapalli, and Rama Chellappa. Designing Deep Convolutional Neural Networks for Continuous Object Orientation Estimation. arXiv preprint arXiv:1702.01499, 2017》,总结了以下内容。

    1、为什么不直接预测φ值

    目前常用的训练模型就是卷积神经网络,经过一系列的乘权重加偏置,最终得到一个值,将其与标注值求损失函数的导数,再反向传播更新权重和偏置,直至损失最小。但是角度值和一般的图像分类不同,图像分类最终输出的是一组数(数量与标签数相同),求其中的最大值所在的下标就是预测标签;但角度估计最终的输出就是一个值,不是根据多个值的关系再得出预测值(如最大值、最小值的下标等),我们的角度标注值一般是[-π/2,π/2],而预测值一般是*的,又不能用统一的尺度缩放到标注值范围内再求损失,所以直接预测弧度是不行的。

    2、论文方法一:将角度值编码为单位圆上的点坐标(sin2φ, cos2φ)

    最终的输出值不是直接作为弧度去求损失,而是作为单位圆上的点坐标(sin2φ, cos2φ)(论文里估计的角度是[-π,π],所以是sinφ和cosφ,这里因为预测点可能是单位圆上任意的点,所以用sin2φ和cos2φ)。相对应的,groundTruth也通过程序改为对应的sin2φ和cos2φ。由于在抓取检测中,角度估计和夹爪宽度、抓取坐标等是同时训练的,所以损失函数采用L2或交叉熵等。这样在运行的时候,网络的预测值就是sin2φ和cos2φ,我们再通过抓取检测之抓取角的训练方法反推出弧度。采用这种方法,就避免了直接预测弧度带来的问题,因为不管预测值是什么,他都可以通过上面的公式退出一个弧度值来。

    但是,采用L2范数或类似的函数求损失有一个缺点,损失不仅与角度差有关,还与预测的圆半径有关。与角度差有关好理解,与预测的圆半径有关怎么理解呢,这要回到上一段,标注的sin2φ和cos2φ取平方再相加结果是1,即所有的标注值都是以单位圆的圆心为原点的单位圆上的点坐标;但预测的结果并不一定满足平方和是1,即使通过预测值反推出来的弧度与标注值一样,也会因为平方和不同使损失不为0,如下图所示。

                               抓取检测之抓取角的训练方法

                                              抓取检测之抓取角的训练方法

    3、论文方法二:在方法一上修改了损失函数,其他不变

    损失函数如下:

                                     抓取检测之抓取角的训练方法

此时,若预测值和标注值的角度相同,即使圆半径不同,损失也是0。

但是如果要在抓取检测网络中用两个损失函数,实现起来就比较麻烦了,而且即使这么做了,是不是在提高准确度的同时降低速度或其他优势也不好说,不过值得一试。

    同时论文还介绍了一种比前两种方法更好的方法,大致原理是将连续的角度估计进行离散化,使用网络预测在每一个离散区间的概率,最后再反推出弧度。因为时间有限,就没仔细研究了,以后有时间再看。