RetinaNet

两阶段法比一阶段准,为什么呢?因为在训练密集检测器时,会遇到极端的前景-背景类别不平衡问题。作者重新定义了一个损失,对于分类良好的例子,给定较低的权值。Focal损失将集中训练难例的稀疏集,并防止大量简单负例在训练时压倒检测器。

在实践中,单阶段法会枚举出相当多的候选框,导致训练过程被易分类的背景例子主导。因此提出的Focal损失,它是一个动态scaled的交叉熵损失,当正确类的置信增加时,scale参数下降到0。这个scale factor可以在训练时自动降低简单例子贡献的权重,并迅速将模型聚焦在难例上。

在极端情况下,前景与背景的比例为1:1000,对于常规交叉熵损失CE(pt, y)= -log(pt),其中,y=1时pt=p,y≠1时pt=1-p,其中p为y=1时的概率。作者称,当有大量容易分类正确的例子(pt >> 0.5)时,会压倒损失函数。(如果pt>>0.5证明它把正例分为正例,或把负例分成负例的置信值高。可能作者就是想表达,由于负例过多,即使很好为它们分类,但是把它们加起来也是一个很大的loss,会把难以分对的前景等的loss给抹去(求总loss然后取平均))

一个简单的解决方法是规定α,使得CE(pt)=-αtlog(pt)。虽然它平衡了正/负例的重要性,但却无法区分简单/困难样本。于是提出了FL(pt)=-(1-pt)γlog(pt)
在γ∈[0,5]的范围内做了实验,发现:
(1)当样本分类错误且pt较小时,调节因子(1-pt)γ接近于1,loss不受影响。当pt→1时,因子趋于0且分类较好的样本的loss其权重降低。(该段的意思是,如果分得不好,即这是个难例时pt就小,此时loss的值不受影响。但分得好,证明这个很好分对,无需占用太多的loss计算资源,因此loss就被拉小了。)
(2)将loss的值拉低多少呢?这就看γ了,它是0的时候就是普通CE损失,它是2的时候效果最好。
直观地说,调制因子减少了简单样本贡献的loss,并扩展了样本接收低loss的范围(?)。例如,当γ = 2时,分类为pt= 0.9的示例与CE相比损失低了100倍,而当pt≈ 0.968时,损失低了1000倍。这反过来增加了纠正误分类样本的重要性(对于pt≤0.5且γ = 2,其损失最多降低4倍)。(简单来说就说你pt越接近1,给的权重下降的幅度越快,而pt越小时权重下降的幅度越慢)
在实践时,又有如下形式:FL(pt)=-αt(1-pt)γlog(pt),有了α比没有准确率高一点,一个较高的γ应选用较低的α,(由于容易的负例被降低了权重,所以要应较少地强调正例)这什么鬼,不理解,应该是α太小了会把损失变太小吧?。而且在loss层用上sigmoid来计算p更稳定

默认情况下,二分类模型初始化后,输出y =−1或1的概率相等。此时如果类别不平衡,数量多的类别会主导loss,并导致训练早期不稳定。解决方法是引入了一种“先验”观念,在训练开始时,由模型为稀少的类别(前景)预测p的值。我们将这个先验记为,因此模型为较少类别的样本估计的p就低了。(假设我有100个候选框,一般情况下前景少背景多,假设1个前景99个背景,由于模型初始化后输出的值是1比1,这样就预测出了50个前景50个背景。假设50个背景预测对了(小pt),1个前景预测对了(小pt),49个背景预测错了(大pt)。这就是所谓“数量多的类别会主导loss”。)
(有空看看Learning to segment object candidates)

双阶段目标检测怎么解决不平衡问题?(1)两阶段级联(2)有偏见地小批次抽样。第一阶段首先通过提议机制将候选框降至1~2k个,其次并非随机去选择提议,而是尽可能与真实目标位置相对应,这样就移除了大量简单的负例。第二阶段有偏见地采样,正反例比例是1:3,类似于α这种平衡参数

