这篇文章的思路比较简洁,也有比较清晰的理论依据,我本人比较喜欢这种风格。
中国电子科技大学的团队
我们看看作者团队是如何介绍自己的思路的。
目标检测是由目标分类和目标定位配合完成的。
自动驾驶,视频安防和机器人都需要比较精准的目标检测。
一般的目标检测
- 用一个回归网络来预测候选窗和真实目标之间的偏移量。 注意这里是偏移量,这个值是连续的,可取任意实数。
对于这个连续的实数,优化问题就只能是回归问题了,用的损失函数loss function也就是回归常用的损失函数比如L2 loss,L1 loss等,或者是Smooth L1 loss.
损失函数中的两项:预测的偏移量t_x和真实的偏移t_x_*量的计算公式如下图:
优化完成后,就是网络模型训练好后,就可以通过这个偏移量tx,ty,tw,th和候选窗(来计算的到网络预测的框
我们来回顾一下BBox回归的方法:
在R-CNN中回归用的是L2 loss,就是MSE,mean square error, 平均误差平方,简称均方差。这个loss函数对其自变量x的梯度为:.
也就是说x越大,梯度就越大。
这里的x其实是误差,预测值与真实值之间的误差。
也就是说误差越大,梯度就越大。
实际上,我们在用梯度下降算法的时候,并不是梯度越大越好的,太大的梯度容易造成梯度爆炸。计算机会输出很多"nan"符号。这个符号的意思是not a number,不是一个数据。因为这个数据太大,计算机无法表达出来,所以就显示not a number.
这里其实还有个疑问,我们这里的x,其实就是误差,是预测值 和 真实值之间的误差,这个误差不会很大的,也就是1000,10000,这个量级,即便再乘以2,这样大小的数据计算机是毫无压力的。那么为什么会产生让计算机无法表示出来的数据了呢?
因为梯度下降法里面求梯度的方法是链式求导。
链式求导:串联函数总的梯度等于各自梯度连乘。
梯度连乘的话,如果这些连乘的梯度每一项都大于1,只要大于1,连乘出来的梯度就会非常大。
正是由于这个现象的存在,在我们使用梯度下降算法的时候,梯度的绝对值不适合太大,这样会造成梯度爆炸,梯度也不应该太小,会造成梯度消失,梯度的绝对值应该是在1左右的。
那么在R-CNN用了L2 loss 显然不能很好地控制梯度爆炸问题。
在Fast R-CNN的时候,就用Smooth L1 loss 代替了L2 loss。比较好地解决了L2 loss的梯度爆炸问题。smooth L1 中,当误差x比较大的时候,其对应梯度的绝对值总是1.这就很稳定了。
但是总是1也有问题,就是对于确实误差比较大的样本,这个梯度是太小了,优化不到位。需要太多的训练步骤。而这个需要太多训练步骤,对我们来说,在实际操作中,会造成训练不足。
总的来说,就是Smooth L1 loss 虽然改进了L1 loss 的梯度爆炸问题,但同时也带来的新的问题,对于某些样本来说,梯度是”消失“的,一些样本始终无法得到很好的训练。
该如何解决这个问题呢?
论文给出了一个解决问题的办法:把原来的预测偏移量,分为两步:先预测偏移范围,再进行具体偏移量的回归。
这个思路先把大致的偏移范围预测出来,然后再以偏移范围的偏移量为基准,预测最终偏移量与这个偏移范围中心的偏移值。
这样,我们就将问题转化为预测两级偏移量。由两级偏移量级连堆叠得到最终的偏移量。
当最终偏移量比较大时,这样分成两级后,每一级就比原来小,也就容易训练了。
我们看看作者是如何实现的:
先将总的偏移量划分为N个 bins,也就是N个范围,
也就是说,我们预测最终偏移量是属于这N个范围中的哪一个,得到这个范围对应的第一级偏移量。
也就是说,我们预测最终偏移量是属于这N个范围中的哪一个,得到这个范围对应的第一集偏移量
也就是说,我们预测最终偏移量是属于这N个范围中的哪一个,得到这个范围对应的第一集偏移量
也就是说,我们预测最终偏移量是属于这N个范围中的哪一个,得到这个范围对应的第一集偏移量
预测出具体属于哪一个bin后,得到这个bin的偏移量,同时得到这个对应的,由网络分类头输出的置信度概率,然后利用这个概率来求t的期望,从而得到最终的偏移量。
那么要预测最终偏移量到底属于这N个范围中的哪一个?其实就是分类问题。输入N类中的哪一类。所以训练的时候,我们就使用交叉熵loss(cross-entropy)。
总结:我们把原来直接预测偏移量转化为先分类偏移范围,同时得到第一级偏移量和其概率,然后再预测最终偏移量的操作。把原来的一个回归问题,转化为一个分类加一个求期望的问题。这样就既避免了梯度爆炸,又避免了对偏移比较大的样本训练不足的问题。
很好的解决了Smooth L1 对误差较大的框训练不足的问题。
我们再来看看这个bins,这个偏移量的范围是如何构建的:
以上两图是论文截图。我们翻译一下。
如图4,我们把在[-a,a]划分之间划分m个bins,每个bin的宽度为w=2a/m.
另外,我们把小于-a和大于a的部分也都作为一个bin,所以我们一共有n=m+2个bins.每个bin的标签定义为,其公式就可以写为公式(5)所示。
公式中的t就是第一级偏移量的具体值。
当l=0时,第一级偏移量t为-a+a/m,
当l=1时,第一级偏移量t为-a+[(2+1)/2]*2*a/m=-a+3a/m
当l=m-1时,第一级偏移量t为-a+[(2m-2+1)/2]*2*a/m=a-a/m
当l=m时,第一级偏移量t为-a+[(2m+1)/2]*2*a/m=a+a/m
由于l必须取整数,公式中的t取不到-a,a的值,所以,我们认为规定了
当l=m+1时,t为-a
当l=m+2时,t为a
我们训练的时候,主要是分类出我们最终要求的偏移量,到底属于哪个第一级偏移量t。
如图4,我们在[-5,5]的范围上分了5个bins,每个bin的宽度为10/5=2.
当l=0时,第一级偏移量t为-5+5/5=-4
当l=1时,第一级偏移量t为-5+3*5/5=-2
当l=4时,第一级偏移量t为5-5/5=4
当l=5时,第一级偏移量t为5+5/5=6
算到这里,也就是说,我们把[-5,5]分成了5个 bin, 然后小于5分成一个bin, 大于5分成一个bin,一共是7个bin。
那么这个7个bin对应的偏移量t分别为:-5,-4,-2,0,2,4,5.
注意到,咩有6,也就是说l会等于m.
关于这点,我认为这里是作者的笔误,因为作者前面也说了构建了m+2个bin,上下文中的意思也就说有m+x的bin,而在公式中,如果l=m就是有m+3个bin的偏移量了,所以这里大胆推测做核这里在计算代表每个bin的偏移量t时,这里l=m是笔误了
公式应该改为:
那么得到这个第一级偏移量之后,我们如何得到最终的偏移量呢?
答案是求偏移量期望。
按照公式10,求出偏移量的期望即可得到最终的偏移量值。
按照图4中,有7个偏移量[-5,-4,-2,0,2,4,5],我们预测出来这7个偏移量的概率p分别为[0.1,0.1,0.1,0.5,0.1,0.1,0]
那么最终的偏移量为:0.1x-5+0.1x-4+0.1x-2+0.5x0+0.1x2+0.1x4+0x5=-0.5
这就是Offset Bin Classification Network思路。如下图:
利用第一级偏移量t的期望得到最终偏移量。
那么顺着这个思路,其实我们可以把预测范围递归划分,就可以把预测精度做得更加精准,如下图所示:
这其实是一个由粗到细的过程。
本文也是做了大量的实验,实验结果如下:
总结:
本文贡献:
1 用偏移范围分类预测代替偏移量回归预测,避免梯度爆炸问题和特殊样本训练不足的问题。
2 采用求期望的方法将离散的第一级偏移量转换为连续的最终偏移量。
3 偏移范围分类思路还可以递归起来,由粗到细地进一步提高预测框的精度。
附作者的论文全文: