本专栏将从论文的角度解读一下CV方向的一些经典神经网络模型及其贡献与意义,以期加深自己的印象,后续可以随时翻看并且学习其中好的tricks。这一期介绍基于 Faster R-CNN 的 Mask R-CNN ,看看其如何改进使得模型出色地完成了实例分割任务。
论文相关信息
论文(链接)使用的数据集是MS COCO数据集,并且力压前几届的冠军模型们,比如FCIS,在COCO系列挑战赛的实例分割、边框目标检测以及人体关键点检测三个赛道中都取得了最佳成绩。
网络架构
论文中的架构图:
更为清晰的图,转自这里:
从上图与 Faster R-CNN 的架构对比可以看出,首先是在用于提取特征的 backbone 部分,利用了 FPN(Feature Pyramid Network,特征金字塔网络,为了解决多尺度检测的问题而引入,具体可以看这篇博客)来代替 CNN ,然后利用RoI Align代替了 RoI Pooling,并且多了一个基于FCN(Fully Convolutional Network,全卷积网络,用于语义分割,具体可以看这篇博客)的用于逐像素实例分割的 Mask Prediction Branch,变成了一个三分支的多任务模型。
tricks
1、backbone部分:FPN or CNN
要看懂这里的实验首先必须先理解一下 Faster R-CNN 的架构和 FPN架构(图转自这里):
和
论文中的实验,其中C4代表的就是原始的利用Conv4的特征图:
结果应该是比较显然的,毕竟在目标检测中对于小物体,传统的CNN经过卷积池化之后可能在特征图上都没有小物体的特征了,所以能够融合低层和高层特征语义信息然后综合进行预测的FPN做的会更好,而且几乎没有消耗额外的资源,这才是FPN最厉害的地方。
2、RoI Pooling or RoI Align
这里直接转一下这篇博客里的原话:
论文中的实验:
d组相比于c组的stride 16使用了更大的stride 32,更小的特征图会放大没有对准的缺点,所以RoI Align是一个比较有效的改进,这也是能够把目标检测模型 Faster R-CNN 迁移到实例分割这个难度高了好几档的任务中来的关键之处。
3、Mask 分支
这是最为关键也是比较难理解的一个部分,因为这个分支直接关系到分割的效果,要理解 Mask 分支还是得稍微了解一下以前的模型DeepMask,尤其是在我看论文这部分的时候根本不知道 mask 表示什么的输出:
由于前面进行了多次卷积和池化,减小了对应的分辨率,Mask 分支先利用反卷积进行分辨率的提升,同时减少通道的个数,将RoI尺寸变成14x14x256,最后输出28x28x80的 mask ,这里的80是类别数,28为特征图大小,可以理解成对 28×28 的每个像素标定这个像素属于80个类的概率。最后将 28×28 的大小通过双线性插值上采样恢复成原图大小,得到二值化 mask :
这一分支的损失函数 Lmask 使用的是二值交叉熵损失函数,每个类别使用sigmoid输出。但需要注意的是,计算loss的时候,并不是每个类别的sigmoid输出都计算二值交叉熵损失,而是该像素属于哪个类,哪个类的sigmoid输出才要计算损失,并且在测试的时候,先通过分类分支预测的类别再来选择相应的类别做 mask 预测。这与FCN原文中所用的方法不同,FCN是对每个像素进行多类别softmax分类,然后计算交叉熵损失,相当于同时进行分类和逐像素预测,很明显,这种做法是会造成类间竞争的,而每个类别使用sigmoid输出并计算二值损失,可以避免类间竞争,论文中的实验也表明,通过这种方法,可以较好地提升性能:
而且FCN也是有效的:
FCN其实本质上还是做了语义分割的任务,但是由于每个框都只对应一个GT,所以可以做成实例分割。此外,在看了SharpMask和MultiPathNet之后,感觉 FPN 和 这里的 FCN 是相辅相成的…
总结
Mask R-CNN是集成了很多工作综合而成的多任务模型,比如用FPN来代替Faster R-CNN中传统的CNN、利用FCN进行分割任务且将FCN中的分类和分割任务解耦了。主要贡献有两点:第一是加入了一个 Mask 预测分支,较好地将做目标检测的 Faster R-CNN 迁移到实例分割任务上来;第二则是由于需要像素级的精确定位,提出了RoI Align改良RoI Pooling,取得了不错的效果。