原文链接如下:
https://blog.csdn.net/JNingWei/article/details/80038594
https://blog.csdn.net/weixin_41665360/article/details/90039317
https://blog.csdn.net/weixin_30856725/article/details/95157073
RetinaNet是2018年Facebook AI团队在目标检测领域新的贡献。
RetinaNet只是原来FPN网络与FCN网络的组合应用,因此在目标网络检测框架上它并无特别亮眼创新。文章中最大的创新来自于Focal loss的提出及在单阶段目标检测网络RetinaNet(实质为Resnet + FPN + FCN)的成功应用。
Focal loss是一种改进了的交叉熵(cross-entropy, CE)loss,它通过在原有的CE loss上乘了个使易检测目标对模型训练贡献削弱的指数式,从而使得Focal loss成功地解决了在目标检测时,正负样本区域极不平衡而目标检测loss易被大批量负样本所左右的问题。此问题是单阶段目标检测框架(如SSD/Yolo系列)与双阶段目标检测框架(如Faster-RCNN/R-FCN等)accuracy gap的最大原因。在Focal loss提出之前,已有的目标检测网络都是通过像Boot strapping/Hard example mining等方法来解决此问题的。作者通过后续实验成功表明Focal loss可在单阶段目标检测网络中成功使用,并最终能以更快的速率实现与双阶段目标检测网络近似或更优的效果。
1、目标检测存在的问题
目前检测器主要有以下两派:
在two-stage检测器大行其道的今天,作者探究了one-stage 检测器在精度上不如two-stage检测器的原因。他们认为,one-stage检测器规则的密采样候选框的机制,会在采框过程中产生大量负样本,这种在训练时的前景-背景类别失衡会导致大量的简单负样本在训练过程中压倒检测器。简而言之,这些明显错误的简单负样本会在训练过程中影响检测器的学习,而那些更challenge的负样本会得不到关注。
基于以上研究,作者提出了一种焦点损失(Focal Loss),给予easy的负样本一个小的loss权重,避免训练过程中正负样本loss失衡。
2、焦点损失(Focal Loss)
常规的交叉熵损失函数:
若将p和(1-p)统一表示为如下:
则交叉熵可以简化为:
Focal Loss损失函数如下:
加入参数后为:
说明:FL是一个尺度动态可调的交叉熵损失函数,在FL中有两个参数 和 ,其中 主要作用是解决正负样本的不平衡, 主要是解决难易样本的不平衡。
3、参数说明
3.1、解决正负样本不平衡
交叉熵损失可以表示如下:
值往往需要根据验证集进行调整,论文中给出的是0.25。
3.2、 解决难易样本的不平衡
在实验中,发现 γ=2,α=0.25γ=2,α=0.25 的取值组合效果最好。
4、RetinaNet( FPN + sub-network + FL)
主要流程图如上,(a)(b)是比较常规的特征提取网络,作者采用的FPN50和FPN101,(c)(d)是分类和回归的subnet。整体的框架很简洁。
注明:
- RetinaNet简单而十分强大,以至于成为了当下最佳(accuracy/speed/complexity trade-off)的detector之一。
- RetinaNet的detector部分是两条平行pipe-line,且 设计相同 (除了尾部的output不一样) 但 参数不共享 (Faster R-CNN中第一层的参数是共享的) 。
- reg_pipe-line直接输出target,所以是采用了无分类的bbox regressior(Faster R-CNN是每个类各一个bbox regressor)。
5、结果
参考实践:
https://github.com/fizyr/keras-retinanet
https://www.aiuai.cn/aifarm886.html
本人关于安全帽检测的实例参考链接如下:
https://github.com/zhangwei147258/safety_helmet_detect_retinanet_keras