《Mask R-CNN》论文阅读之Mask R-CNN

时间:2022-07-27 06:32:21

导读

Mask R-CNN是ICCV 2017的best paper,彰显了机器学习计算机视觉领域在2017年的最新成果。在机器学习2017年的最新发展中,单任务的网络结构已经逐渐不再引人瞩目,取而代之的是集成,复杂,一石多鸟的多任务网络模型。Mask R-CNN就是典型的代表。本篇大作的一作是何凯明,在该篇论文发表的时候,何凯明已经去了FaceBook。

Mask-RCNN 大体框架还是 Faster-RCNN 的框架,可以说在基础特征网络之后又加入了全连接的分割子网,由原来的两个任务(分类+回归)变为了三个任务(分类+回归+分割)

论文地址:Mask R-CNN 
源代码:matterport - github

简介

Mask R-CNN是一个小巧、灵活的通用对象实例分割框架(object instance segmentation)。它不仅可对图像中的目标进行检测,还可以对每一个目标给出一个高质量的分割结果。它在Faster R-CNN[1]基础之上进行扩展,并行地在bounding box recognition分支上添加一个用于预测目标掩模(object mask)的新分支。该网络还很容易扩展到其他任务中,比如估计人的姿势,也就是关键点识别(person keypoint detection)。该框架在COCO的一些列挑战任务重都取得了最好的结果,包括实例分割(instance segmentation)、候选框目标检测(bounding-box object detection)和人关键点检测(person keypoint detection)。
《Mask R-CNN》论文阅读之Mask R-CNN


《Mask R-CNN》论文阅读之Mask R-CNN

可以看到,在实例分割Mask R-CNN框架中,还是主要完成了三件事情:

   1) 目标检测,直接在结果图上绘制了目标框(bounding box)。

   2) 目标分类,对于每一个目标,需要找到对应的类别(class),区分到底是人,是车,还是其他类别。

   3) 像素级目标分割,在每个目标中,需要在像素层面区分,什么是前景,什么是背景。


Mask R-CNN(简称MRCNN)是基于R-CNN系列、FPN、FCIS等工作之上的,MRCNN的思路很简洁:Faster R-CNN针对每个候选区域有两个输出:种类标签和bbox的偏移量。那么MRCNN就在Faster R-CNN的基础上通过增加一个分支进而再增加一个输出,即物体掩膜(object mask)。

Mask R-CNN是继承于Faster R-CNN (2016)的,Mask R-CNN只是在Faster R-CNN上面加了一个Mask Prediction Branch (Mask 预测分支),并且改良了ROI Pooling,提出了ROI Align。从统计数据来看,"Faster R-CNN"在Mask R-CNN论文的前三章中出现了二十余次,因此,如果不了解Ross Girshick和何凯明之前的工作,是很难弄懂Mask R-CNN的。所以,笔者在解析Mask R-CNN之前,先给大家分析一下Faster R-CNN。而Faster R-CNN是继承于Fast R-CNN (2015),Fast R-CNN继承于R-CNN (2014)。下面一一介绍下。


在CVPR 2014年中Ross Girshick提出的 R-CNN 中,使用到了 卷积神经网络 来进行目标检测。
《Mask R-CNN》论文阅读之Mask R-CNN

首先模型输入为一张图片,然后在图片上提出了约2000个待检测区域,然后这2000个待检测区域 一个一个地 (串联方式)通过卷积神经网络提取特征,然后这些被提取的特征通过一个支持向量机(SVM)进行分类,得到物体的类别,并通过一个bounding box regression调整目标包围框的大小。

R-CNN在物体检测上的解决方案
《Mask R-CNN》论文阅读之Mask R-CNN


首先在第一步提取2000个待检测区域的时候,是通过一个2012年提出的方法,叫做 selective search 。简单来说就是通过一些传统图像处理方法将图像分成若干块,然后通过一个SVM将属于同一目标的若干块拿出来。selective search的核心是一个SVM,架构如下所示:
《Mask R-CNN》论文阅读之Mask R-CNN


   然后在第二步进行特征提取的时候,Ross直接借助了当时深度学习的最新成果AlexNet (2012)。那么,该网络是如何训练的呢?是直接在ImageNet上面训练的,也就是说,使用图像分类数据集训练了一个仅仅用于提取特征的网络。

   在第三步进行对目标的时候,使用了一个支持向量机(SVM),在训练这个支持向量机的时候,结合目标的标签(类别)与包围框的大小进行训练,因此,该支持向量机也是被单独训练的。

   在2014年R-CNN横空出世的时候,颠覆了以往的目标检测方案,精度大大提升。对于R-CNN的贡献,可以主要分为两个方面:

   1) 使用了卷积神经网络进行特征提取

   2) 使用bounding box regression进行目标包围框的修正

   但是,我们来看一下,R-CNN有什么问题:

   1) 耗时的selective search,对一帧图像,需要花费2s。

   2) 耗时的串行式CNN前向传播,对于每一个RoI,都需要经过一个AlexNet提特征,为所有的RoI提特征大约花费47s。

   3) 三个模块是分别训练的,并且在训练的时候,对于存储空间的消耗很大。