RetinaNet由一个骨干网络和两个特定类别子网组成,第一个子网在骨干的输出上做目标分类,第二个子网做边界框回归。使用了FPN做骨干,构建了P3-P7级别的金字塔

对于锚,在原始的{1:2, 1:1, 2:1}三个纵横比的基础上,增加了尺寸为{20, 21/3, 22/3}的锚,在每个level上有9个锚,对于输入图像,across levels尺度覆盖范围从32到813像素。

对于分类网络,经过四层3x3卷积后,最后还是个3x3卷积层,但是有KA个卷积核,因此可以完成二元分类,激活函数是sigmoid,K是类别个数,A=9是anchor数目。不与框回归层共享参数。

对于回归网络,相比分类网络,区别仅在于最后不是分类层而是回归层,回归的offset与RCNN一致。因为这个网络仅预测框而不预测类别,因此作者称之为“类别不可知的边界框回归器”

在推理时,将检测器置信值阈值设为0.05后,每一FPN层仅最多解码得分前1000的预测的框,最后使用阈值为0.5的NMS得到最终结果。

作者强调了一下,Focal loss应用于每幅图像生成约100k的所有的锚上。(其他方法每个batch挑一小批锚),因此这是所有框的损失之和,由分配给真值框的锚的数量来normalized(除以N,N是真值框的数量),而不是全部锚点。因为绝大多数锚点都是简单的反例,在focal loss上可以忽略不计。γ与α会相互作用,γ = 2,α = 0.25效果最好。

(好像有几个卷积层有偏置项?可能是子网有)初始化有个地方不太一样,分类子网的最后一个卷积层将偏置初始化为b=-log((1-π)/π),π表示在训练开始时每个锚应被标记为置信值为~π的前景,π = 0.01。该初始化可以防止大量的背景锚在第一次迭代训练时产生一个巨大的、破坏稳定的loss值。

锚密度:在一阶段检测系统中,最重要的设计因素之一是它在可能的图像框的空间上覆盖地有多密集。双阶段检测器可以在任何位置、比例和长宽比使用区域池化操作[10]对框进行分类。相比之下,由于单阶段检测器使用固定的采样网格,在这些方法中,实现框高覆盖率的一种流行方法是在每个空间位置使用多个“锚”[28]来覆盖不同比例和纵横比的框。
我们扫描了FPN中每个空间位置和每个金字塔级别使用的尺度和纵横比锚的数量。我们考虑了从每个位置的单个方形锚到每个位置跨越4个亚八度音阶(2k/4, k≤3)和3个纵横比[0.5,1,2]的12个锚的情况。使用ResNet-50的结果如表1c所示。仅使用一个方形锚就可以获得令人惊讶的30.3 AP。然而,当每个位置使用3个尺度和3个纵横比时,AP可以提高近4个点(到34.0)。在这项工作中,我们在其他所有实验中都使用了这种设置。
最后,我们注意到超过6-9个锚点并没有表现出进一步的收益。因此,虽然双阶段系统可以为图像中的任意框分类,性能w.r.t.密度的饱和意味着双阶段系统的更高的潜在密度可能没有优势。
 

 

网络架构:

        基于Resnet的FPN网络,具有P3~P7五个尺寸的特征映射,步幅分别从23~27

        具有Heads结构,有两个分支,即从Pi结构出来后:

                4个卷积层后是分类分支:一个3×3的卷积层,有KA个卷积核,对应K个类别,A个锚框。使用了K个二分类器,sigmoid激活函数

                4个卷积层后是回归分支:从为这A个锚框计算offsets,与RCNN一致

锚框的设置:

        在三个纵横比{1:2, 1:1, 2:1}的基础上,增加了3纵横比锚的原始集合的尺寸为{20, 21/3, 22/3}的锚,在每个level上有A=9个锚,对应原图覆盖范围从32到813像素。(在每个level上的锚框,到底是在level之间一致,还是映射回原图后一致(在level上相应地缩小的倍数)如果尺寸等都是一致的,由于不同level的步幅不同,映射回原图的尺寸也就不一致了?)

