Focal Loss论文学习(含多分类任务下的focal loss公式)

Focal Loss for Dense Object Detection

Focal loss是17年由Facebook AI研究院提出发表的。目标检测深度学习的模型结构主流的以两种为主,one-stage和two-stage。由于one-stage的定位和类别预测有同一个网络输出,虽然速度上比two-stage的快,但精确度却由很大差距。Focal Loss的提出就是通过改变模型损失函数从而改变不同难易程度的样本对模型产生的贡献,改善one-stage的固有缺陷。

论文地址:https://arxiv.org/abs/1708.02002

文章研究指出,one-stage的精确度低的问题主要是由于类别失衡造成的,其在产生anchors时大量的简单负样本产生的loss淹没了梯度,而少量困难样本对模型的贡献很低,最终的性能会下降。而为了印证这一问题,文章实验使用的数据集也是目标在图中占比较小的coco数据集。

1.one-stage的样本不平衡问题

首先应该明白文章中所指出的简单负样本和困难正样本的定义,RPN的提出致使如今大部分模型都会使用anchors作为检测过程中的重要目标区域定位手段,在网格中每一个点都会产生anchors,产生的全部anchors数量巨大,而目标在图片中的尺寸较小, 就会产生一个问题,就是有用的正样本(即含有目标区域的anchors)很少,而无用的负样本(即只有背景信息的anchors)很多。文中认为那些只含有背景信息的样本时简单负样本。如下图所示,

Focal Loss论文学习(含多分类任务下的focal loss公式)_第1张图片

图中红色的anchors代表困难正样本,蓝色代表简单负样本

2.解决办法

为平衡不同样本对模型的贡献,文中提出了改进的交叉熵损失函数(cross-entropy, CE),即焦点损失函数(Focal Loss, Fl)。二分类任务的交叉熵损失函数公式如下:

p是类别预测概率,取值在0-1之间,y是标签值为+1或者-1

二分类任务的Focal Loss公式如下:

其中γ的取值需要经过实验测试得到性能最好的值。

Focal Loss在交叉熵函数的前面增加了前置项,由于1-p的值在0-1之间,所以整体的loss值变小,但由于不同难易程度的样本其p值相差较大,导致其对模型的贡献的改变也产生较大变化。不同γ取值的情况下不同难易程度的样本对模型的贡献如下图所示,其中γ=0即focal loss就是交叉熵函数。

Focal Loss论文学习(含多分类任务下的focal loss公式)_第2张图片

图中纵轴是损失,横轴是在真值(即真实标签)区域下的anchors模型预测的概率值

文中认为,其预测值与真值(标签值)比较接近的就是简单负样本,即在真值区域的anchors模型预测概率高的那些anchors样本。

可以从如中明显地看出,γ取值越高简单负样本对模型产生的贡献越低,并且Focal Loss认为是简单负样本的那些ahcors越多。通过增加的前置项,损失函数可以因为减少大量简单负样本对模型的贡献,从而间接地增强少量困难正样本对模型的贡献,最终提高模型的整体性能。

最后文中通过自己搭建的RetinaNet加上focal loss做了实验,结果如下:

Focal Loss论文学习(含多分类任务下的focal loss公式)_第3张图片

3.多类别目标检测任务下的focal loss

文章中只给出了二分类任务下的focal loss

而目标检测经常需要对多类别的目标检测任务进行学习,其focal loss公式如下:

 

4.结论

通过文中实验结果发现,focal loss能够很好地解决one-stage的深度学习目标检测模型类别不平衡的问题,那么其对于two-stage的效果如何呢,文中认为例如two-stage典型的模型faster r-cnn模型通过限制前景和背景的anchors数量比(1:3)从而能够很好地避免这个问题。但我认为,在数据集本身由于样本不平衡问题引起模型性能下降的时候,使用focal loss无论对于one-stage或者two-stage的深度学习模型来说都是一个不错的改进trick。

注:文中若有问题请各位帮忙指出,谢谢~

你可能感兴趣的:(深度学习,目标检测)