[目标检测]-常用涨点trick-focal loss 论文理解

论文地址:https://arxiv.org/abs/1708.02002
pytorch复现:https://github.com/kuangliu/pytorch-retinanet

1.论文动机

one-stage方法与two-stage的各自的特点,基于one-stage的方法检测速度快,但是正确率低的问题,作者发现是因为前景、背景类别的极度不平衡所导致导致,于是提出了focal loss来重新设置标准交叉熵损失来解决前景、背景类别不平衡的问题。

简单来说就是我们在训练的过程中。我们会在检测头输出的特征图上生成多个anchors。但是只有少部分anchors包含目标,这被叫做前景,而大多数不包含目标的区域被称为背景。我们知道在object detection领域,一张图像可能生成成千上万的candidate locations,但是其中只有很少一部分是包含object的,这就带来了类别不均衡。那么类别不均衡会带来什么后果呢?

2.样本不均衡导致问题

论文是这样解释的
This imbalance causes two problems:
(1) training is inefficient as most locations are easy nega-tives that contribute no useful learning signal;
(2) en masse,the easy negatives can overwhelm training and lead to de-generate model

首先,大多数的 candidate locations 都是背景,这在训练时就是直接给否定掉,并不会使我们去学习目标的特征,这部分没有任何有用的学习信号。
其次,太多的负样本会增加训练时间,都在学没有用的了,及其浪费训练资源,从而导致模型的退化。

3.focal loss

主要针对以上问题,作者想要解决one stage 类别不均衡问题提出了focal loss改进方法

作者首先引入了 cross entropy loss(交叉熵损失)来逐步介绍focal loss

C E ( p , y ) = { − log ⁡ ( p )  if  y = 1 − log ⁡ ( 1 − p )  otherwise  \mathrm{CE}(p, y)=\left\{\begin{array}{ll}-\log (p) & \text { if } y=1 \\-\log (1-p) & \text { otherwise }\end{array}\right. CE(p,y)={log(p)log(1p) if y=1 otherwise 

因为是二分类,p表示预测样本属于1的概率(范围为0-1),y表示label,y的取值为{+1,-1}。当真实label是1,也就是y=1时,假如某个样本x预测为1这个类的概率p=0.6,那么损失就是-log(0.6),注意这个损失是大于等于0的。如果p=0.9,那么损失就是-log(0.9),所以p=0.6的损失要大于p=0.9的损失,这很容易理解。这里仅仅以二分类为例,多分类分类以此类推。
为了方便,作者定义了pt
p t = { p  if  y = 1 1 − p  otherwise  p_{\mathrm{t}}=\left\{\begin{array}{ll}p & \text { if } y=1 \\1-p & \text { otherwise }\end{array}\right. pt={p1p if y=1 otherwise 
然后就可以写为
C E ( p , y ) = C E ( p t ) = − log ⁡ ( p t ) \mathrm{CE}(p, y)=\mathrm{CE}\left(p_{\mathrm{t}}\right)=-\log \left(p_{\mathrm{t}}\right) CE(p,y)=CE(pt)=log(pt)
接下来是一个基本改进也就是本文对比的baseline
思路就是,既然你负样本多,那我认为给你降权重,正样本少,那我给你加权重。
这样正负样本对整体loss的共享就不同了。驱使loss更加关注数量少的正样本,如下所示。

C E ( p t ) = − α t log ⁡ ( p t ) \mathrm{CE}\left(p_{\mathrm{t}}\right)=-\alpha_{\mathrm{t}} \log \left(p_{\mathrm{t}}\right) CE(pt)=αtlog(pt)
这样做虽然可以控制正负样本的权重,但是有一个问题,那我的正样本里是不是也会有难分类的,也会有易于分类的。假设有个目标。我每次都预测他的准确率为0.99,而另一个目标我每次都预测它为0.3,我是不是更应该去关注这些难分类的项?易于分类的项稍微学一下就好了。于是就有了focal loss,如下定义:
F L ( p t ) = − ( 1 − p t ) γ log ⁡ ( p t ) \mathrm{FL}\left(p_{\mathrm{t}}\right)=-\left(1-p_{\mathrm{t}}\right)^{\gamma} \log \left(p_{\mathrm{t}}\right) FL(pt)=(1pt)γlog(pt)
调节因子 (1−pt)^γ
γ称作focusing parameter,γ>=0,γ∈[0,5]
目的是通过减少易分类样本的权重,从而使得模型在训练时更专注于难分类的样本。

绘制图看如下,横坐标是pt,纵坐标是loss。CE(pt)表示标准的交叉熵公式,FL(pt)表示focal loss中用到的改进的交叉熵。Figure1中γ=0的蓝色曲线就是标准的交叉熵损失。
在这里插入图片描述
下面是focal loss的两个重要性质

  • 当一个实例被错误分类和 pt 很小时,调节因子接近1,损失不受到影响,当 pt趋向于1 ,调节因子接近0,易于分类例子的损失会降低权重。
  • 关注因子 γ 慢慢调节比例使得易分例子会降低权重。当调节因子为0时,就相当于CE损失,随着 γ增加,调节因子的影响同样也会增加,并且作者发现 γ=2时,能得到最好的实验结果。调节因子会减少易分例子对损失的贡献,并且会将那些获得低loss的例子使得与CE损失之间的值会相差非常的大(不同 γ ,比如γ =2, pt =0.9,使用Focal loss会比CE loss 小100倍,当 pt = 0.968 时,值差到1000倍),大大减小易分例子对损失的影响。

作者在实验中最终使用了
F L ( p t ) = − α t ( 1 − p t ) γ log ⁡ ( p t ) F L\left(p_{t}\right)=-\alpha_{t}\left(1-p_{t}\right)^{\gamma} \log \left(p_{t}\right) FL(pt)=αt(1pt)γlog(pt)
在实验中a的选择范围也很广,一般而言当γ增加的时候,a需要减小一点 (实验中γ=2,a=0.25的效果最好)

不同 a、γ 设置对精度影响实验。
在这里插入图片描述

4.补充

该文章还提出了一个网络结构并用fl达到了当时的soft水平。不过不是该文章的重点,这里不展开说了,有兴趣的同学可以自己看论文。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值