样本选择策略:

        在特征映射上滑动一个锚框,并将该锚框映射到原图上,若该锚框与真值框IoU≥0.5则记为正样本,其训练标签为真值框的标签(onehot),一个锚框仅分配一个真值框;若在[0, 0.4)这个区间内记为负样本,训练标签为0(onehot);其余的锚框就被抛弃了。

训练策略:

        输入图像,经前向传播后流到P3~P7,经Head为每个Pi每个像素(A个锚框)预测类别c,offsets,每层金字塔Pi分配A个锚框,并根据样本选择策略选出正/负样本,计算与真实值的loss(当label为0即背景时,仅计算c,不计算reg)并反向传播;对于正样本(锚框),训练targets为真值框的类别c*,以及距离真值框的offsets;对于负样本(锚框),训练targets为背景0。

        分类子网最后一个卷积层的偏置初始化为b=-log((1-p)/p),其中π = 0.01,其余分类、回归子网每一层的weight为σ = 0.01的高斯权重,偏置b = 0

        迭代次数90K,初始学习率0.01,mini-batch为16,学习率在60K到80K时分别下降10倍,权重衰减0.0001,动量0.9

损失函数:

        联合损失:分类+回归

                分类:使用focal损失,FL(pt)=-αt(1-pt)γlog(pt),取γ = 2,α = 0.25。同时计算正/负样本,取平均时只除以正样本

                回归:文中未提及,应该使用与RPN一致的回归损失计算方法

inference:

        输入图像,经前向传播后流到P3~P7,经Head为每个Pi每个像素(A个锚框)预测KA个类别c,4A个offsets

        根据置信值(类别c)对预测框进行阈值为0.5的NMS

总结:

        作者认为双阶段目标检测太慢,单阶段未来会是主流,因此尝试使双阶段代表性的Faster RCNN中的第一阶段RPN在输出proposal的同时,直接输出类别,免去第二阶段区域池化再分类,回归的麻烦。但是又发现效果太差,原因是分类分支有问题:在使用普通的BCE时,容易预测(简单)的负样本(锚框)数量过多,即使单个负样本返回的loss值很小,把它们累加到一起也是一个巨大的loss,而难以分对的(困难)样本数量占比较少,再归一化(除以N)之后,loss基本上只能对容易预测的负样本施加惩罚,失去了识别正样本的能力。如果仅是加上一个α也不行,它可以平衡正/负例的重要性,但却无法区分简单/困难样本,因此提出了focal loss。有了锚,在做框回归时更“容易”一些。但随后张士峰的工作又证明了:如果每个像素点只有一个锚,它的效果与无锚的是一致的,区别仅在于样本选择策略。RetinaNet(单锚)在不同的金字塔层上为每个像素点生成锚框,同时通过计算与真值框的IoU来确定正/负样本。而FCOS则是根据像素点的空间位置选择候选正样本,又通过尺寸约束为某一级别的金字塔分配正样本,其余为负样本(原来的负样本还是负样本,候选正样本被分配到不同等级的金字塔中,不属于该等级的被标记为负样本)。对于RetinaNet,阈值的选择直接影响到检测结果,但是一个统一的阈值并不适用于每一幅图像,因此过分严苛的阈值直接影响了正样本数量;而FCOS则较好地解决了这个问题。RetinaNet在使用了ATSS后,即使给了9个锚,仍然与1个锚的结果相似。

        因此,RetinaNet中锚的作用①作为一个样本选择的依据,通过锚和真值框的阈值来选择样本;②在做框回归时以锚框为基准,更容易回归到一个准确的位置。

        但是锚的存在也有弊端,它属于一种先验,使用了不当的锚会使效果变差。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值