面对这种情势,Ross在2015年提出的 Fast R-CNN 进行了改进,下面我们来概述一下Fast R-CNN的解决方案:

Fast R-CNN在SPPNet的基础再跟进,进一步提升速度和准确率,提出了RoI层代替SPP层,实现了整个物体检测模型大部分网络的end-to-end

《Mask R-CNN》论文阅读之Mask R-CNN

Fast R-CNN的想法是将整个模型分成两步:

  • 第一步是选取候选区域;
  • 第二步就是提出一个RoI层,整合了整个模型,把CNN、变换层、SVM分类器、bbox回归这几个模块整一起,大家一起训练

首先还是采用selective search提取2000个候选框,然后,使用一个神经网络对全图进行特征提取。接着,使用一个RoI Pooling Layer在全图特征上摘取每一个RoI对应的特征,再通过全连接层(FC Layer)进行分类与包围框的修正。Fast R-CNN的贡献可以主要分为两个方面:

   1) 取代R-CNN的串行特征提取方式,直接采用一个神经网络对全图提取特征(这也是为什么需要RoI Pooling的原因)。

   2) 除了selective search,其他部分都可以合在一起训练。

新的模型效果很好,因为多个训练阶段合并了,训练后面阶段的同时可以更新前面阶段的参数,模型收敛的更好了。同时因为多个阶段合并,候选区域的特征不需要在写入磁盘,一直在显存中,训练的速度大大的提升。

可是,Fast R-CNN也有缺点,体现在耗时的selective search还是依旧存在。那么,如何改良这个缺陷呢?发表于2016年的Faster R-CNN进行了如下创新:

   取代selective search,直接通过一个Region Proposal Network (RPN)生成待检测区域,这么做,在生成RoI区域的时候,时间也就从2s缩减到了10ms。我们来看一下Faster R-CNN是怎么做的。

《Mask R-CNN》论文阅读之Mask R-CNN
从RCNN到Fast R-CNN,再到Faster R-CNN,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。剔除了大部分的计算冗余,大部分训练过程在GPU中完成,进一步提高了运行速度。

Faster R-CNN主要用两个模块组成:

  • 第一个模块是深层的全卷积网络用于区域推荐
  • 第二个模块是Fast R-CNN detector.

Faster R-CNN可以看做”区域生成网络+fast R-CNN”的系统,用区域生成网络代替Fast-RCNN中的Selective Search方法,来产生一堆候选区域。

首先使用共享的卷积层为全图提取特征,然后将得到的feature maps送入RPN,RPN生成待检测框(指定RoI的位置)并对RoI的包围框进行第一次修正。之后就是Fast R-CNN的架构了,RoI Pooling Layer根据RPN的输出在feature map上面选取每个RoI对应的特征,并将维度置为定值。最后,使用全连接层(FC Layer)对框进行分类,并且进行目标包围框的第二次修正。尤其注意的是,Faster R-CNN真正实现了端到端的训练(end-to-end training)


《Mask R-CNN》论文阅读之Mask R-CNN


 如上图所示,Faster R-CNN的结构主要分为三大部分,第一部分是 共享的卷积层 -backbone,第二部分是 候选区域生成网络 -RPN,第三部分是 对候选区域进行分类的网络 -classifier。其中,RPN与classifier部分均对目标框有修正。classifier部分是原原本本继承的Fast R-CNN结构。

最后,回到本文的重点,Mask R-CNN.

 下图阐述了Mask R-CNN的Mask branch:

《Mask R-CNN》论文阅读之Mask R-CNN

   在Mask R-CNN中的RoI Align之后有一个"head"部分,主要作用是将RoI Align的输出维度扩大,这样在预测Mask时会更加精确。在Mask Branch的训练环节,作者没有采用FCN式的SoftmaxLoss,反而是输出了K个Mask预测图(为每一个类都输出一张),并采用average binary cross-entropy loss训练,当然在训练Mask branch的时候,输出的K个特征图中,也只是对应ground truth类别的那一个特征图对Mask loss有贡献。

 Mask R-CNN的训练损失函数可以描述为:

