交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU

时间:2024-03-13 12:32:37

深度学习之损失函数小结

在深度学习中,损失函数扮演着很重要的角色。通过最小化损失函数,使得模型达到收敛状态,减少模型预测值的误差。因此,不同的损失函数,对模型的影响是重大的。下面总结一下常用的损失函数:

  • 图像分类:交叉熵
  • 目标检测:Focal loss、L1/L2损失函数、IOU Loss、GIOU、DIOU、CIOU

IOU Loss:考虑检测框和目标框重叠面积。

GIOU Loss:在IOU的基础上,解决边界框不重合时的问题。

DIOU Loss:在IOU的基础上,考虑边界框中心距离的信息。

CIOU Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。

  • 图像识别:Triplet Loss、Center Loss、Sphereface、Cosface、Arcface

现存问题

IOU、GIOU没有考虑真值框与预测框中心的之间的距离信息,实际情况下,中心点的距离越小框预测的越准。DIOU可以很好的反应中心点距离的情况z

图像分类

交叉熵

在图像分类中,经常使用softmax+交叉熵作为损失函数:
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
其中,p(x)表示真实概率分布,q(x)表示预测概率分布。交叉熵损失函数通过缩小两个概率分布的差异,来使预测概率分布尽可能达到真实概率分布。
后来,谷歌在交叉熵的基础上,提出了label smoothing(标签平滑),具体介绍,可以参考这篇博客。

在实际中,需要用预测概率去拟合真实概率,而拟合one-hot的真实概率函数会带来两个问题:

  1. 无法保证模型的泛化能力,容易造成过拟合;
  2. 全概率和0概率鼓励所属类别和其他类别之间的差距尽可能加大,而由梯度有界可知,这种情况很难adapt,会造成模型过于相信预测的类别。

因此,为了减少这种过于自信,同时减缓人为标注的误差带来的影响,需要对p(x)进行变化:
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
其中,δ(k,y)为Dirac函数,u(k)为均匀分布。简单而言,降低标签y的置信度,提高其余类别的置信度。从而,交叉熵变成了:
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU

目标检测

一篇很好的博文,是介绍目标检测中的损失函数的,可以参考一下:

在目标检测中,损失函数一般由两部分组成,classification loss和bounding box regression loss。calssification loss的目的是使类别分类尽可能正确;bounding box regression loss的目的是使预测框尽可能与Ground truth框匹对上。

Focal loss

该Focal loss损失函数出自于论文《Focal Loss for Dense Object Detection》,主要是解决正负样本之间的不平衡问题。通过降低easy example中的损失值,间接提高了hard example中损失值的权重。Focal loss是基于交叉熵进行改进的:
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
可以看到,在交叉熵前增加了(1−pt)γ,当图片被错分时,pt会很小,(1−pt)接近于1,所以损失受到的影响不大;而增加参数γ是为了平滑降低esay example的权重。当γ=0时,Focal loss退化成交叉熵。对于不同的γ,其影响如下图所示。
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU

L1,L2,smooth L1损失函数

利用L1,L2或者smooth L1损失函数,来对4个坐标值进行回归。smooth L1损失函数是在Fast R-CNN中提出的。三个损失函数,如下所示:
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
从损失函数对x的导数可知:L1损失函数对x的导数为常数,在训练后期,x很小时,如果learning rate 不变,损失函数会在稳定值附近波动,很难收敛到更高的精度。L2损失函数对x的导数在x值很大时,其导数也非常大,在训练初期不稳定。smooth L1完美的避开了L1和L2损失的缺点。

在一般的目标检测中,通常是计算4个坐标值与GT框之间的差异,然后将这4个loss进行相加,构成regression loss。

但使用上述的3个损失函数,会存在以下的不足:

  • 上面的三种Loss用于计算目标检测的Bounding Box Loss时,独立的求出4个点的Loss,然后进行相加得到最终的Bounding Box Loss,这种做法的假设是4个点是相互独立的,实际是有一定相关性的
  • 实际评价框检测的指标是使用IOU,这两者是不等价的,多个检测框可能有相同大小的Loss,但IOU可能差异很大,为了解决这个问题就引入了IOU LOSS
IOU Loss

该IOU Loss是旷视在2016年提出的《UnitBox: An Advanced Object Detection Network》。该论文的主要观点之一是:

  • 使用基于欧式距离的L-n损失函数,其前提是假设4个坐标变量都是独立的,但实际上,这些坐标变量是具有一定的关联性。
  • 评价指标使用了IOU,而回归坐标框又使用4个坐标变量,这两者是不等价的。
  • 具有相同的欧式距离的框,其IOU值却不是唯一的。

