《Mask R-CNN》论文阅读
本文转载自:https://blog.csdn.net/Gavinmiaoc/article/details/80688570
导读
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
简介
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框架中,还是主要完成了三件事情:
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中,使用到了卷积神经网络来进行目标检测。
首先模型输入为一张图片,然后在图片上提出了约2000个待检测区域,然后这2000个待检测区域一个一个地(串联方式)通过卷积神经网络提取特征,然后这些被提取的特征通过一个支持向量机(SVM)进行分类,得到物体的类别,并通过一个bounding box regression调整目标包围框的大小。
R-CNN在物体检测上的解决方案
首先在第一步提取2000个待检测区域的时候,是通过一个2012年提出的方法,叫做selective search。简单来说就是通过一些传统图像处理方法将图像分成若干块,然后通过一个SVM将属于同一目标的若干块拿出来。selective search的核心是一个SVM,架构如下所示:
然后在第二步进行特征提取的时候,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
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是怎么做的。
从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)。
如上图所示,Faster R-CNN的结构主要分为三大部分,第一部分是共享的卷积层-backbone,第二部分是候选区域生成网络-RPN,第三部分是对候选区域进行分类的网络-classifier。其中,RPN与classifier部分均对目标框有修正。classifier部分是原原本本继承的Fast R-CNN结构。
最后,回到本文的重点,Mask R-CNN.
下图阐述了Mask R-CNN的Mask branch:
在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的训练损失函数可以描述为:
在上式中,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
)。示意图如下:
这样做可以将整个任务简化为mulit-stage pipeline,解耦了多个子任务的关系,现阶段来看,这样做好处颇多。
主要工作
损失函数的定义
依旧采用的是多任务损失函数,针对每个每个RoI定义为
L=Lcls+Lbox+LmaskL=Lcls+Lbox+Lmask
Lcls,LboxLcls,Lbox与Faster R-CNN的定义类似,这里主要看LmaskLmask。
掩膜分支针对每个RoI产生一个Km2Km2的输出,即K个分辨率为m×mm×m的二值的掩膜,KK为分类物体的种类数目。依据预测类别分支预测的类型ii,只将第ii的二值掩膜输出记为LmaskLmask。
掩膜分支的损失计算如下示意图:
- mask branch 预测KK个种类的m×mm×m二值掩膜输出
- 依据种类预测分支(Faster R-CNN部分)预测结果:当前RoI的物体种类为ii
- 第ii个二值掩膜输出就是该RoI的损失Lmask
对于预测的二值掩膜输出,我们对每个像素点应用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中只使用了一种粒度的特征图:
平面示意图如下:
这里面存在一些问题,在上面量操作上,实际计算中是使用的是[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论文:
一开始的Faster R-CNN是基于最上层的特征映射做分割和预测的,这会丢失高分辨下的信息,直观的影响就是丢失小目标检测,对细节部分丢失不敏感。受到SSD的启发,FPN也使用了多层特征做预测。这里使用的top-down的架构,是将高层的特征反卷积带到低层的特征(即有了语义,也有精度),而在MRCNN论文里面说的双线性差值算法就是这里的top-down反卷积是用的插值算法。
关键点2:将掩模预测和分类预测拆解
该框架对每个类别独立地预测一个二值掩模,没有引入类间竞争,每个二值掩模的类别依靠网络RoI分类分支给出的分类预测结果。这与FCNs不同,FCNs是对每个像素进行多类别分类,它同时进行分类和分割,基于实验结果表明这样对于对象实例分割会得到一个较差的性能。
下面介绍一下更多的细节,在训练阶段,作者对于每个采样的RoI定义一个多任务损失函数,前两项不过多介绍。掩模分支对于每个RoI会有一个
维度的输出,它编码了K个分辨率为
的二值掩模,分别对应着K个类别。因此作者利用了a per-pixel sigmoid,并且定义
为平均二值交叉熵损失(the average binary cross-entropy loss)。对于一个属于第k个类别的RoI,
仅仅考虑第k个mask(其他的掩模输入不会贡献到损失函数中)。这样的定义会允许对每个类别都会生成掩模,并且不会存在类间竞争。
关键点3:掩模表示
一个掩模编码了一个输入对象的空间布局。作者使用了一个FCN来对每个RoI预测一个的掩模,这保留了空间结构信息。
到这里再将Mask R-CNN和FCIS做个比较,首先两者的相同点是均继承了Faster R-CNN的RPN部分。不同点是对于FCIS,预测mask和分类是共享的参数。而Mask R-CNN则是各玩各的,两个任务各自有各自的可训练参数。对于这一点,Mask R-CNN论文里还专门作了比较,显示对于预测mask和分类如果使用共享的特征图对于某些重叠目标可能会出现问题。
Mask R-CNN的实验取得了很好的效果,达到甚至超过了state-of-the-art的水平。不过训练代价也是相当大的,需要8块GPU联合训练。
Mask R-CNN的实验非常详细,还做了很多对比实验,比如说改换网络深度,在训练mask branch时的误差种类,将RoI Align同RoI Pooling和RoI Warping进行比较,改变预测mask的方式(FCN和全连接层)等,详情请参见Mask R-CNN的实验部分。
针对关键点1:
针对关键点2:
针对关键点3:
结果展示:
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
2.SPPNet
论文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》
文章解读:《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》论文阅读之SPPNet
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