Focal loss & RetinaNet

物体检测算法主要分俩流派:1)R-CNN 族为代表的 two-stage ;2)YOLO 开坑的 one-stage。目前来说,two-stage 更加精准,但牺牲了速度。而 one-stage 以 real-time 闻名遐迩,但是精度有所不及。根本原因有两点:

  1. positive example 与 negative example 的极度不平衡
  2. hard example 与 easy example 的不平衡

上述两点问题的产生原因不难理解:a)一张图片有 object 的地方就那么多,绝大部分区域都是背景。所以导致分出来的 negative example 数量远多于 postive example。进而导致 postive example 的 loss 被大量的 negative example 所 “掩盖”。b)hard example 一般认为是前景与背景的过渡区域。剩下的就是 easy example 了。这就同样产生了数量不均衡问题,导致模型在 easy example 上过早收敛。但对 hard example 的拟合效果不如人意。针对此问题,当前的解决方法一般为 hard negative miningcode imple,此处不再展开

example types

two stage 为啥没有这俩样本不平衡问题?以 Faster RCNN 为例:

1)根据 IoU 采样候选区域,并将正负样本的比例设置成1:3。这样就避免了正负样本过度失衡;2)根据 score 过滤掉 easy example,避免了 hard example 与 easy example 的过度失衡。

FAIR 的大佬们通过优化 loss 的优化方式使 one stage 可以达到 two stage 一样的精度,也就是提出了 Focal loss。

公式。其中 α 和 γ 是手动调整超参。γ ∈ [0, 5]

CE 公式如下:


为了解决正负样本不平衡问题,即提出了平衡交叉熵。原理通俗易懂,即为正负样本赋予不同的权重。当 y = 1 时取 α,y = -1 时取 1 – α。α∈ [0, 1] 。故平衡交叉熵如下:

经实验验证,α取 0.25 效果最佳

为了解决hard/easy example 问题。作者引入了参数 γ

CE 即交叉熵, FL 即 focal loss。γ =0 时即退化为 CE。FL 实际上是 CE 的升级版。γ的值也可以根据验证集来调整,论文中给出的值是2。

可以看出对于一些 well-classified examples (easy examples) 虽然每个独立的 example 的loss可以收敛到很小,但是由于它们的数量过大,总的loss 依然不容忽视,把一些 hard example 的 loss 覆盖掉。导致依然会支配整个批样本的收敛方向。一个简单的思路是继续缩小 easy example 的比重,此处通过一个 幂次方来实现。因为 easy example 的得分会小于 1,所以它的正整数次幂会更小。因此 easy example 得到了抑制,相对的 hard example 比重即可提升。

RetinaNet

主要结构为 ResNet + FPN,使用 one stage training + focal loss 在coco 上达到了 39.1 的 mAP
  • tricks
  • 单标签softmax换成多标签的sigmoid效果会更好,这里应该和 YOLO v3 同理
  • 在训练初始阶段因为 positivie 和negative 的分类概率基本一致,会导致 focal loss 起不到抑制 easy example 的作用,为了打破这种情况,作者对最后一级用于分类的卷积的 bias作了下小修改,把它初始化成一个特殊的值 b=-log((1-π)/π)π 在论文中取 0.01,这样做能在训练初始阶段提高positive的分类概率
  • FPN 的每一层的所有 example 都用于计算 Focal loss,然后求和更新
  • 测试时 FPN 每一级只选取 score 最大的 1k 个 example 来做 nms
  • 整个结构不同层的 head 部分(即结构图的虚线框内)share weight,但分类与回归分支的参数不共享
  • 分类分支的最后一级卷积的bias初始化成前面提到的-log((1-π)/π) ,实验中 π 取0.01
Share this to:

发表评论

电子邮件地址不会被公开。 必填项已用*标注