RetinaNet 学习笔记

RetinaNet算法源自《Focal Loss for Dense Object Detection》ICCV 2017

摘要

在这里插入图片描述在这里插入图片描述

该论文最大的贡献在于提出了Focal Loss用于解决one-stage算法中正负样本的比例严重失衡问题,从而创造了RetinaNet(One Stage目标检测算法)这个精度超越经典Two Stage的Faster-RCNN的目标检测网络。
在这里插入图片描述
作者的基础网络使用的是Resnet,然后在不同尺度的feature map建立金字塔,也就是FPN网络,这样就获得了丰富且多尺度的卷积特征金字塔,并且在FPN的每个level连接一个subnet用于回归和分类预测,这些subnet的参数是共享的,它相当于一个小型的FCN结构,具体细节就不深究了,可以看看它的源码,这样就形成了一个简单的One-Stage算法。

Two Stage 与 One Stage

Two Stage:例如Faster-RCNN算法。第一级专注于proposal的提取,第二级对提取出的proposal进行分类和精确坐标回归。两级结构准确度较高,但因为第二级需要单独对每个proposal进行分类/回归,速度上就打了折扣

One Stage:例如SSD,YOLO算法。此类算法摒弃了提取proposal的过程,只用一级就完成了识别/回归,虽然速度较快但准确率远远比不上两级结构、

产生精度差异的主要原因类别失衡(Class Imbalance)。One Stage方法在得到特征图后,会产生密集的目标候选区域,而这些大量的候选区域中只有很少一部分是真正的目标(如SSD300产生了8732个预选框,SSD512产生了2万多个),这样就造成了机器学习中经典的训练样本正负不平衡的问题。它往往会造成最终算出的training loss为占绝对多数但包含信息量却很少的负样本所支配,少量正样本提供的关键信息却不能在一般所用的training loss中发挥正常作用,从而无法得出一个能对模型训练提供正确指导的loss(而Two Stage方法得到proposal后,其候选区域要远远小于One Stage产生的候选区域,因此不会产生严重的类别失衡问题)。常用的解决此问题的方法就是,虽然有时会使用bootstrapping和hard example mining,或其它更复杂的用于过滤负样本从而使正负样本数维持一定比率的样本取样方法。效率低。该论文中提出了Focal Loss来对最终的Loss进行校正。

Focal Loss

在这里插入图片描述
Focal Loss的目的:消除类别不平衡 + 挖掘难分样本

在two-stage的检测器中,为了实现正负样本的比例均衡,不至于整个训练过程被负样本“淹没”,一般采取抽样的方法,将正负样本比例控制在1:3,采用OHEM,在正负样本间保持合理的比例。但是传统的one-stage不行,因为one-stage是暴力粗糙的,他只有一个阶段,产生的候选相比two-stage要大得多。

Focal Loss是一个动态缩放的交叉熵损失,一言以蔽之,就是在原有的交叉熵损失函数上增加了一个动态缩放因子,可以动态降低训练过程中易区分样本的权重,从而将loss的重心快速聚焦在那些难区分的样本上,让损失函数更加关注hard examples,而实验同样表明,相比较OHEM,sampling heuristics这些方法,focal loss更胜一筹,在以ResNet-101-FPN为backbone的RetinaNet中,AP达到了39.1,速度在5fps。

作者在标准交叉熵损失的基础上进行了改进,首先我们把交叉熵二分类loss定义为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后我们把完整版的loss函数写下来,为:
在这里插入图片描述
看一下上式,它的功能可以解释为:通过αt 可以抑制正负样本的数量失衡,通过γ 可以控制简单/难区分样本数量失衡。关于focal loss,有以下结论:

1、无论是前景类还是背景类,pt越大,权重(1-pt)r 就越小。也就是说easy example可以通过权重进行抑制;

2、at用于调节positive和negative的比例,前景类别使用at时,对应的背景类别使用1-at;

