【写在前面】 RetinaNet 是目前目标检测最为优秀的方法之一,值得好好拜读一下,在COCO数据集上达到了单个模型的state of art 的效果, 由Kaiming He团队所作,作者发现导致one-stage算法性能劣于two-stage算法的主要原因是region proposal时前景和背景的类别不平衡,为了解决这个问题,提出了关键大招Focal Loss,改写了传统的分类交叉熵损失函数,在训练过程中能够实现自动降低容易分类的类别的权重,从而可以把优化网络的关注点放在难分类的目标上。因此,RetinaNet既解决了one-stage region proposal 产生大量的非目标区域特征导致loss计算不平衡的问题,保留了faster RCNN检测精度高的优点,又属于One-Stage算法,减少了重复计算,算法速度相对于two-stage得到了极大的提升。
感谢各位大大的开源代码:
Caffe2 version: https://github.com/facebookresearch/Detectron
Keras version: https://github.com/fizyr/keras-retinanet 本人keras版本亲测非常好用,下一篇博客写一下这个的源码解读。
Pytorch version: https://github.com/kuangliu/pytorch-retinanet
- Focal Loss
我们看一下什么是Focal Loss. Focal loss被设计用来解决one-stage算法产生的极端的前景/背景(比如1:1000)不平衡问题的。
先看一些背景知识
对于二分类的分类交叉熵,如下为计算公式:
其中y∈{-1,+1}, y=1代表预测为groundtruth类别, p表示y=1的概率,引入pt分类交叉熵可做如下定义:
如下图1中,蓝线是CE,所以当容易分的类别(p>>0.5)特别多的时候,虽然单个loss的值不大,总的Loss加起来易分的类别还是会占主导地位,难分的类别就会被淹没。