赞
踩
本文主要是理解各个回归损失函数的区别和改进,其实最主要的还是这些损失函数在yolo中起到了非常大的作用,包括从最原始的yolov3中引入,到v4、v5中变成真正的官方损失函数,确实很有效。本文将逐条分析这些损失函数,并不会按照论文结构来描述。
paper:https://arxiv.org/pdf/1608.01471.pdf
iou-loss本身是是从人脸检测的paper引入进来的,由于此文只分析损失函数比较简单,我们只讨论IOU-LOSS,先看paper的原图:
简单易懂,IOU-loss与l2-loss值的差异,然后更进一步的给出了iou-loss的表达式,如下:
流程和公式实在是很简单,相信有一定基础的同学肯定都理解,此处不再赘述,我们重点看接下来的GIOU和DIOU和CIOU。
paper:https://arxiv.org/abs/1902.09630
首先本文最重要的一点,便是指出针对regression使用类似于l1 loss之类的损失函数不合适,因为在回归任务中,如果使用l1-loss时,相同的loss值时,regression的效果可以大不相同,也就是说,loss值不能够直观的体现出regression的效果,而我们在目标检测中,使用的最多的评估标准就是IOU,iou具有一个尺度不敏感的特性,根据当前的iou数值,可以体现出预测值与gt值的直接效果。我们直接看paper的原图:
我们看到上图a和图b中,当l2-loss值固定时,regression效果完全不一样,明显,图a和图b的第三幅图效果是最好的,l2-loss的描述情况明显没有使用iou来表示好,进一步的,当iou相同时,只能代表目标框和检测框的交并比相同,但预测框的实际大小有可能完全不一样,这样也说明了无论是iou-loss或者l2-loss都不能够很好的反应出检测效果。而且iou有两个缺点不适合作为损失函数:
1、检测框与gt框没有重叠时,iou=0,也就是说梯度为0,没法优化(GIOU重新定义了损失函数的公式,保证在没有相交时也会有损失函数值,能够进行反向传播)
2、检测框与gt框有iou时,无法精确反映重合度大小,检测效果也有较大的差异
针对上述问题,提出了GIOU,具体定义先见paper的截图:
简单解释一下定义:先计算两个框的最小闭包区域面积,再计算IOU,再计算不闭包区域中不属于两个检测框的区域占闭包区域的比重,最后用IOU-这个比重得到GIOU。
GIOU具有4个特点:
1、与IOU相似,也是一种距离度量,作为损失函数满足损失函数的需求
2、GIOU对scale不敏感
3、GIOU是IOU的下界,取值为[-1, 1],在两个框无重合的情况下,IOU=0,减数为1,GIOU即为-1,当两个框完全重叠,IOU=1,减数为0,则GIOU=1(可以理解为由于惩罚项的引入,在不重叠的情况下,预测框会向目标框移动)
4、GIOU除了关注重叠区域不同,还关注了非重叠区域,能够更好的反应重合度。
paper给出的算法流程如下:
看上去相当的复杂,如果剔除掉阅读困难的复杂符号,其实就很简单了:
第一步(上图中1):找出两个坐标的最边界点,用于计算闭包面积;
第二步(上图2,3,4,7):计算IOU;
第三步(上图5):计算闭包面积;
第四步(上图8,9):计算IOU-LOSS和GIOU-LOSS
测试结果:
faster-rcnn:
可以看到,giou在yolov3和faster-rcnn上都获得了一定程度的提升,证明该损失函数适用于one-stage和two-stage,不像focal-loss一样存在一定的局限性。
paper:https://arxiv.org/pdf/1911.08287.pdf 提出DIOU和CIOU
paper:https://arxiv.org/pdf/2005.03572.pdf 提出CIOU和应用(检测+分割)
注意,两篇paper的作者几乎是同一个团队,可以认为是一个补充或者互相印证的关系
首先我们直接看paper的原图,为什么DIOU会比IOU和GIOU要好:
如上图所示,当出现如上场景时,计算各种基于IOU的损失函数值,L-diou是能够描述检测框与gt框的位置信息,上图中,我们可以看到,当处于第三幅图时,检测框和gt都位于中心,iou=giou=diou,但是,位置出现差异,如第一幅图和第二幅图时,明显第二幅图的效果要好一些,此时GIOU降级成为IOU,而DIOU的损失值较大,能够较好的描述当前位置信息。
再进一步给出paper对各个损失函数的定义:
基于上,作者此时提出了DIOU,提出了2个问题,第一:最小化两个边界框中心点的归一化距离能否加快收敛。第二:如何在回归时,能够更好的描述重叠信息,同时使得回归更准确,更快速?
基于上述两个问题,我们看paper定义了基于iou的损失函数:
作者认为,常规iou-loss可以被定义成如上式所示,其中R项我们可以认为是检测框与gt框的惩罚项,针对上文提到的两个问题,基于这个不同的惩罚项定义,paper提出了DIOU和CIOU。
针对第一个问题,原paper中我们看到作者对DIOU的定义如下:
如式6所示,b和b-gt分别代表预测框和gt框的中心点,
DIoU的优点如下:
1、对尺度不敏感,
2、与GIoU loss类似,DIoU loss在与目标框不重叠时,仍然可以为边界框提供移动方向。
3、当边界框完全匹配时,L_iou=L_giou=L_diou=0, 当相距很远时,L_giou=L_diou -> 2
4、DIoU loss可以直接最小化两个目标框的距离,而GIOU loss优化的是两个目标框之间的面积,因此比GIoU loss收敛快得多。
5、对于包含两个框在水平方向和垂直方向上这种情况,DIoU损失可以使回归非常快,而GIoU损失几乎退化为IoU损失
以上就是DIOU的基本描述了,具体的实验我们讲解完同一篇论文提出的CIOU后一并给出结果。
DIOU解决了上文提到的第一个问题,归一化两个中心点的距离从而加速收敛的问题,但是还未解决第二个问题,即如何在回归时能够更好的描述重叠信息。我们再回到paper。
paper指出,预测的bbox的三个重要的因素分别是,重叠面积、中心点距离和纵横比(长宽比)。L_iou考虑了重叠区域,而giou很大程度上依赖了iou损失,DIou则同时考虑了重叠区域和中心点距离,更进一步的,边界框的长宽比的一致性也是一个重要的几何因素。因此,基于DIOU,我们通过施加长宽比的一致性来提出了CIOU-loss:
我们可以看到,在式8中,α是用于平衡比例的参数,v是用来描述预测框和gt的长宽比的比例一致性的参数。其中v和α的取值如式9和式11所示,完整的CIOU表达式如式10所示。从式11的定义来看,损失函数会倾向于往重叠区域增多的方向进行优化,尤其是IOU为0的时候。
最后,CIOU和DIOU的优化方式是一样的,但是参数v相对于w和h的梯度需要指定一下,如下式所示:
对于h和w在[0,1]范围内的情况,控制因素w^2+h^2通常是一个很小的值,这很可能会产生梯度爆炸。 因此,在我们的实现中,为了稳定收敛,简单地删除了w^2+h^2,用1代替了步长w^2+h^2,等式12依旧成立。
1、pascal voc的测试结果:
yolov3:
2、coco的测试结果
faster-rcnn:
综上,我们可以看到CIOU最终提升了很多,尤其是最后一项,CIOU然后使用DIOU-nms,效果相当棒。
代码地址:https://github.com/ultralytics/yolov5
简单分析yolov5的iou系列损失函数代码,如下图所示:
其实也没啥好分析的,代码清晰易懂,首先计算iou,当存在GIOU、DIOU、CIOU时,进一步计算闭包区域,当存在DIOU、CIOU时,进一步计算中心点距离,当存在CIOU时,进一步计算参数v和α。得到IOU损失函数值以后,再使用如下式计算:
求mean后得到最终的损失,完成bbox的回归损失计算。
综上,这就是从IOU->DIOU-> DIOU->CIOU的一个进化流程,讲的不对的地方欢迎同学指出并纠正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。