• RetinaNet(Focal Loss)


     

    Focal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘。

    目标识别有两大经典结构:

    1. 第一类是以Faster RCNN为代表的两级识别方法,这种结构的第一级专注于proposal的提取,第二级则对提取出的proposal进行分类和精确坐标回归。两级结构准确度较高,但因为第二级需要单独对每个proposal进行分类/回归,速度就打了折扣;
    2. 第二类结构是以YOLO和SSD为代表的单级结构,它们摒弃了提取proposal的过程,只用一级就完成了识别/回归,虽然速度较快但准确率远远比不上两级结构。

    那有没有办法在单级结构中也能实现较高的准确度呢?Focal Loss就是要解决这个问题。

    为什么单级结构的识别准确度低
    作者认为单级结构准确度低是由类别失衡(class imbalance)引起的。计算Loss的bbox可以分为positive和negative两类。当bbox(由anchor加上偏移量得到)与ground truth间的IOU大于上门限时(一般是0.5),会认为该bbox属于positive example,如果IOU小于下门限就认为该bbox属于negative example。在一张输入image中,目标占的比例一般都远小于背景占的比例,所以两类example中以negative为主,这引发了两个问题:

    1. negative example过多造成它的loss太大,以至于把positive的loss都淹没掉了,不利于目标的收敛;
    2. 大多negative example不在前景和背景的过渡区域上,分类很明确(这种易分类的negative称为easy negative),训练时对应的背景类score会很大,换个角度看就是单个example的loss很小,反向计算时梯度小。梯度小造成easy negative example对参数的收敛作用很有限,我们更需要loss大的对参数收敛影响也更大的example,即hard positive/negative example。

    这里要注意的是前一点我们说了negative的loss很大,是因为negative的绝对数量多,所以总loss大;后一点说easy negative的loss小,是针对单个example而言。

    Faster RCNN的两级结构可以很好的规避上述两个问题:

    1. 会根据前景score的高低过滤出最有可能是前景的example (1K~2K个),因为依据的是前景概率的高低,就能把大量背景概率高的easy negative给过滤掉,这就解决了前面的第2个问题;
    2. 会根据IOU的大小来调整positive和negative example的比例,比如设置成1:3,这样防止了negative过多的情况(同时防止了easy negative和hard negative),就解决了前面的第1个问题。

    所以Faster RCNN的准确率高。

    OHEM是近年兴起的另一种筛选example的方法,它通过对loss排序,选出loss最大的example来进行训练,这样就能保证训练的区域都是hard example。这个方法有个缺陷,它把所有的easy example都去除掉了,造成easy positive example无法进一步提升训练的精度。

    hard positvie、hard negative、easy positive、easy negative四种example的示意图,可以直观的感受到easy negativa占了大多数。

    Focal Loss

    Focal loss是在交叉熵损失函数基础上进行的修改,首先回顾二分类交叉上损失:

    [公式]

    [公式] 是经过激活函数的输出,所以在0-1之间。可见普通的交叉熵对于正样本而言,输出概率越大损失越小。对于负样本而言,输出概率越小则损失越小。此时的损失函数在大量简单样本的迭代过程中比较缓慢且可能无法优化至最优。
    [公式]

    Focal Loss通过调整loss的计算公式使单级结构达到和Faster RCNN一样的准确度。

    [公式] 是不同类别的分类概率, [公式] 是个大于0的值, [公式] 是个[0,1]间的小数, [公式] 和 [公式] 都是固定值,不参与训练。从表达式可以看出:

    1. 无论是前景类还是背景类, [公式] 越大,权重 [公式] 就越小。也就是说easy example可以通过权重进行抑制。换言之,当某样本类别比较明确些,它对整体loss的贡献就比较少;而若某样本类别不易区分,则对整体loss的贡献就相对偏大。这样得到的loss最终将集中精力去诱导模型去努力分辨那些难分的目标类别,于是就有效提升了整体的目标检测准度。
    2. [公式] 用于调节positive和negative的比例,前景类别使用 [公式] 时,对应的背景类别使用 [公式] ;
    3. [公式] 和 [公式] 的最优值是相互影响的,所以在评估准确度时需要把两者组合起来调节。作者在论文中给出 [公式] 、 [公式] 时,ResNet-101+FPN作为backbone的结构有最优的性能。

    此外作者还给了几个实验结果:

    1. 在计算 [公式] 时用sigmoid方法比softmax准确度更高;
    2. Focal Loss的公式并不是固定的,也可以有其它形式,性能差异不大,所以说Focal Loss的表达式并不crucial。

    在训练初始阶段因为positivie和negative的分类概率基本一致,会造成公式1起不到抑制easy example的作用,为了打破这种情况,作者对最后一级用于分类的卷积的bias(具体位置见图2)作了下小修改,把它初始化成一个特殊的值 [公式] 。 [公式] 在论文中取 [公式] ,这样做能在训练初始阶段提高positive的分类概率。

    RetinaNet

    作者提出了一种使用Focal Loss的全新结构RetinaNet,使用ResNet+FPN作为backbone,再利用单级的目标识别法+Focal Loss。这个结构在COCO数据集上达到了39.1的mAP。图2是它的基本结构:

    RetinaNet


    这个结构要注意几点:

    1. 训练时FPN每一级的所有example都被用于计算Focal Loss,loss值加到一起用来训练;
    2. 测试时FPN每一级只选取score最大的1000个example来做nms;
    3. 整个结构不同层的head部分(图2的c和d部分)共享参数,但分类和回归分支间的参数不共享
    4. 分类分支的最后一级卷积的bias初始化成前面提到的 [公式] ;

    参考

    Focal Loss for Dense Object Detection解读

    RetinaNet: Focal loss在目标检测网络中的应用

  • 相关阅读:
    关于final shell
    vue axios 赋值后console可以查看到 html调用数据失败
    递归计数
    中国用户也能同步 Chrome 书签了
    Linux基础知识(CentOS7)
    问题关键词
    「工具推荐」golang 代码可视化工具 gocallvis
    php统一的gocheck方法
    激光原理与技术第七章
    小码哥汇编
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/14180810.html
Copyright © 2020-2023  润新知