yolact模型详解

网络结构图

在这里插入图片描述

关于实验中的细节问题

SGD和Adam
在yolact的实验过程中,我们发现同样的数据和学习率,为什么SGD行之有效,Adam却会导致mAP下降为0?是什么导致了Adam的完全失效?
先来了解下两个优化器的不同机制(这个专栏的三部曲讲的很好:https://zhuanlan.zhihu.com/p/32338983
SGD是带一阶动量的梯度下降(也就是融合了过往的梯度方向);
Adam是带一阶动量、二阶动量(也就是过往一段iteration内梯度的平方和,希望频繁更新的参数不要更新的过大,很少更新的参数可以多更新一点梯度);
文章指出:虽然Adam收敛速度很快,但是要达到比较好的效果,一般都是SGD精调出来的结果,SGD的话,收敛速度会慢一些,所以可以采用前期Adam,后期SGD的优化方案.由于Adam加入了二阶动量来主导梯度方向,后面随着二阶动量的变化,可能导致梯度过小或者过大,不利于收敛;
在Towards Theoretically Understanding Why SGDGeneralizes Better Than ADAMin Deep Learning这篇文章中,作者试图解释为什么SGD收敛的算法的泛化效果要由于Adam;
这篇博客(https://shaoanlu.wordpress.com/2017/05/29/sgd-all-which-one-is-the-best-optimizer-dogs-vs-cats-toy-experiment/)总结了SGD+动量拥有更好的泛化性,尽管在训练集上Adam的准确率最高,而且Adam的泛化性跟SGD+动量相差不是特别大,但是后者在验证集上的表现更稳定,adam表现得有轻微得震荡。

冻结BN层
在yolact的实验过程中,我们发现,取消冻结BN层,验证集Map会下降,反之冻结BN层,验证集map会提升,这是为什么?
在一篇介绍为何在精调中冻结BN的博客中,我们找到以下答案:
在训练过程中,对变化的批次进行统计是一个类似正则化的行为,可以提升模型的泛化性,这是一个减少过拟合的方式,尤其是在非常多次迭代的训练当中。事实上,运用非常大的batch_size会伤害泛化性是因为batch 统计参数的变化会很小,伤害了正则化。在精调中,使用的数据集可能不同于训练中的数据集,如果不冻结BN层,Gamma和Beta的数值可能会有较大的变化,导致整个网络的参数发生重新学习,这个在小数据集和精调中是不现实的。
推理我们可以得出:
在迁移学习中,比如本实验也用了Resnet的预训练模型,同时,我们自己的数据集样本量比较少,只有600多张.在作者的源代码中,如果batch_size per GPU>6,则不冻结BN

总结

传统方案用框来定位目标的位置,然后再做分割,这是一个二阶段的网络,作者为了加速,同时生成框(框的置信度,框的坐标[x,y,w,h],mask_dim)和针对全图的proto_out,其中的框的主要作用在于定位实例目标,proto_out的主要目标在于语义分割,二者结合完成实例分割的任务。

摘要

我们提出了一个简单的、全卷积的实时实例分割,在coco数据集上获得了29.8map、单个Titan GPU上取得了33.5fps,比之前任何一个有竞争力的方案都要快。我们将实例分割分成两个并行的子任务:(1)生成一系列prototype的mask;(2)预测每一个实例mask的系数;(2)预测每一个实例mask的系数。然后我们生成实例mask通过线性地结合prototype和mask系数;我们发现由于这个过程不依赖于repooling,这个方案可以生成非常高质量的masks.同时,论文提出了一种Fast NMS,比标准的NMS要快12ms.

简介

boxes太蠢了,我是一个坚定的mask支持者—Joseph Redmon
怎样生成一个实时的实例分割的算法?
在过去的几年中,像MaskRCNN主要专注于精度。我们的目的就是做一个类似于SSD、YOLO快速的的实时的算法。然而,分割比检测要难多了,TwoStage的分割非常依赖于特征定位去生成masks,这些方法repooling boundingbox里面的feature(e.g., via RoIpool/align),然后将这些定位后的特征放到mask分类器,这种方案完全是顺序的,很难进行加速。OneStage并行执行这些操作,但是在定位后需要很多后处理,也很难实现实时。
为了解决这些问题,我们提出了yolact,一个放弃了明确的定位的实时实例分割网络。yolact将网络分为两个步骤:(1)在全图上生成prototype masks(2)在每一个实例上预测一系列线性组合系数。通过这两部分产生全图的实例分割非常简单。对于每一个实例,线性地结合prototype和对应预测的系数,同时产生预测的boundingbox.通过这种分割方式,网络自身学习到了如何定位实例mask。
prototype masks的个数独立于于分类的个数(也就是说分类的个数可以多于prototype),Yolact通过对分类学习分布式的表达,一些prototypes学习的是轮廓,一些学习的是定位,一些学习的是位置敏感的编码,而大部多数是将这些任务进行结合。
本方案也有一些实际上的优势,首先,它很快,这是由于它并行的结构和轻量级的处理过程,当使用ResNet-101也能达到30fps,整个mask分支只用了5ms,而且mask生成的质量也很高,因为repool的过程没有损失。
同时该论文还给出了一系列的实验参数结果,比如不同的backbone的结果。
maskRCNN是有两个步骤,我们的方案中去掉了特征定位的过程(repooling),我们把复杂的任务变成两个简单并行的任务,第一步用FCN获得一系列不依赖于任何实例的prototype masks,第二部增加一个目标检测的分支对每一个anchor预测mask coefficients,经过NMS,结合这两者获得最后的mask.
在实例分割的任务中,像素是空间相关的,也就是邻近的像素属于同一实例的可能性更大,卷积很好地体现了空间相关性,全连接却不行。

猜你喜欢

转载自blog.csdn.net/weixin_39326879/article/details/106931707