论文笔记:Focal Loss for Dense Object
中心思想
- 研究为何单阶段检测(密集型方法)在性能上不及双阶段检测(稀疏型方法)。查出:根本原因是分类分支中前景与背景的比例严重失衡。
- 针对这一问题的解决方案是:从损失函数入手提出了一种称为 focal loss的新损失函数;该损失函数通过调整损失较低样本(能够较好地区分前景与背景)的权重来优化模型训练过程。
- 为了验证所提出的 focal loss的有效性而开发了基于该损失函数的 retinanet模型。
Class Imbalance Problem:
对于两阶段方法而言,在此问题上可以获得有效的缓解原因在于:首先,在RPN中识别出多个区域兴趣点(ROI),这些ROI相对于整个图像中的锚框而言较为稀疏(仅约1-2千个),从而去除了大部分背景样本;其次,在这种设计下所选取的ROI通常集中于目标周围区域;最后,在正负样本比例上实现了较为均衡的状态(可依据启发式策略维持1:3的比例关系;或采用难度平衡损失函数进行选择)。
- One-stage方法在执行分类任务时无法利用RPN进行筛选(原因在于分类操作位于回归操作之前)。
- 一般需要从约10万张锚框中进行图像分类训练。
具体而言:
输出特征图中的大部分样本属于背景区域,在这种区域中可以轻易实现类别划分。
即标记为"易混淆样本"或"易区分样本"。
这些"易混淆样本"或"易区分样本"提供的信息量较少。
从整体效果来看,
这些"易混淆样本"或"易区分样本"对模型的整体性能提升作用并不显著。
为了避免这种情况的发生,
在实际训练过程中通常采用在线难样本挖掘策略(如OHEM算法),
通过筛选训练集中损失值较大的负类样本来提高模型性能。
- 然而,在实际应用中除了引入OHEM或其他手工设定的参数来平衡正负样本类别外,
- 针对这一问题提出一种更为有效的解决方案:Focal Loss
Focal Loss
核心作用:用于解决正负样本极度不均衡的问题(e.g. 1:1000)
观察binary cross-entropy损失函数曲线的表现后可以看出 即使模型预测样本的概率值p超过0.5 仍然会导致较大的损失值 值得特别关注的情况
当存在多个满足条件p>0.5且(easy\ negative)的情况时,在这些项的小损失累加后(即总损失),它们将主导整个结果
一个常用的方法是引入一个系数\alpha_t来调节损失函数:CE(p_t) = -\alpha_t \log(p_t), 其中\alpha \in [0,1]。具体而言, 对于正样本类别而言, \alpha取值即为\alpha, 而对于负样本类别则取值为1-\alpha, 以此实现对正、负类别损失程度的平衡。
然而这种Loss仅关注于正负样本,并未涉及难度样本。一种直观的方法是在此基础之上增加一项与难度相关的因素:FL(pt)=−(1−pt)^γ log(pt),其中当ptp_t分数很高时(即为easy sample),给予较低权重;反之,则给予较高权重。其中γ\gamma为调节参数。
在实践中观察到:当γ值设定为2(\gamma=2)时表现出较好的性能,在这种情况下(当pt值设定为 p_t= ),损失值较之前降低了约一个数量级;然而,在 pt 值小于等于 p_t \leq 的情况下(即 pt ≤ ),损失仅降低了约四分之一。(值得注意的是,在实际应用中由于基数差异可能导致倍数变化并不能完全反映难度差异的程度)
不同的γ\gamma的曲线如下图所示:

