目标检测IoU GIoU DIoU CIoU EIoU Loss

  • L1 L2 Loss&Smooth L1 Loss
  • IoU Loss
  • GIoU Loss
  • DIoU Loss
  • CIoU Loss
  • EIoU Loss



L1 L2 Loss&Smooth L1 Loss

flop 目标检测 目标检测 loss_损失函数


flop 目标检测 目标检测 loss_flop 目标检测_02

L1 Loss对x的导数为常数,在训练后期,x很小时,如果learning rate 不变,损失函数会在稳定值附近波动,很难收敛到更高的精度。

误差均方和(L2 Loss)常作为深度学习的损失函数:

  1. 对于异常值,求平方之后的误差通常会很大,其倒导数也比较大,对异常值比较敏感,在初期训练也不稳定

Smooth L1 Loss避开了L1 Loss在靠近原点时导数一直恒定,L2在远离原点时导数很大的情况,可以说一举两得。

但以上得函数,作为定位任务的损失函数却存还在以下不足之处:

  1. 把定位框的坐标值当作互相独立的四个变量进行训练,然而实际的评价指标是用交并比(IoU)作为评价指标,这两种并不等价,训练时当成独立的坐标也与实际情况不相符合
  2. 没能考虑到不同大小物体,小物体的误差均方通常会比大物体的误差均方小很多,造成对小物体的定位学习得慢。(有的做法是在计算的时候乘上 2-面积 ,实现小目标有大权重,大目标有小权重)

flop 目标检测 目标检测 loss_宽高_03


采用IoU直接作为损失函数,将4个点构成的定位框看成一个整体进行回归,可以解决上述提到的问题。

但是,当预测框和目标框不相交时,IoU恒等于0,不能反映两个框之间距离的远近,此时损失函数不可导,IoU Loss 无法优化两个框不相交的情况。此外,假设预测框和目标框的大小都确定,只要两个框的相交值是确定的,其IoU值是相同时,IoU值不能反映两个框是如何相交的。GIoU把两个框的最小外接矩形面积考虑进去,只有当两个框重合时才会为0,使得模型在任意情况下都可以进行训练。

GIoU Loss虽然解决了IoU Loss中Loss为0的问题,但是依然存在一些不足。当大框将小框覆盖时,不管小框在大框内部的任何位置,IoU Loss与GIoU Loss都是一个定值,这种情况将无法进一步优化出更好的模型。

DIoU Loss除了考虑重叠面积之外,还加入了中心距离,这样即使覆盖了,但也会因为中心距离不同而进一步优化,之前的实验表明这样可以加快收敛速度,使得定位框快速向真实框靠拢。对于目标框包裹预测框的这种情况,DIoU Loss可以收敛的很快,而GIoU Loss此时退化为IoU Loss收敛速度较慢。

好的目标框回归损失应该考虑三个重要的几何因素:重叠面积,中心点距离,长宽比。在DIoU的基础上加入了长宽比的因素得到CIoU,在DIoU的惩罚项基础上加了一个影响因子,把预测框长宽比拟合目标框的长宽比考虑进去。

IoU Loss

flop 目标检测 目标检测 loss_宽高_04

GIoU Loss

flop 目标检测 目标检测 loss_损失函数_05

DIoU Loss

flop 目标检测 目标检测 loss_损失函数_06

flop 目标检测 目标检测 loss_权重_07

CIoU Loss

flop 目标检测 目标检测 loss_宽高_08

在实际使用中需要注意的是:DIOU和CIOU求导会产生不稳定的一项分母w2+h2,这里是小数的平方项,比较敏感,为了稳定把这里简化为1。我以前用的时候没有注意到这一点,虽然比IOU和GIOU性能好,但是CIOU并没有比DIOU好。

flop 目标检测 目标检测 loss_宽高_09

EIoU Loss

《Focal and Efficient IOU Loss for Accurate Bounding Box Regression》

CIOU Loss虽然考虑了边界框回归的重叠面积、中心点距离、纵横比。但是通过其公式中的v反映的纵横比的差异,而不是宽高分别与其置信度的真实差异,所以有时会阻碍模型有效的优化相似性。针对这一问题,有学者在CIOU的基础上将纵横比拆开,提出了EIOU Loss,并且加入Focal聚焦优质的锚框。

EIOU的惩罚项是在CIOU的惩罚项基础上将纵横比的影响因子拆开分别计算目标框和锚框的长和宽,该损失函数包含三个部分:重叠损失,中心距离损失,宽高损失,前两部分延续CIOU中的方法,但是宽高损失直接使目标盒与锚盒的宽度和高度之差最小,使得收敛速度更快。惩罚项公式如下:

flop 目标检测 目标检测 loss_损失函数_10


其中 Cw 和 Ch 是覆盖两个Box的最小外接框的宽度和高度。

此外,本文首先尝试直接将EIoU带入Focal,但是效果不好,最后得到:

flop 目标检测 目标检测 loss_宽高_11


从公式能看出,IOU越高的损失越大,给越好的回归目标一个越大的损失。值得思考的一点:Focal loss本来是越难识别权重越大,起到难样本挖掘的作用,but这里却是减少与目标框重叠较少的大量锚框对BBox 回归的优化贡献,专注于高质量锚框,或许这里的Focal表达形式有待改进。