《Mask R-CNN》论文阅读之Mask R-CNN

   在上式中,Lbox和Lmask都是对positive RoI才会起作用的。

   在Mask R-CNN中,相较于Faster R-CNN还有些略微的调整,比如positive RoI被定义成了与Ground truth的IoU大于0.5的(Faster R-CNN中是0.7)。太过于细节的东西本篇博文不再赘述,详情参见Mask R-CNN中的Implementation Details。


MRCNN采用和Faster R-CNN相同的两个阶段,具有相同的第一层(即RPN),第二阶段,除了预测种类和bbox回归,并且并行的对每个RoI预测了对应的二值掩膜(binary mask)。示意图如下:

《Mask R-CNN》论文阅读之Mask R-CNN

这样做可以将整个任务简化为mulit-stage pipeline,解耦了多个子任务的关系,现阶段来看,这样做好处颇多。

主要工作

损失函数的定义

依旧采用的是多任务损失函数,针对每个每个RoI定义为

L=Lcls+Lbox+LmaskL=Lcls+Lbox+Lmask
LclsLboxLcls,Lbox 与Faster R-CNN的定义类似,这里主要看 LmaskLmask

掩膜分支针对每个RoI产生一个Km2Km2的输出,即K个分辨率为m×mm×m的二值的掩膜KK为分类物体的种类数目。依据预测类别分支预测的类型ii,只将第ii的二值掩膜输出记为LmaskLmask。 
掩膜分支的损失计算如下示意图:

  1. mask branch 预测KK个种类的m×mm×m二值掩膜输出
  2. 依据种类预测分支(Faster R-CNN部分)预测结果:当前RoI的物体种类为ii
  3. ii个二值掩膜输出就是该RoI的损失Lmask

《Mask R-CNN》论文阅读之Mask R-CNN



对于预测的二值掩膜输出,我们对每个像素点应用sigmoid函数,整体损失定义为平均二值交叉损失熵。 
引入预测KK个输出的机制,允许每个类都生成独立的掩膜,避免类间竞争。这样做解耦了掩膜和种类预测。不像是FCN的方法,在每个像素点上应用softmax函数,整体采用的多任务交叉熵,这样会导致类间竞争,最终导致分割效果差。

掩膜表示到RoIAlign层

在Faster R-CNN上预测物体标签或bbox偏移量是将feature map压缩到FC层最终输出vector,压缩的过程丢失了空间上(平面结构)的信息,而掩膜是对输入目标做空间上的编码,直接用卷积形式表示像素点之间的对应关系那是最好的了。

输出掩膜的操作是不需要压缩输出vector,所以可以使用FCN(Full Convolutional Network),不仅效率高,而且参数量还少。为了更好的表示出RoI输入和FCN输出的feature之间的像素对应关系,提出了RoIAlign层。

先回顾一下RoIPool层:

其核心思想是将不同大小的RoI输入到RoIPool层,RoIPool层将RoI量化成不同粒度的特征图(量化成一个一个bin),在此基础上使用池化操作提取特征。

关键点1:解决特征图与原始图像上的RoI不对准问题

下图是SPPNet内对RoI的操作,在Faster R-CNN中只使用了一种粒度的特征图:
《Mask R-CNN》论文阅读之Mask R-CNN

平面示意图如下:


《Mask R-CNN》论文阅读之Mask R-CNN


这里面存在一些问题,在上面量操作上,实际计算中是使用的是[x/16][x/16]1616的量化的步长,[·][·]是舍入操作(rounding)。这套量化舍入操作在提取特征时有着较好的鲁棒性(检测物体具有平移不变性等),但是这很不利于掩膜定位,有较大负面效果。


解决方案:

针对这个问题,提出了RoIAlign层:避免了对RoI边界或bin的量化操作,在扩展feature map时使用双线性插值算法。

作者提出RoIAlign层来解决这个问题,并且将提取到的特征与输入对齐。方法很简单,避免对RoI的边界或者块(bins)做任何量化,例如直接使用x/16代替[x/16]。作者使用双线性插值(bilinear interpolation)在每个RoI块中4个采样位置上计算输入特征的精确值,并将结果聚合(使用max或者average)。

这里实现的架构要看FPN论文:

