如何评价kaiming的Focal Loss for Dense Object Detection?

关注者
1,626
被浏览
105,719

22 个回答

收录于 编辑推荐 ·

趁着今天有空,简单写写notes,是从personal notes里直接贴过来的,夹杂了比较多的私货,而且可能有不太严谨的地方敬请见谅。


-----------------------------正文的分割线------------------------------

在我的知识体系内比较颠覆的一个paper,之前一直认为Single stage detector结果不够好的原因是使用的feature不够准确(使用一个位置上的feature),所以需要Roi Pooling这样的feature aggregation办法得到更准确的表示。但是这篇文章基本否认了这个观点,提出Single stage detector不好的原因完全在于:

  1. 极度不平衡的正负样本比例: anchor近似于sliding window的方式会使正负样本接近1000:1,而且绝大部分负样本都是easy example,这就导致下面一个问题:
  2. gradient被easy example dominant的问题:往往这些easy example虽然loss很低,但由于数 量众多,对于loss依旧有很大贡献,从而导致收敛到不够好的一个结果。

所以作者的解决方案也很直接:直接按照loss decay掉那些easy example的权重,这样使训练更加bias到更有意义的样本中去。很直接地,如下图所示:



实验中作者比较了已有的各种样本选择方式:

  1. 按照class比例加权重:最常用处理类别不平衡问题的方式
  2. OHEM:只保留loss最高的那些样本,完全忽略掉简单样本
  3. OHEM+按class比例sample:在前者基础上,再保证正负样本的比例(1:3)

Focal loss各种吊打这三种方式,coco上AP的提升都在3个点左右,非常显著。值得注意的是,3的结果比2要更差,其实这也表明,其实正负样本不平衡不是最核心的因素,而是由这个因素导出的easy example dominant的问题。不过比较遗憾的是,作者并没有给出OHEM会让结果变差的一个合理解释,这其实也是很值得深挖的一点。

结果上,最好的模型(ResNet101+FPN)做到了single model39.1 AP,其余的model在speed和accuracy之间的tradeoff也都是在efficient frontier上。很有insight的工作,而且,如果你有一个实现正确的FPN,这篇文章也不难复现。

后续两个我比较关心的扩展点吧:

  1. 是否可以使用data driven的方式来学习data的权重?这样可以统一起OHEM和self paced learning这两个极端。Focal loss其实也可以算在这个框架中。这个其实是早就想做的一个idea,年初的时候msra有一篇文章用RL来做了这件事情,但是文章非常不成熟。
  2. Mask RCNN类instance seg的方法是否也可以one shot?这个看上去非常有诱惑力~
  3. 如果在RPN中使用了Focal loss,那么后面再过RCNN性能是否可以有更一步提升?

(我非常喜欢这篇文章,终于把 SSD 那套极其丑的 data augmentation 干掉了


- 这篇文章的 idea 并不 novel(开篇先说好,novelty 完全不等于 contribution)。以前的 balanced cross entropy 是一个人手动设定的值,现在改成了一个 output dependent 的项。


- 这篇 paper accuracy 怎么样?

这 paper 最后报了个惊人的 39.1,这个是怎么来的呢?首先这个是 multi scale training 的 +1.3,然后是 scale 从 500 到 800 的 +3.4。所以你看其实这个结果(34.4)和 DSSD(33.2)其实并没有那么吓人。

免责声明:这里只谈公平对比 accuracy。我不怀疑其上界比 DSSD 高,也觉得这 paper 很干净。


- 这篇 paper 为什么效果好?

首先是更多的 anchor 数,仔细看的话就会发现它 anchor 的 scale 应该从 5 变成了 15

然后就是强大的实现能力,上面那个结构竟然就做到了 31.1 了

给了无数的 anchor,如何 sample 来更好的优化这个网络,这个就是主要 contribution focal loss 了,没啥可解释的,paper 里说的就是 hard example 以及 imbalance samples的问题。

这里我另外提一点可能性,就是 focal loss 每次 forward 是 train 了图上所有的 anchor,batch size 相比普通的 sample 是很大的。我之前在一条回答中提过,single shot GG 的原因可能是每个 pixel 没法充分训练,并且在 single shot detector 里面纯粹增大 batch size 的话是没用的,我觉得这个 paper 在提供了这样一个容易 train 的 loss 的基础下,能够享有 “看全图” 的优势,弥补了上述问题。

另外一点就是那个 FCN subnet,每个 head 多加了四层 conv,想想就知道肯定有 gain(当然用起来不知道了)。


- 这篇 paper 速度怎么样?

从理论计算量以及实际时间来说,我觉得这个 claim 的速度我是复现不出来的(both for training and inference)。不止这篇,FPN 和 MaskRCNN 我也做不出来,所以只能待大神公开代码然后看看怎么优化吧。


- 这篇 paper contribution 到底怎么样?

可以说很大,以前的 single shot 实在太丑,这篇文章是一个很干净清晰强大的工作(比 mask rcnn 的 contribution 高到不知道哪里去,我无良怀疑这篇文章这么晚放出来是怕抢了 mask rcnn 的风头)