参考网址:
-
RetinaNet——《Focal Loss for Dense Object Detection》论文翻译(这篇文章基本上完全翻译了论文内容,还是比较详细的,我再阅读时主要参考了这篇)
-
RetinaNet翻译+解析(主要是介绍了论文中的损失函数:CE、FL,其实这些在原作中都有提到)
-
目标检测(object detection)系列(十一) RetinaNet:one-stage检测器巅峰之作(这篇有助于整体理解这篇论文,且Focal Loss部分介绍的很详细)
作者首次注意到one stage模型精度低的原因是类别不均衡的问题,所以提出FL解决正负样本不均衡问题 ,由此构建了RetinaNet.。
1、FL相对于CE(cross entropy)的优势
在候选区域生成的候选框中,大类的不平衡会主导交叉熵损失,所以大量的负样本会主导损失并主导梯度。FL的计算公式如下,其中为平衡因子,为调节因子,的取值范围为。作者在文中做实验分析了和取不同值的效果,发现越大时,应该越小,效果最好的组合为
,其中,注意,只是符号不一样。
那为啥这样的形式就比平衡交叉熵好呢?我们假设为1,系数就变成了,在这个基础上,我们按照上面的方式展开其实就是这样子:
如果按照二分类的交叉熵损失展开,公式如下:
由于交叉熵前做了softmax,所以p一定是个正数,这个因子加上不会改变原有损失的符号,然后我们举例说明它怎么区分难易样本,p是正样本的预测值:
- 对于一个正例,模型认为它简单,那么p会趋近于1,1−p会趋近于0,损失就会变小,相反的就会变大。
- 对于一个负例,模型认为它简单,那么p会趋近于0,损失就会变小,相反的就会变大。
举个例子:
同样是拿预测概率为0.1和0.9进行比较:
(真实有目标) (真实无目标) 其中假设,,从表中可以看出,使用FL后正负样本损失的倍数差距被放大了,原来使用二分类的交叉熵损失倍数为20倍左右,使用了Focal Loss后,倍数被放大到上千(2000)倍,所以这样当出现预测错误时,会给予更大的关注,从而来缓解正负样本不均衡的问题。
这就对模型的难易做出了不同的loss值,此外Focal loss还有一个超参数,它起到了对因子成幂次,由于底数一定是一个小于1的数,幂次会拉大原有的线性倍率。比如原本是0.1和0.9,时,会变成0.01和0.81,9倍变成了81倍。这种抑制简单样本,促进难样本的方式,其实和IOU>0.7和IOU<0.3有异曲同工之妙。
加了这东西之后,难易样本区分开了,但是负样本多的问题好像并没有解决掉,所以Focal loss最后又把平衡交叉熵中的平衡因子加了回来。
参考文章:目标检测(object detection)系列(十一) RetinaNet:one-stage检测器巅峰之作,这篇文章的Focal Loss部分介绍的很详细
2、RetinaNet的网络结构
RetinaNet是一个统一的网络,由骨干网(backbone)和两个特定于任务的子网组成。骨干负责计算整个输入图像上的卷积特征图,并且是一种自卷积网络。第一个子网在主干的输出上执行卷积对象分类;第二个子网执行卷积边界框回归。这两个子网具是一个简单的设计,我们专门为one-stage、dense detection提供这种设计,网络结构如下所示。通过FPN可以提取出多尺度的候选框,每一个金字塔层的输出通道都是256,
Anchor Box
RetinaNet选取Anchor Box的策略和FPN相似,一共有5个不同尺度的特征图,分别是,每一层会有三种比例:1:1、1:2、2:1,所以FPN有15种Anchor,但是RetinaNet在这个基础上又加了一个因素,就是每一层特征图上有三种尺度,它分别是该层特征图尺度的,而比例不变仍为1:1、1:2、2:1,于是RetinaNet的Anchor变成了45个。因为Focal loss的引入,让Anchor的选取变得为所欲为,就是不怕多。