《Mask R-CNN》论文阅读之Mask R-CNN
一开始的Faster R-CNN是基于最上层的特征映射做分割和预测的,这会丢失高分辨下的信息,直观的影响就是丢失小目标检测,对细节部分丢失不敏感。受到SSD的启发,FPN也使用了多层特征做预测。这里使用的top-down的架构,是将高层的特征反卷积带到低层的特征(即有了语义,也有精度),而在MRCNN论文里面说的双线性差值算法就是这里的top-down反卷积是用的插值算法。


关键点2:将掩模预测和分类预测拆解


该框架对每个类别独立地预测一个二值掩模,没有引入类间竞争,每个二值掩模的类别依靠网络RoI分类分支给出的分类预测结果。 这与FCNs不同,FCNs是对每个像素进行多类别分类,它同时进行分类和分割,基于实验结果表明这样对于对象实例分割会得到一个较差的性能。

下面介绍一下更多的细节,在训练阶段,作者对于每个采样的RoI定义一个多任务损失函数《Mask R-CNN》论文阅读之Mask R-CNN,前两项不过多介绍。掩模分支对于每个RoI会有一个《Mask R-CNN》论文阅读之Mask R-CNN维度的输出,它编码了K个分辨率为《Mask R-CNN》论文阅读之Mask R-CNN的二值掩模,分别对应着K个类别。因此作者利用了a per-pixel sigmoid,并且定义《Mask R-CNN》论文阅读之Mask R-CNN为平均二值交叉熵损失(the average binary cross-entropy loss)。对于一个属于第k个类别的RoI,《Mask R-CNN》论文阅读之Mask R-CNN仅仅考虑第k个mask(其他的掩模输入不会贡献到损失函数中)。这样的定义会允许对每个类别都会生成掩模,并且不会存在类间竞争。

关键点3:掩模表示

一个掩模编码了一个输入对象的空间布局。作者使用了一个FCN来对每个RoI预测一个《Mask R-CNN》论文阅读之Mask R-CNN的掩模,这保留了空间结构信息。


到这里再将Mask R-CNN和 FCIS 做个比较,首先两者的相同点是 均继承了Faster R-CNN的RPN部分 不同点是对于FCIS,预测mask和分类是共享的参数。而Mask R-CNN则是各玩各的,两个任务各自有各自的可训练参数。对于这一点,Mask R-CNN论文里还专门作了比较,显示对于预测mask和分类如果使用共享的特征图对于某些重叠目标可能会出现问题。
《Mask R-CNN》论文阅读之Mask R-CNN

Mask R-CNN的实验取得了很好的效果,达到甚至超过了state-of-the-art的水平。不过训练代价也是相当大的,需要 8 块GPU联合训练。
《Mask R-CNN》论文阅读之Mask R-CNN



Mask R-CNN的实验非常详细,还做了很多对比实验,比如说改换网络深度,在训练mask branch时的误差种类,将RoI Align同RoI Pooling和RoI Warping进行比较,改变预测mask的方式(FCN和全连接层)等,详情请参见Mask R-CNN的实验部分。

《Mask R-CNN》论文阅读之Mask R-CNN


针对关键点1:
《Mask R-CNN》论文阅读之Mask R-CNN

针对关键点2:
《Mask R-CNN》论文阅读之Mask R-CNN

针对关键点3:

《Mask R-CNN》论文阅读之Mask R-CNN


结果展示:
《Mask R-CNN》论文阅读之Mask R-CNN


MRCNN有着优异的效果,除去了掩膜分支的作用,很大程度上是因为基础特征网络的增强,论文使用的是ResNeXt101+FPN的top-down组合,有着极强的特征学习能力,并且在实验中夹杂这多种工程调优技巧。



附:

1.R-CNN
R-CNN经典论文 《Rich feature hierarchies for Accurate Object Detection and Segmentation 

文章解读可以参见这里 《Rich feature hierarchies for accurate object detection and semantic segmentation》论文阅读之R-CNN


3.Fast R-CNN
论文: Fast R-CNN
文章解读:《Fast R-CNN》论文阅读之Fast R-CNN

4.Faster R-CNN
论文: Faster R-CNN
文章解读:《Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks》论文阅读之Faster R-CNN

5.Mask R-CNN

论文地址: Mask R-CNN  
文章解读: 《Mask R-CNN》论文阅读之Mask R-CNN



参考文献:

1.https://blog.csdn.net/jiongnima/article/details/79094159

2.https://blog.csdn.net/u011974639/article/details/78483779?locationNum=9&fps=1

3.https://blog.csdn.net/u011974639/article/details/78053203

4.https://zhuanlan.zhihu.com/p/25954683