原文链接:https://www.yuque.com/yahei/hey-yahei/objects_detection#zoJwH
损失函数
目标检测中最经典的损失函数就是Faster RCNN所用的“softmax交叉熵分类损失 + SmoothL1回归损失”的形式,后来有很多改进的目标检测网络、方案也陆续提出了一些损失函数上的改进。
分类损失
参考:
- 《目标检测小tricks--样本不均衡处理 | 知乎, 燕小花》
- 《样本贡献不均:Focal Loss和 Gradient Harmonizing Mechanism | 知乎, BeyondTheData》
- 《Imbalance Problems in Object Detection: A Review (IEEE-PAMI2020)》
分类损失的改进主要是解决目标检测中样本不均衡的问题,通常是给难易样本设置一个自适应的权重损失。
Focal Loss
论文:《Focal Loss for Dense Object Detection (ICCV2017)》RetinaNet
作者设计了一个自适应加权的loss,为难样例设置更大的权重,从而提升训练效果。
首先考虑一个二分类的交叉熵(为方便起见,用二分类进行讨论,同理可推广至多分类情况),
其中,,而是预测为的概率
加入一个人工设置的权重,缓解样本不均衡的问题,
引入一个自适应的权重,为难样例设置更大的权重,
是人为设置的超参
- 越大,难/易样例权重差异就越大
- 当时,Focal Loss退化为Cross Entropy
- 在论文的实验中,时表现最佳
权重会随着正确分类的置信度变化
- 当比较大时,正确分类的置信度高,属于易样例,权重就比较小
- 当比较小时,正确分类的置信度低,属于难样例,权重就比较大
实际操作中,Focal Loss可以结合人工设置的一起使用,即
Focal Loss有两个超参和需要设置,之后一些新的分类损失则进一步简化了形式,提出一些不需要设置额外超参的loss。
Class-Balanced Loss
论文:《Class-Balanced Loss Based on Effective Number of Samples (CVPR2019)》 参考译文
论文提出用样本数量来调节为已有的损失函数加权,以此来缓解样本不均衡问题,应用在Focal Loss上则为
其中,
是一个超参;
是训练集上类别的样本数;
当越大,越小,权重越小,也即样本数量越多,那么他对损失的贡献就越小
AP Loss
论文:《Towards Accurate One-Stage Object Detection With AP-Loss (CVPR2019)》
参考:《感知算法论文(九):Towards Accurate One-Stage Object Detection with AP-Loss | CSDN, 呆呆的猫》
Average Precision Loss(AP Loss)对每个预测框进行排序,用排序后的序号来设计loss,核心思想在于鼓励正样本预测框的得分在负样本得分序列中尽可能靠前。启发自AUC Loss,后者用AUC的排序序号来设计loss,直接对AUC进行优化,而目标检测通常以mAP为指标,因此作者指出直接对AP进行优化能有更好的效果。
Bounding Box的设置方式跟传统的设置方式有些不同。比如有个分类,
- 传统上是为每个Bounding Box预测一个分类(,0表示背景)以及得分向量
- 论文则是把Bounding Box复制次,分别用于某一个分类(-1表示忽略,不纳入AP Loss的计算)的预测,以及得分
(左:一个label,属于分类k; 右:K个label,第k个为1)
AP Loss的具体设计(与GTBox的IoU超过阈值为正样本,否则为负样本):
- 所有预测框两两之间的得分差值
- 计算每个预测框的归一化排序(在所有预测框中的排序)
其中,是得分大于等于的所有预测框数量(包括正负样本);
显然,就是第个预测框在所有预测框中的排序序号,而就是第个预测框的得分在所有负样本框中的一个排位(归一化的序号,序号越小则得分越高);
也可以展开成关于的数学描述,
其中,为阶跃函数, - 计算AP Loss
其中,是正样本预测框的数量;也可以写成, - 显然是不可导,所以需要定义近似的更新规则
是真实值。
当时,,因为我们目标是让正样本预测框的得分比所有负样本预测框都高;
当时,,因为它不对AP Loss产生贡献;
因此,可以简化成
相比于Focal Loss有比较明显的提升,而且不需要调整任何超参:
(在RetinaNet上使用不同分类损失的实验结果)
GHM-C Loss
论文:《Gradient Harmonized Single-stage Detector (AAAI2019)》GHM-C和GHM-R
Gradient Harmonized Mechanism(GHM)通过利用计算损失前的特征的梯度信息,对原损失进行规范化操作。包括针对分类损失改进的GHM-C和针对回归损失改进的GHM-R。该损失只有一个超参。
考虑某一分类的交叉熵
其中,那么(注意这里的对数是自然对数),
记梯度的绝对值为;
显然,,越大,那么这个样例就越hard;
如上图所示,对于一个收敛的检测网络,
- 有巨量的easy负样例(以至于需要用对数坐标轴来绘制这张图),它们却对全局梯度产生很大的贡献
- 同时还是有不少的very hard样例,这说明还有很多这种hard样例并没有学好
- 如果能够让网络聚焦在这些very hard样例的学习上,那么网络会有明显的提升
接下来定义第个样例上的梯度密度,
其中,为一个batch的样例数,是一个宽度,而
直观点理解,
表示在所有样例中,梯度绝对值在附近(范围内)的样例数量;
按照区间宽度对数量进行规范化处理,将具体展开来为
显然,对小梯度和大梯度对应的梯度密度都做了一些抑制处理。
进一步用归一化梯度密度来定义一个梯度密度协变量(gradient density harmonizing parameter),
最后用为不同样例的损失进行加权以平衡难易样例的权重,
如上图所示,CE、FL、GHM-C都可以看作是对梯度分布正则化的过程,将梯度范数调整到一个相对平缓的范围内。FL仅仅抑制了小梯度的样例数量(主要是easy负样例),而GHM-C同时抑制了大梯度的样例数量(very hard样例)。
GHM-C依赖于mini-batch的统计结果,跟BN一样,要求batch-size不能太小,否则统计量不准确将导致训练过程不稳定。
实验结果:似乎比Focal Loss稍微好一点点,但不明显
为了降低梯度密度的计算复杂度,提出了一种近似算法:
- 找到梯度的最大值最小值;
- 将区间等分为个子区间(Unit Region),那么有;
- 记为第个区间中包含的样例数量,那么可以近似求得
- 只要足够大,就能比较好近似原始设计(如论文实验取能得到最佳效果)
- 考虑到算法涉及mini-batch内的统计量,有可能出现某个mini-batch里出现一些极端值导致训练不稳定。为了稳定数值,可以采用指数平滑平均EMA进行处理
- 实验比较(原始设计的训练速度非常慢)
(GHM-C Standard和GHM-C RU分别表示原始设计和近似设计)
回归损失
参考:
原始的回归损失是直接利用L1、L2或SmoothL1对坐标值/尺度进行数值回归,GHM-R是GHM在提出GHM-C分类损失的同时,采取类似的处理的一种改进思路;后来出现了直接用IoU来设计回归损失,再后来回归损失的改进都是对框回归好坏的指标改进,先后出现了GIoU、DIoU等对IoU的改进方案,从而衍生出对应的回归损失。
GHM-R Loss
论文:《Gradient Harmonized Single-stage Detector (AAAI2019)》GHM-C和GHM-R
沿用GHM-C Loss的思路设计新的回归损失函数,直觉告诉我们可以这样做:
其中,
为SmoothL1损失函数;
而关于的含义可以参见Faster RCNN的预测框修正一节,为方便进一步解释,记。
接下来考虑的合理性,
而
其中,是认为设置的超参。
那么
由于GHM-R依赖梯度信息来计算Loss,所以要求不同样例的梯度能有一定的区分度。
但这里的,于是作者设计了另一种与SmoothL1有类似效果的损失:
那么,记,则
实验结果:SL和ASL效果相近,GHM-R则有少量提升
IoU Loss
论文:《UnitBox: An Advanced Object Detection Network (ACM-MM2016)》
早前的L1、L2、SmoothL1损失都只把每个(规范化的)坐标值/尺度当作独立的变量训练,没有考虑它们内在的联系,因此提出用IoU的交叉熵来设计损失。
IoU Loss在设计损失时为(规范化的)坐标值/尺度建立了联系,可以直接反映预测框的检测效果,同时IoU对尺度也不敏感。
但是,GIoU的论文也指出了IoU的一些缺点,
- 对于不与真实框重叠的预测框,,此时损失为零,对网络的学习过程没有贡献
- 在某些情况下(尤其是允许预测框旋转的情况下),IoU指标似乎不够合理。如下图所示,三组的IoU是相等的,但直观上判断回归的效果是:左 > 中 > 右
GIoU Loss
论文:《Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression (CVPR2019)》
- 其中,是两个框之间的最小闭包框面积(也即能同时包含两个框的最小框面积);
最小闭包框面积的计算过程与IoU类似,
与的差别无非是把和翻了过来 - 当时,表明两个框不重叠,且越小,两框的距离越远,时表明相距无穷远
- 当时,表明两个框重叠,且越大,两框的重合程度越好,表明完全重合
- 解决了无法度量距离的问题
- 依旧对具体的坐标值/尺度不敏感
不足之处在于,
- 在考虑不重叠的情况时,只度量了距离却忽视了框的尺度
- 当两框恰好处于水平或垂直方向是,有可能几乎退化成
(它们的GIoU Loss相同,但显然第三种情况回归地更好)
DIoU Loss & CIoU Loss
论文:《Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression (AAAI2020)》
其中,
- 和分别是预测框和真实框的中心点,度量了两点之间的欧式距离;
- 是预测框和真实框的最小闭包框的对角线距离
- DIoU跟GIoU一样,能在两框不重叠时为训练提供方向
- DIoU在两框不重叠时既考虑了距离,也考虑了尺度
- 在两框处于水平或垂直方向上时,DIoU依旧能为训练网络做出不错的贡献
- DIoU直接最小化两框的距离,拥有更加平滑的损失曲面,因此收敛比GIoU更快
在DIoU Loss的基础上,论文继续引入长宽比的惩罚得到CIoU Loss:
其中,
度量了两框的长宽比差异,完全相等时;
是一个自适应的调节权重,目的是为了突出的回归,当比较小甚至时,应当优先学习如何回归出能够重叠、重叠的比较好的预测框,而不是学习如何调整长宽比。
Yolo-v3在VOC2007上的实验结果:
(表示用DIoU来做NMS)