RetinaNet:Focal Loss for Dense Object Detection

基于 FPN 的多 head 检测器,最大的创新是提出 focal loss 动态平衡目标检测中正样本少数,负样本大多数的情况

什么是 RetinaNet?

  • 一个常见的基于 FPN 的多 head 检测器,最大的创新是提出 focal loss 动态平衡目标检测中正样本少数,负样本大多数的情况

RetinaNet 的网络结构?

  • Backbone:ResNet
  • Neck:FPN,并输出5个分支,用于预测不同尺度的目标
  • Head:每个head分为2个分支,其中一个分支输出KA个通道(K表示类别数,A表示Anchor数量),另一个输出4A个通道(表示框的预测值),注意这里的K不包括背景

RetinaNet的先验框设置?

  • RetinaNet 使用 5 个分支预测目标,相对于原图的 stride 分别[32, 64, 128, 256, 512],使用 3 个 scale,3 个 ratios 为每个分支生成 9 种 anchor size,其中 scale 指 anchor 的大小(上图 Scale 每行计算后结果),ratio 为 anchor 的宽高比 (上图 Ratios)
  • 根据 stride 可知,越高的层其 Anchor 越大,预测的目标也越大,RetinaNet 预测的目标大小范围[32, 813]

RetinaNet 如何进行标签匹配?

  • 匹配要求: 每个 gt box 都一定有至少一个 anchor 匹配
  • 匹配规则: (1)先验框与所有的 gt 的最大 IOU 小于 0.4,则该 anchor 是负样本;(2)先验框与所有的 gt 的最大 IOU 大于等于 0.5,则该 anchor 是正样本;(3)未确保每个 gt 均有预测,取与其最大 IOU 的先验框为正样本,即使该 IOU 小于 0.4

RetinaNet的损失函数?

  • 分类损失: 分类损失使 Focal loss
  • 回归损失: 回归损失使平滑绝对值损失 (Smooth L1 Loss)

什么是Focal loss?

  • 基交叉熵损失提出的一种损失函数,该函数的主要思想是:易分样本(预测概率大于0.5的样本)给于更小的损失,难分样本的损失占比相对更多。如上图的蓝色线是原始交叉熵,其0.5预测概率的样本损失更大,使用Focal loss后其损失变小
  • Focal loss 定义为,其中 pp 是预测的概率,γ\gamma 是人工定义的参数,越大对易分样本损失减少越多

    FL={(1p)γlog(p), if y=1pγlog(1p), if y=0F L=\left\{\begin{array}{ll} -(1-p)^{\gamma} \log (p), & \text { if } & y=1 \\ - p^{\gamma} \log (1-p), & \text { if } & y=0 \end{array}\right.

  • γ=0\gamma=0 时,退化为标准的交叉熵损失;当 γ=2\gamma=2 时,可以看出以原始交叉熵计算容易、难分样本损失比为1:1,经过 focal loss 加权后其比值变为1:16,难分样本的损失占比上升

    CE(0.9)=log(0.9)CE(0.6)=log(0.6)FL(0.9)=(0.1)2log(0.9)FL(0.6)=(0.4)2log(0.6)\begin{array}{c}CE(0.9)=-log(0.9) \\ CE(0.6)=-log(0.6) \\ FL(0.9)=-(0.1)^2log(0.9)\\ FL(0.6)=-(0.4)^2log(0.6)\end{array}

  • 实践中常使用带 α>0.5\alpha>0.5 的 Focal loss,可见在训练过程关注对象的排序为正难 > 负难 > 正易 > 负易

    FL={α(1p)γlog(p), if y=1(1α)pγlog(1p), if y=0F L=\left\{\begin{array}{rll} -\alpha(1-p)^{\gamma} \log (p), & \text { if } & y=1 \\ -(1-\alpha) p^{\gamma} \log (1-p), & \text { if } & y=0 \end{array}\right.

Focal loss为什么能帮助one-stage的目标检测任务?

  • two stage: R-CNN 类似的检测器之所以能解决类别不平衡问题,是因为两阶段级联结构和启发式采样。提取 proposal 阶段(选择性搜索(SelectiveSearch,SS)、RPN)很快的将候选对象位置的数量缩小到一个小数目(1-2k),过滤掉大多数背景样本(其实就是筛选 anchor 数量);在第二个分类阶段,执行启发式采样,例如固定的前景背景比(1:3),或在线难样本挖掘(OHEM),以保持前景和背景之间的平衡
  • one-stage: 相比之下,单级检测器必须处理在图像中定期采样的一组更大的候选对象位置。因为 one-stage 只有一个阶段,产生的候选框相比 two-stage 要多太多。通常需要大约 100K 个位置(例如 SSD的 8700+个位置),且这里面正样本几个十几个,少之又少。即使你抽样了,最后在训练过程中,整个过程还是被大量容易区分的负样本,也就是背景所主导
  • 少样正样本提供的关键信息却不能在一般所用的 training loss中发挥正常作用,从而无法得出一个能对模型训练提供正确指导的 loss,常用的解决此问题的方法就难负例挖掘(hard negative mining),或其它更复杂的用于过滤负样本从而使正负样本数维持一定比率的样本取样方法。该论文中提出了 Focal Loss来对最终的 Loss 进行校正

什么是正样本、负样本、易分样本、难分样本?

  • 正样本: 与真值对应的目标类别来说该样本为正样本
  • 负样本: 与真值不对应的其他所有目标类别来说该样本为负样本
  • 简单样本: 预测时与真值标签误差较小的样本,如预测概率在0.5附近的样本
  • 困难样本: 预测时与真值标签误差较大的样本,如预测概率在靠近0或靠近1的样本

难分负样本挖掘与 Focal loss 的异同?

  • 相同:两个方法都是放大难分样本的损失占比,实现网络的进一步学习
  • 差异:难负例挖掘根据最后损失对损失采样,并选择损失大的负样本(负难);Focal loss 仍然使用全部样本,但是通过使用预测打分动态加权损失,达到提升难例损失占比的作用(不区分正难和负难,同时提升)

通过平衡因子控制正负样本权重和Focal loss的区别?

  • 通过 α\alpha静态加权交叉熵,属于类别加权

    CE={αlog(p), if y=1(1α)log(1p), if y=0C E=\left\{\begin{array}{ll} -\alpha \log (p), & \text { if } & y=1 \\ -(1-\alpha) \log (1-p), & \text { if } & y=0 \end{array}\right.

  • 通过 γ\gamma 根据预测概率动态加权难分样本,属于样本加权

    FL={(1p)γlog(p), if y=1pγlog(1p), if y=0F L=\left\{\begin{array}{ll} -(1-p)^{\gamma} \log (p), & \text { if } & y=1 \\ - p^{\gamma} \log (1-p), & \text { if } & y=0 \end{array}\right.

  • 两者针对的样本类型不同,实际使用时,常常将两者合并在一起使用,在 α>0.5,γ>1\alpha>0.5,\gamma>1 的情况下实现以下关注顺序:正难 > 负难 > 正易 > 负易

    FL={α(1p)γlog(p), if y=1(1α)pγlog(1p), if y=0F L=\left\{\begin{array}{ll} -\alpha(1-p)^{\gamma} \log (p), & \text { if } & y=1 \\ -(1-\alpha) p^{\gamma} \log (1-p), & \text { if } & y=0 \end{array}\right.