Focal Loss
@(目标检测)
Focal Loss是KaiMing大神提出来的,这篇文章的重点在于分析了one-stage网络的检测精度为什么会弱于two-stage的网络。当原理分析出来之后,其实公式的更改就很简单了。这篇paper也自建了一个网络RetinaNet [1] [ 1 ] ,在COCO数据集上的检测效果达到了40%的效果,提升效果非常明显。
这篇文章提出One-Stage网络检测精度较于Two-Stage网络差的原因主要是Class Imbalance,类别不均衡。
这个类别不均衡包括了一个数据集里面,
- 不同类的物体数量差距巨大(比如一个数据集里面每张图片车很多人很少);
- 同类物体的图片里前景和背景的数量差距巨大(比如一张图片本身很大,但是里面只有一个孤零零的小人);
- 样本与样本检测的难易(easy exampling 和 hard example,有些图片里面的人可能比较大很好检测,有些图片里的人比较小就难检测了);
等等,数据集自带的数据不平衡的弊端,会严重影响数据集训练出来的网络效果。
One-Stage的网络,会对每个图片预测出成千上万个备选框 (作者举例如DPMs,SSD等,但是Yolo好像不是这样啊。Yolo v1一共预测98个框子,Yolo v2倒是上千了。),备选框多了会导致两个问题。
1. 负例样本数远超正例样本数会导致网络训练不到足够的正例样本的特征,这使得训练没有什么效果。
2. 负例样本数量多,容易学习,会导致训练方向完全导向学习负例样本的方向。
这两个问题很好理解。其实就是负例样本贡献的loss太多,会把正例样本贡献的loss给淹没掉,所以模型训练就跑偏了。
为什么Two-Stage的网络就不会出这种问题呢?
因为它们在生成预测框的时候,首先控制了数量,其次控制了正负样例的比例,还有诸如OHEM等方法去控制样本难易程度等,所以就不会,详情见RCNN系列。
回到文章,那面对样本类别不均衡,难易不均衡的问题,应该如何解决呢?
Focal Loss Definition
作者的想法很简单:既然用的是不平衡的数据集,那么为什么要用平衡的loss函数呢?
首先给出公式。
其中,