[重读经典论文] RetinaNet——Focal Loss for Dense Object Detection
1. 前言
这篇论文也是何凯明的团队在2017年的论文《Focal Loss for Dense Object Detection》中提出的,网络架构魔改了FPN,因此这篇论文的重点是提出了新的分类Loss——Focal Loss,用一个合适的函数,去度量难分类和易分类样本对总的损失函数的贡献。解决了传统交叉熵损失函数因为类别不平衡导致性能下降的问题。RetinaNet是历史上one stage网络性能第一次超过two stage网络。
但是它也存在一些缺点,首先Focal Loss引入了另外两个超参数,针对这两个参数需要谨慎调整,不然反而导致最后的训练结果更不好;然后是容易受噪音影响,由于模型会更偏向于学习难分样本,一旦这些样本标错,将会成指数倍放大误差,导致模型难以拟合。
2. 网络架构
2.1. 主体结构
如上图所示,跟FPN区别的点主要是没有用到C2进行特征融合,然后P6、7是在P5的基础上进行卷积操作得到的。Anchor方面,每个特征层选了3个Scale和3个Ratios,也就是9个Anchor,如图右下所示。
2.2. 预测头
跟Faster-Rcnn有点类似,不同的是每个最后的特征层的预测头的权值是共享的,如图右上所示,上面的分支预测分类,输出W*H*KA的结果,K代表检测目标类别个数(不包括背景),下面的分支预测坐标,输出W*H*4A,4代表预测的(xywh),A表示Anchor个数。
2.3. Loss
正负样本匹配:
- IoU >=0.5,正样本。
- IoU < 0.4,负样本。
- IoU ∈[0.4,0.5),舍弃。
其中IOU指ground truth与anchor box之间的IoU。
总体Loss:
分类误差采用Focal Loss,算正负样本的损失,回归损失只计算所有正样本的损失。
3. Focal Loss
3.1. one stage检测算法中的样本不平衡问题
如上图所示,是在图片上画完anchor后,通过正负样本匹配得到的结果,其中黄色的是正样本,红色的是负样本,可以看到负样本远比正样本要多。实际上,在现实中比例更夸张,一般一张图的正样本个数只有十几到几十个,但是负样本则大概在10^4到10^5,这些负样本基本都是简单易分的,对训练网络起不到什么作用,但是会淹没少量但是有助于训练的样本。
3.2. 普通CE损失
对于二分类的交叉熵损失公式为:
其中y是标签{-1,+1},p是预测为正样本的概率。
统一一下p:
则CE可以重写为下式:
3.3. Balanced BE
为了平衡样本不均衡,一个做法是引入权重因子α∈ [0, 1] ,当样本为f正的时候是α,样本为负的时候是1 − α,如下面的式子所示:
这里的α并不是正负样本的比例,而仅仅是一个超参数。作者用这个Loss进行了消融实验,结果如下图:
3.4. Focal Loss 定义
上面提到加权重后的CE Loss,但是α仅仅只能平衡正负样本,并不能够区分容易和难分的样本。论文的目标是降低易分样本的重要性,集中训练难分样本。因此,作者引入了另外一个调节因子,即。得到Focal Loss的公式如下:
如下图所示,通过调节γ,可以得到不同的曲线,γ越大,pt ∈ [0.6,1]这个区间的loss越小,让好分类的样本得到的loss更小。当然γ并不是越大越好,如γ=5,可以看到pt=0.4之后的loss都已经接近0了,因此需要实验选取合适的参数,文中选的是γ=2。
最终版Focal Loss,作者又把平衡因子α加了进去:
最后,作者通过消融实验确定α,γ最好的组合,入如下表所示:
可以看到这两个超参也是需要谨慎调节的,不然可能不会得到期望的提升,而当时Focal Loss也存在争议,如在YOLOv3 SPP 中,使用了Focal Loss之后,性能反而下降了。
4. 参考
(完)