Mask R-CNN综述
本专栏将从论文的角度解读一下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是一个比较有效的改进。
3、Mask 分支
这也是最为关键也是比较难理解的一个部分,因为这个分支直接关系到分割的效果。
首先是一个 Head 模块,由于前面进行了多次卷积和池化,减小了对应的分辨率,Mask 分支先利用反卷积进行分辨率的提升,同时减少通道的个数,将RoI尺寸变成14x14x256。
最后经由FCN输出了28x28x80的 mask ,这里的80是类别数,28为特征图大小,指用28×28个像素点来描述80个分类的分割外形。这一分支的损失函数 Lmask 使用的是二值交叉熵损失函数,即用于二分类的交叉熵损失函数,对于 28×28 中的每个点,都会输出80个二值 mask(每个类别使用sigmoid输出)。
需要注意的是,计算loss的时候,并不是每个类别的sigmoid输出都计算二值交叉熵损失,而是该像素属于哪个类,哪个类的sigmoid输出才要计算损失,并且在测试的时候,先通过分类分支预测的类别再来选择相应的类别做 mask 预测。这与FCN原文中所用的方法不同,FCN是对每个像素进行多类别softmax分类,然后计算交叉熵损失,相当于同时进行分类和逐像素预测,很明显,这种做法是会造成类间竞争的,而每个类别使用sigmoid输出并计算二值损失,可以避免类间竞争,论文中的实验也表明,通过这种方法,可以较好地提升性能:
而且FCN也是有效的:
总结
Mask R-CNN是集成了很多工作综合而成的多任务模型,比如用FPN来代替Faster R-CNN中传统的CNN、利用FCN进行分割任务且将FCN中的分类和分割解耦成两个分支;主要贡献有两点:第一是在Faster R-CNN上面加了一个 Mask 预测分支,较好地完成了实例分割任务;第二则是由于需要像素级的精确定位,提出了RoI Align改良RoI Pooling,取得了不错的效果。