3、r和at的最优值是相互影响的,所以在评估准确度时需要把两者组合起来调节。作者在论文中给出r=2、at=0.25时,ResNet-101+FPN作为backbone的结构有最优的性能。
在这里插入图片描述

RetinaNet

主要由ResNet+FPN+2xFCN子网络构成。
在这里插入图片描述
首先RetinaNet的Backbone是由ResNet+FPN构成。相比原版的FPN,RetinaNet的卷积过程用的是ResNet,上采样和侧边连接还是FPN结构。通过主干网络,产生了多尺度的特征金字塔。然后后面连接两个子网,分别进行分类和回归。

anchor,这里anchor的设置类似于RPN中的结构,先看一下RPN是如何设置的:
在这里插入图片描述
anchor是在原图中的,对于feature map上的每一个点,利用滑窗,在原图上产生3种尺寸,每种尺寸3个长宽比的anchor,这样,一个点就会有9个anchor。对于每一个anchor,接入两个子网,分别进行1x1x18维卷积和1x1x36维卷积,这样,在分类子网,输出的是每一个anchor的前背景得分,一个点9个anchor,那么一个点就有18维度输出;

说回到RetinaNet中,在FPN的P3-P7中分别设置【322–5122】尺寸不等的anchor,比例设置为{1:2, 1:1, 2:1},为了密集覆盖,针对每一个长宽比,又设置3种尺寸,这样每一层一共有9种anchor,不同层能覆盖的size范围为32-813。对每一个anchor,都对应一个K维的one-hot向量(K是类别数)和4维的位置回归向量。与RPN相比,RetinaNet的anchor增加了多类别预测并且调整了相应的阈值。具体来说,如果一个anchor与某个GT的IOU>0.5,就认定为正样本,如果IOU在[0,0.4)之间,认定为背景。每个anchor至多用来检测一个GT,在K维标签中,将该GT对应的标签设置为1,其余归0。如果一个anchor的IOU在[0.4,0.5)之间,那么在训练时将会被忽略。位置回归计算的是anchor和某个对应GT的坐标偏移。接下来详细介绍一下两个子网:

Classification Subnet:
分类子网对A个anchor,每个anchor中的K个类别,都预测一个存在概率。如下图所示,对于FPN的每一层输出,对分类子网来说,加上四层3x3x256卷积的FCN网络,最后一层的卷积稍有不同,用3x3xKA,最后一层维度变为KA表示,对于每个anchor,都是一个K维向量,表示每一类的概率,然后因为one-hot属性,选取概率得分最高的设为1,其余k-1为归0。传统的RPN在分类子网用的是1x1x18,只有一层,而在RetinaNet中,用的是更深的卷积,总共有5层,实验证明,这种卷积层的加深,对结果有帮助。
在这里插入图片描述
Box Regression Subnet

与分类子网并行,对每一层FPN输出接上一个位置回归子网,该子网本质也是FCN网络,预测的是anchor和它对应的一个GT位置的偏移量。首先也是4层256维卷积,最后一层是4A维度,即对每一个anchor,回归一个(x,y,w,h)四维向量。注意,此时的位置回归是类别无关的。分类和回归子网虽然是相似的结构,但是参数是不共享的。

算法效果

在这里插入图片描述
对于One-Stage算法,使用FL loss要比使用OHEM等平衡正负样本的策略要来的效果好一些。但是有些算法如YOLOV3使用Focal loss效果就没有那么好,可能是算法内就已经平衡了正负样本,所以不适用~~~在这里插入图片描述
特征金字塔每层都相应的产生目标类别与位置的预测,最后再将其融合起来,同时使用NMS来得到最后的检测结果。相比较于经典的Two Stage检测方法Faster-RCNN,RetinaNet具有更高的精度。Focal loss的威力还是很大的,当然我觉得FPN+ResNet也有加成。

参考(感谢)
https://zhuanlan.zhihu.com/p/68786098
https://zhuanlan.zhihu.com/p/67768433
https://zhuanlan.zhihu.com/p/53259174
https://zhuanlan.zhihu.com/p/59910080

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值