Mask RCNN
论文:Mask R-CNN
发表时间:2018
发表作者:(Facebook AI Research)Kaiming He, Georgia Gkioxari, Piotr Dollar, Ross Girshick
论文链接:论文链接
论文代码:Facebook代码链接;Tensorflow版本代码链接; Keras and TensorFlow版本代码链接;MxNet版本代码链接
Mask R-CNN是一个实例分割(Instance segmentation)算法,可以用来做“目标检测”、“目标实例分割”、“目标关键点检测”。Mask RCNN以Faster RCNN原型,增加了一个分支用于分割任务。Mask RCNN比Faster RCNN速度慢一些,达到了5fps。
Mask R-CNN引入了RoI Align代替Faster RCNN中的RoI Pooling。因为RoI Pooling并不是按照像素一一对齐的(pixel-to-pixel alignment),也许这对bbox的影响不是很大,但对于mask的精度却有很大影响。使用RoI Align后mask的精度从10%显著提高到50%。引入语义分割分支,实现了mask和class预测的关系的解耦,mask分支只做语义分割,类型预测的任务交给另一个分支。这与原本的FCN网络是不同的,原始的FCN在预测mask时还用同时预测mask所属的种类。
结构
整个Mask R-CNN算法的思路很简单,就是在原始Faster-rcnn算法的基础上面增加了FCN来产生对应的MASK分支。即Faster-rcnn + FCN,更细致的是 RPN + ROIAlign + Fast-rcnn + FCN。
FCN
FCN算法是一个经典的语义分割算法,可以对图片中的目标进行准确的分割。其总体架构如图所示,它是一个端到端的网络,主要的模快包括卷积和去卷积,即先对图像进行卷积和池化,使其feature map的大小不断减小;然后进行反卷积操作,即进行插值操作,不断的增大其feature map,最后对每一个像素值进行分类。从而实现对输入图像的准确分割。
OI Pooling和ROIAlign最大的区别是:前者使用了两次量化操作,而后者并没有采用量化操作,使用了线性插值算法,具体的解释如下所示。
![Mask R-CNN5][base64str5]
LOSS计算与分析
由于增加了mask分支,每个ROI的Loss函数如下所示:
L = L_{cls}+L_{box}+L_{mask}
\]
其中Lcls和Lbox和Faster r-cnn中定义的相同。对于每一个ROI,mask分支有$Kmm$维度的输出,其对K个大小为$mm$的mask进行编码,每一个mask有K个类别。使用了per-pixel sigmoid,并且将Lmask定义为the average binary cross-entropy loss 。对应一个属于GT中的第k类的ROI,Lmask仅仅在第k个mask上面有定义(其它的k-1个mask输出对整个Loss没有贡献)。
定义的Lmask允许网络为每一类生成一个mask,而不用和其它类进行竞争;依赖于分类分支所预测的类别标签来选择输出的mask。这样将分类和mask生成分解开来。这与利用FCN进行语义分割的有所不同,它通常使用一个per-pixel sigmoid和一个multinomial cross-entropy loss ,在这种情况下mask之间存在竞争关系;而由于本文使用了一个per-pixel sigmoid 和一个binary loss ,不同的mask之间不存在竞争关系。经验表明,这可以提高实例分割的效果。
一个mask对一个目标的输入空间布局进行编码,与类别标签和BB偏置不同,它们通常需要通过FC层而导致其以短向量的形式输出。可以通过由卷积提供的像素和像素的对应关系来获得mask的空间结构信息。具体的来说,使用FCN从每一个ROI中预测出一个$m*m$大小的mask,这使得mask分支中的每个层能够明确的保持m×m空间布局,而不将其折叠成缺少空间维度的向量表示。和以前用fc层做mask预测的方法不同的是,实验表明mask表示需要更少的参数,而且更加准确。这些像素到像素的行为需要ROI特征,而ROI特征通常是比较小的feature map,其已经进行了对齐操作,为了一致的较好的保持明确的单像素空间对应关系,提出了ROIAlign操作。
算法步骤
Mask R-CNN算法步骤:
- 首先,输入一幅你想处理的图片,然后进行对应的预处理操作,或者预处理后的图片;
- 然后,将其输入到一个预训练好的神经网络中(ResNeXt等)获得对应的feature map;
- 接着,对这个feature map中的每一点设定预定个的ROI,从而获得多个候选ROI;
- 接着,将这些候选的ROI送入RPN网络进行二值分类(前景或背景)和BB回归,过滤掉一部分候选的ROI;
- 接着,对这些剩下的ROI进行ROIAlign操作(即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来);
- 最后,对这些ROI进行分类(N类别分类)、BB回归和MASK生成(在每一个ROI里面进行FCN操作)。
总结
Mask R-CNN论文的主要贡献包括以下几点:
- 分析了ROI Pool的不足,提升了ROIAlign,提升了检测和实例分割的效果;
- 将实例分割分解为分类和mask生成两个分支,依赖于分类分支所预测的类别标签来选择输出对应的mask。同时利用Binary Loss代替Multinomial Loss,消除了不同类别的mask之间的竞争,生成了准确的二值mask;
- 并行进行分类和mask生成任务,对模型进行了加速。
参考:
Mask RCNN