说明
1.本文是博主的学习记录,主要为了方便以后查看,当然如果能为别人提供帮助就更好了,如果有不对的地方请指正
2.本文重点是Focal Loss,尽量用较少篇幅表达清楚论文整体思路,其他一些不影响理解论文算法的东西有需要的请查看其他博客
3.论文中的链接是我经过大量搜索,个人认为讲解最清楚的参考,看本文的过程中如对一些名词有疑惑可以直接点击参考链接
创新点
1.提出Focal Loss,并以Focal Loss为损失设计一个one-stage的检测算法RetinaNet
问题引出
我们都知道目标检测分为一刀流和二刀流,前者速度快精度低,后者速度慢精度高。如果一刀流精度也提上来那岂不是完美,要提高一刀流的精度就得知道它为何精度低,主要原因就是正样本(positive example)和负样本(negative example)以及难分类样本(hard example)和易分类样本(easy example)的不平衡,那什么是正负样本不平衡呢?就是说一张图片中的目标实际上也就一个或者几个,但是候选框的数量能达到百万个,这样一来负样本(候选框里是背景)就会比正样本多的多的多,在这种情况下训练网络,就算正样本的loss非常大也会被数量庞大的负样本中和掉。难分类样本在正负样本的过渡区域上,不是很容易分类,单个hard example的loss大,但是数量少;易分类样本就是不在正负样本的过渡区域上,是正是负很明显,所以容易分类,单个easy example的loss很小,但是数量庞大,把一些hard example的loss覆盖掉,导致求和之后他们依然会支配整个批次样本的收敛方向。说白了就是网络虽然收敛,但是正样本和难分类样本根本没训练好,而正样本恰恰是我们最需要训练好的,这就是一刀流检测算法精度低的原因
二刀流检测算法精度高是因为第一阶段选择候选框(如RPN)的时候会根据得分使用nms来过滤掉很多候选框(如R-CNN系列只留2000个),这样就会过滤掉大部分负样本(背景),同时它是根据前景得分高低来过滤的,所以会把前景概率低(即背景概率高,也就是easy negative example)的过滤掉,这样易分类样本也会减少;第二阶段采用启发式采样(如固定正负样本比为1:3,HEM或OHEM,链接),进一步维持正负样本的平衡可控。而一刀流检测算法直接处理百万个框,尽管也能使用类似的启发式采样,但是训练始终被负样本所支配,没有什么效果
Focal Loss
针对以上问题提出Focal Loss,比之前处理失衡的办法更有效
1.二分类交叉熵损失 (Cross-entropy Error,CE)
其中y={1,-1}是gt的标签,p∈[0,1]是模型为样本估计的概率,为了方便,定义
此时二分类交叉熵损失形式为
2.解决正负样本不平衡
解决方式很直接,为正负样本分配不同的权重α∈[0,1]
此时损失函数(Balanced Cross Entropy)为
可以看到给正样本分的权重为α,负样本权重为1-α
3.解决难易样本不平衡
平衡难易样本也是同样的思想,为易分类样本降权,专注训练难分类样本,增加一个调制因子,其中γ≥0
从调制因子可以看出,不管是正样本还是负样本,大就表示容易分类,也就是代表易分类样本,越大,调制因子越小,也就起到了给易分类样本降权的作用
4.实际用的最终版本(α−balanced变体)
注:
作者通过试验,发现 γ=2,α=0.25 的取值组合效果最好,如果单看α平衡正负样本的公式,α=0.25感觉是反了,是把正样本给降权了,因为这是联合调参调出来的,可以理解为先是通过调制因子把易分类样本降权,又因为负样本中大多都是易分类的,所以就等同于把负样本给降权了,如果降太多了话,假设此时正样本作用比负样本大,那α=0.25就说得清了
RetinaNet
RetinaNet是为了评估Focal Loss,并没有什么创新点,就是ResNet+FPN
其他
重点是Focal Loss,其他的就是为了验证Focal Loss的效果