所以,提出了IOU loss,直接使用IOU作为损失函数:
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
同时,也会有人使用的是:
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU

GIOU

该GIOU Loss损失函数是斯坦福于2019年提出的《Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression》。在上面的IOU Loss中

  1. 无法对两个不重叠的框进行优化
  2. 无法反映出两个框到底距离有多远。

为了解决这个问题,作者提了GIOU。
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
其中,C表示两个框的最小外接矩阵面积。即先求出两个框的IOU,然后求出外接矩阵C的面积,减去A与B的面积。最终得到GIOU的值。
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
GIOU具有以下的性质:

  1. GIOU可以作为一种衡量距离的方式
    交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
  2. GIOU具有尺度不变性
  3. GIOU是IOU的下限,GIOU(A,B)≤IOU(A,B)
  4. 当矩形框A、B类似时,
    交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
  5. 当矩形框A、B重叠时,GIOU(A,B)=IOU(A,B) 当矩形框A、B不相交时,GIOU(A,B)=−1

总的来说,GIOU包含了IOU所有的优点,同时克服了IOU的不足

DIOU和CIOU

DIOU和CIOU是天津大学于2019年提出的《Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression》。为了解决GIOU收敛慢和提高回归精度,提出DIOU来加速收敛。同时考虑到框回归的3个几何因素(重叠区域,中心点距离,宽高比),基于DIOU,再次提出CIOU,进一步提高收敛速度和回归精度。另外,可以将DIOU结合NMS组成DIOU-NMS,来对预测框进行后处理

GIOU收敛慢的原因:
当出现下图的情况(GT框完全包含预测框)时,IOU与GIOU的值相同,此时GIOU会退化成IOU,无法区分其相对位置关系。同时由于严重依赖于IOU项,GIOU会致使收敛慢。
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
基于上述问题,作者提出两个问题:

  1. 直接最小化预测框与目标框之间的归一化距离是否可行,以达到更快的收敛速度。
  2. 如何使回归在与目标框有重叠甚至包含时更准确、更快

好的目标框回归损失应该考虑三个重要的几何因素:重叠面积,中心点距离,长宽比

基于问题一,作者提出了DIoU Loss,相对于GIoU Loss收敛速度更快,该Loss考虑了重叠面积和中心点距离,但没有考虑到长宽比;
基于问题二,作者提出了CIoU Loss,其收敛的精度更高,以上三个因素都考虑到了。

首先,定义一下基于IOU Loss的损失函数:
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
R(B,Bgt) 表示预测框与GT框的惩罚项。
在IOU Loss中,R(B,Bgt)=0
在GIOU中:
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
而在DIOU中,该惩罚项
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
其中b和bgt表示预测框与GT框的中心点,ρ()表示欧式距离,c表示预测框B与GT框Bgt的最小外接矩阵的对角线距离,如下图所示。
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
因此,LossDIOU定义为:
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
所以,LossDIOU具有如下性质:

  1. DIOU依然具有尺度不变性;
  2. DIOU直接最小化两个框的距离,因此收敛会更快;
  3. 对于目标框包裹预测框的这种情况,DIoU Loss可以收敛的很快,而GIoU Loss此时退化为IoU Loss收敛速度较慢

DIOU同时考虑了重叠面积和中心点之间的距离,但是没有考虑到宽高比。进一步提出了CIOU,同时考虑了这3个因素,在DIOU的惩罚项中加入了αυ:
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
其中,α表示trade-off参数,υ表示宽高比一致性参数。
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
这里的υ为什么会有4/π^2呢?这里arctan的范围是[0,π/2)。
所以,CIOU的损失函数为:
交叉熵、Focal loss、L1,L2,smooth L1损失函数、IOU Loss、GIOU、DIOU和CIOU
而在实际操作中,w^2+ h^2 是很小的数字,在后向传播时,容易造成梯度爆炸。通常用1来代替w^2+ h^2 。

另外,提醒一点的是,GIOU、CIOU、DIOU都是衡量方式,在使用时可以代替IOU。但是这里需要考虑的一个问题是,预测框与GT框的匹配规则问题。并不是说anchor一定会去匹配一个不重叠的GT框。类似于SSD中所说,anchor会选择一个重叠最大的GT框进行预测,而这个重叠最大可以使用IOU、GIOU、CIOU、DIOU来进行衡量。

参考文章:

  1. 深度学习之损失函数小结
  2. 目标检测回归损失函数简介:SmoothL1/IoU/GIoU/DIoU/CIoU Loss
  3. IoU、GIoU、DIoU损失函数的那点事儿
  4. AAAI 2020 | DIoU 和 CIoU:IoU 在目标检测中的正确打开方式