代码地址:DIoU
1. 概述
导读:这篇文章主要的贡献在边界框损失函数的优化上面,传统上使用Ln范数的损失,如smooth-L1或是其对应的改进balanced-L1,但是这些损失函数并不直接与检测框的质量相关。将检测框的质量作为回归的度量就引入IoU损失函数,为了弥补IoU损失函数在不相交的时候不可导的问题引入GIoU,但是GIoU也是存在收敛速度慢且回归不准确(GIoU在两个框相交时退化为IoU损失,且无法很好处理包含的情况)的问题。对此文章提出了将两个框的归一化距离作为损失度量的损失DIoU(Distance IoU),从而加快回归收敛与提升回归精度。在此之外,文章将框的IoU、中心点距离、以及框的宽高比例作为衡量预测与目标的要素,从而得到新的损失度量CIoU(Complete IoU)。另外,文章将提出的DIoU用作NMS的度量也会带来性能的提升。
边界框的损失函数从ln的范数损失到IoU损失的转换是直接将度量标准作为损失函数的过程,对应的IoU数学表达为:
IoU=∣B∪Bgt∣∣B∩Bgt∣
则采用其作为边界框的回归损失,其定义为:
LIoU=1−∣B∪Bgt∣∣B∩Bgt∣
但是,上面的IoU-Loss存在边界框不相交的时候无法产生损失梯度的问题,对此的解决办法就再在外面套一个大框,从而得到的新的损失函数GIoU:
LGIoU=1−IoU+∣C∣∣C−B∪Bgt∣
上述的损失函数解决了在不相交情况下不可导的问题,但是却存在收敛速度慢与性能不佳的问题,见下图是GIoU与文章提出的DIoU的比较:

上图中可以看出,GIoU在开始的时候需要将检测结果方法使其与目标框相交,之后才开始缩小检测结果与GT重合,这就带来了需要较多的迭代次数才能收敛问题,特别是对于水平与垂直框的情况下。此外,其在包含情况下检测框的性能无法有效度量,见下图所示

文章将上面涉及到的三种损失函数的错误画出进行对比:

2. 损失函数
文中将基于IoU的损失定义为如下形式:
L=1−IoU+R(B,Bgt)
其中的计算函数R就是文章中着重修正的地方。
2.1 DIoU损失
这里首先引出DIoU,后面的CIoU也是在这个基础上进行改进(增加长宽比例约束)得到的。这将额外的惩罚项由原有GIoU中的定义替换为了下面的形式:
RDIoU=c2ρ2(b,bgt)
其中,b,bgt是B,Bgt的中心点,ρ(⋅)是欧几里得距离,c是包含预测框与目标框的最小矩形的对角线长度(参考GIoU中C的定义)。上诉的几个参数在几何上的表示见下图所示:

则新的DIoU损失函数就被定义为:
LIoU=1−IoU+c2ρ2(b,bgt)
DIoU与IoU、GIoU的关系:
- 1)DIoU依然是具有尺度不变性的;
- 2)与GIoU一样在两个框不相交的时候也能产生梯度,然后进行回归;
- 3)在检测框与预测框完全匹配的时候,他们之间的损失值为:LIoU=LGIoU=LDIoU=0,当两个框离得很远的时候:LGIoU=LDIoU→2
DIoU损失相比IoU与GIoU的优势:
- 1)从图1与3可以看出DIoU收敛速度更快;
- 2)在两个框包含、水平与垂直方向的时候,DIoU仍能快速回归,而在这样的情况下GIoU退化为IoU损失;
2.2 CIoU损失
上面提出的DIoU是只考虑了框的位置关系,但是并没有考虑检测框与目标框的几何关系,因而这里还对框的几何关系做了约束,这里的约束是通过引入度量v实现的,其定义为:
v=π24(arctanhgtwgt−arctanhw)2
对于这个新引入的度量使用参数α进行调和,因而新的损失函数就可以定义为:
LCIoU=1−IoU+c2ρ2(b,bgt)+αv
其中,参数α=(1−IoU)+vv。
对于新引入的惩罚维度v中的w,h的梯度计算表达为:
∂w∂v=π28(arctanhgtwgt−arctanhw)∗w2+h2h
∂h∂v=−π28(arctanhgtwgt−arctanhw)∗w2+h2w
其中由于w2+h2的范围很小,作为被除数会导致较大的梯度,这样会导致网络不稳定,因而文中将最后一项设置为w2+h21=1
2.3 使用DIoU改进NMS
之前的NMS操作直接使用IoU剔除多余的检测框,在引入DIoU之后则新的剔除规则被描述为:
si={si,0,IoU−RDIoU(M,Bi)<ϵIoU−RDIoU(M,Bi)≥ϵ
其中,si是检测框分类置信度,ϵ是NMS的阈值。
3. 实验结果
baseline为YOLO-V3

baseline为SSD

baseline为Faster RCNN