在实践中会引入一个平衡系数\alpha以便避免Loss过于微小:FL(p_t)= -\alpha^t (1-p_t)^{\gamma} \log(p_t)(这里的\alpha可以认为\gamma已经缓解了类别不均衡的问题因此无需取过大)
实际上Focal Loss的具体形式不重要
Focal Loss在多分类下的应用
- 上文中所提及的ptp_t本质上是由sigmoid函数计算得出的结果。
在二分类问题中,两个类别的得分之和具有互斥性,并且其总和等于 。
因此可以通过计算 ,从而获得相应的结果。
进而可将交叉熵损失函数表示为 CE(p)= y·ln p + ( )·ln ( )
RetinaNet 检测器
整体
- 该系统基于复用FPN多尺度结构搭建了一个骨干网络,并结合两个特定子网络实现回归与分类功能。
- FPN采用p3至p7特征层进行融合操作,并将融合范围明确为1/8至1/128的比例。
- 整体框架如下图所示:
Anchor
- 锚框(anchor)的定义方式仍然沿用Faster RCNN中基于尺寸与比率组合的方式,在每一层中设置尺寸为\{20, 21/3, 22/3\}乘以scale\{2^0, 2^{1/3}, 2^{2/3}\}的结果再乘以scale倍;比率设定为\{[1:2], [1:1], [2:1]\};总共有9个锚框。
- GT与锚框匹配的方式仍遵循FPN架构,在iou值大于等于0.5的情况下标记为正样本(即iou在[0.5, inf]区间),iou值小于0.5且大于等于0的情况下标记为负样本(即iou在[0, 0.4]区间),其余情况标记为忽略样本。
- 回归计算仅限于与GT匹配成功的锚框范围,在其他情况下跳过计算。
- 每个锚框将使用K个one-hot标签来表示其类别信息。
分类子网络(分支)
- 经过连续四个3x3卷积层后,在不改变feature map channel数量的前提下(即维持了feature map的channel数量恒定于256),输出尺寸为H×W×(A×K)的特征图得以生成。
- 相较于RPN架构,该网络采用了更深的设计,并且仅包含3x3尺寸的卷积操作。
- 回归与分类任务所涉及的卷积层均未共享参数。
分类子网络(分支)
经过四个连续的3x3卷积层处理后,在保证了feature map在channel维度上保持256不变的前提下,
输出尺寸为H×W×(A×4)大小的特征图。
这里采用了不依赖类别标签的回归方式,
即无论单个锚框对应多少类别标签,在预测结果中仅输出对应的边界框坐标。
预测时:
- 对图像进行一次完整的网络前向传播操作后,获取每层输出的特征图信息
- 为提升计算效率,首先在每个尺度的特征图中筛选出得分高于等于阈值0.05的区域,随后选取每张特征图中最优的1000个候选框
- 将来自各个尺度的所有候选框进行整合,并应用非最大值抑制(NMS)处理,设置iou=0.5的标准以去除重叠度过高的框,最终获得预测结果集
训练时:
- Focal Loss是应用于所有的anchor,也就是所有的分类样本都参与Focal Loss,而与SSD OHEM只取一小部分的样本算Loss不同,是一种真正的dense approach。最终的Focal Loss是所有的anchor(~100k, 输入1024x1024, 1/8到1/128尺度都有9个anchor,(128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8) * 9 = 196416),但Loss除的是正样本的数量:因为大部分的样本都是easy negatives,只产生非常小的loss,如果将这些Loss的算进去的话,会导致Loss偏小
- 初始化:
- pretrain resnet50 or resnet101 backbone
- 其余的layer初始化:除了分类分支的最后一层以外,其他的weight都是σ=0.01\sigma = 0.01的高斯分布,bias都是0
- 分类分支的最后一层:bias b=−log((1−π)/π)b = -\log((1-\pi)/\pi),也就是说每个anchor被标注为正样本的置信度是π\pi(作者发现哪怕不用Focal Loss,这样设置一个人工值,哪怕用普通的CE Loss,也能收敛,否则是不收敛的)
- 训练过程采用的是sync SGD
Focal Loss的可视化:

选择性能较为优秀的模型,并对其进行训练得到后,在其中随机抽取大量图片用于后续实验。
随后从该模型中随机抽取大量图片中筛选出约1\times 10^5至约3\times 10^5数量范围内的正样本和负样本,并分别计算每个类别下的Focal Loss损失值。
将所有损失值按从小到大的顺序排列,并通过累加和归一化的方式生成上图中的两条曲线。
总体而言:
对于正样本类别而言:
当难度系数超过一定阈值时(即难度系数>0.8),对应的损失值主要集中在约40%至60%的范围内。
而对于负样本类别而言:
在使用Focal Loss损失函数的情况下,
使用Focal Loss损失函数的情况下,
使用Focal Loss损失函数的情况下,
使用Focal Loss损失函数的情况下,
