对于目标检测,大家在网络结构上,IOU上,Anchor上做了大量文章,这篇文章优秀的地方在于提出了针对于bbox可靠性的想法,想到了用高斯模型来评估bbox坐标的可靠性,提出了一种新的计算bbox的loss。
高斯模型
首先回顾一下最原始的YOLOv3:
对于输出feature,每个点输出3×((tx, ty, tw, th)+ obj_score + class_score)个信息。其中3表示每个位置预设3个anchors,obj_score包含了是否包含目标的可靠性信息, class_score包含了类别的可靠性信息,唯独关于bbox,我们仅有关于坐标的相关信息tx, ty, tw, th,但这些坐标信息并不能表示该bbox的可靠性。基于此,文章提出了将高斯模型用到bbox的坐标预测上,通过高斯模型的标准差来估计坐标信息的可靠性。
加入高斯模型后,网络的输出变成了这样:
bbox坐标输出变成了,其中μ代表均值,∑代表标准差,但这里还不是严格意义上高斯模型要用到的均值和标准差,需要做如下变换:
最终得到,才是高斯模型的均值,这个值在计算bbox坐标的时候可以直接当做
来用。其中有几点需要注意的:
- 对于
做了sigmoid变成了
,将值限定在(0,1)的范围内秉承了YOLO的一贯思想:每个grid检测的物体中心必须落在当前grid的内。
-
没有做sigmoid是因为宽高的scale变化有可能超过1,这个做法也同原YOLOv3相同。
- 标准差
也通过sigmoid将值限定在(0,1)范围内,这是因为标准差表明了点坐标的可靠性,0表示非常可靠,1表示不可靠。
loss function
对bbox坐标做了这样的变换后,网络输出的每个bbox coordinate都将满足均值为μ,标准差为∑的高斯分布,因此文中采用了NLL_LOSS,即negative log likelihood loss:
下面的内容数学预警,你可以选择不看!!
如果你对机器学习比较熟悉,那这个loss就比较好解释。如果不熟的话,我们可以定性的分析一下nll_loss。
首先这个式子表明对于box的ground_truth的某一点坐标
在
和
的高斯分布下的值,高斯分布的表达式是这样子的:
这个式子的代表的是高斯分布的概率密度函数,其中每个x对应的输出值f(x)是在该点的概率密度值,这个值可以代表概率但是并不是概率,但是总体来说我们希望的是对于网络输出的每一个均值和
所构成的高斯分布下,groudtruth在改点的概率密度最大,即概率最大,这样表明我们输出的这个高斯分布于真实的label最相符。即:当
和
构成的分布越和真实label的分布接近,N(...)就会越大,log[N(...)]就会越大,取个负号反之loss就会越小。
至于为什么前面我们说过可以用输出的当做tx来用,是因为
就是tx的最大似然估计。
而对于高斯分布来讲,标准差越大,可以一定程度上说明这个分布的变化比较大,即这个bbox的估计结果越不可靠。
--------------预警结束分割线------------------------------------
其他的地方和YOLOv3基本一样,不同的是在阈值的计算上,criterion变成了:
加入了坐标值可靠性因素Uncertainty_aver,这个值是bbox输出的四个标准差的平均值,这也就是前面为什么对标准差做了sigmoid的结果。
结果
在KITTI和BDD上验证结果:
可以看到Gaussian YOLOv3比YOLOv3的效果提升了很多,并且加入了Gaussian之后的YOLO效果在同等速度下达到了最优。
并且文中提到Gaussian YOLOv3有效的减少约%40的False Positive,提高了约5%的True Positive。