Mask Rcnn

简介

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

代码源于matterport的工作组,可以在github上fork它们组的工作。

https://baijiahao.baidu.com/s?id=1595621180643410921&wfr=spider&for=pc

 

软件必备

复现的Mask R-CNN是基于Python3,Keras,TensorFlow

  • Python 3.4+
  • TensorFlow 1.3+
  • Keras 2.0.8+
  • Jupyter Notebook
  • Numpy, skimage, scipy

建议配置一个高版本的Anaconda3+TensorFlow-GPU版本。

Mask R-CNN论文回顾

mask rcnn是何凯明基于以往的faster rcnn架构提出的新的卷积网络,一举完成了object instance segmentation. 该方法在有效地目标的同时完成了高质量的语义分割。 文章的主要思路就是把原有的Faster-RCNN进行扩展,添加一个分支使用现有的检测对目标进行并行预测。同时,这个网络结构比较容易实现和训练,速度5fps也算比较快点,可以很方便的应用到其他的领域,像目标检测,分割,和人物关键点检测等。并且比着现有的算法效果都要好,在后面的实验结果部分有展示出来。

Mask Rcnn_第1张图片

从上面可以知道,mask rcnn主要的贡献在于如下: 
1. 强化的基础网络通过 ResNeXt-101+FPN 用作特征提取网络,达到 state-of-the-art 的效果。 
2. ROIAlign解决Misalignment 的问题 
3. Loss Function

细节描述

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

先回顾一下Faster R-CNN, Faster R-CNN主要由两个阶段组成:区域候选网络(Region Proposal Network,RPN)和基础的Fast R-CNN模型。

2)RPN用于产生候选区域 

Mask Rcnn_第2张图片

2)Fast R-CNN通过RoIPool层对每个候选区域提取特征,从而实现目标分类和bbox回归 

Mask Rcnn_第3张图片

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

Mask Rcnn_第4张图片

 

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

主要工作

1. resnet +FPN

作者替换了在faster rcnn中使用的vgg网络,转而使用特征表达能力更强的残差网络

另外为了挖掘多尺度信息,作者还使用了FPN网络

2.损失函数的定义

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

L=Lcls+Lbox+Lmask

Lcls,Lbox与Faster R-CNN的定义类似,这里主要看Lmask

掩膜分支针对每个RoI产生一个的输出,即K个分辨率为m×m的二值的掩膜K为分类物体的种类数目。依据预类别分支预测的类型i,只将第i的二值掩膜输出记为Lmask。 

参考theano的文档,二值的交叉熵定义如下: 这里的o就是sigmoid输出。 
掩膜分支mask的损失计算如下示意图:类似yolo,哪一个种类就去算那个小的mask

1)mask branch 预测K个种类的m×m二值掩膜输出

2)依据种类预测分支(Faster R-CNN部分)预测结果:当前RoI的物体种类为i

3)i个二值掩膜输出就是该RoI的损失Lmask

Mask Rcnn_第5张图片

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

3.掩膜表示到RoIAlign层

说到这里,自然要与roi pooling对比。 
我们先看看roi pooling的原理,这里我们可以看https://github.com/deepsense-ai/roi-pooling 的动图,一目了然。

对于roi pooling,经历了两个量化的过程: 
第一个:从roi proposal到feature map的映射过程。方法是[x/16],这里x是原始roi的坐标值,而方框代表四舍五入。 
第二个:从feature map划分成7*7的bin,每个bin使用max pooling。

 

Mask Rcnn_第6张图片

 

这两种情况都会导致证输入和输出之间像素级别上的一一对应(pixel-to-pixel alignment between network input and output)。

因此作者设计了ROI Align layer。

作者的ROI Align layer想法很简单,就是去掉ROI Pooling过程中所有的量化过程,包括从原图proposal到最后一层feature map映射,以及把feature map划分成m*m的bin过程中的量化。

我们使用何凯明在iccv2017的ppt来说明。可以在百度云盘下载。链接: https://pan.baidu.com/s/1jHRubfK 密码: jh5c

Mask Rcnn_第7张图片

如上,roi映射到feature map后,不再进行四舍五入。然后将候选区域分割成k*k个单元, 在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。

这里对上述步骤的第三点作一些说明:这个固定位置是指在每一个矩形单元(bin)中按照比例确定的相对位置。比如,如果采样点数是1,那么就是这个单元的中心点。如果采样点数是4,那么就是把这个单元平均分割成四个小方块以后它们分别的中心点。显然这些采样点的坐标通常是浮点数,所以需要使用插值的方法得到它的像素值。在相关实验中,作者发现将采样点设为4会获得最佳性能,甚至直接设为1在性能上也相差无几。事实上,ROI Align 在遍历取样点的数量上没有ROIPooling那么多,但却可以获得更好的性能,这主要归功于解决了misalignment的问题。值得一提的是,在做实验的时候发现,ROI Align在VOC2007数据集上的提升效果并不如在COCO上明显。经过分析为造成这种区别的原因是COCO上小目标的数量更多,而小目标对misalignment问题的影响更为明显(比如,同样是0.5个像素点的偏差,对于较大的目标而言显得微不足道,但是对于小目标,误差的影响就要高很多)

下面摘取上面百度云盘里的一个ppt的插图,更加细致地描述roialign。 

Mask Rcnn_第8张图片

Mask Rcnn_第9张图片

也可以参考:http://blog.leanote.com/post/[email protected]/b5f4f526490b

上面这篇文章还介绍了ROI Align的反向传播算法。 
roi pooling的求导可以参考:http://ow680yzep.bkt.clouddn.com/iccv15_tutorial_training_rbg.pdf

下图对比了三种方法的不同,其中roiwarp来自:J. Dai, K. He, and J. Sun. Instance-aware semantic segmentation via multi-task network cascades 

Mask Rcnn_第10张图片

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

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

先回顾一下RoIPool层:

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

下图是SPPNet内对RoI的操作,在Faster R-CNN中只使用了一种粒度的特征图:

 

Mask Rcnn_第11张图片

Mask Rcnn_第12张图片

 

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

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

Mask Rcnn_第13张图片

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

4. 整个网络结构

 

Mask Rcnn_第14张图片

这里实际上有两个网络结构,一个就是:Mask R-CNN: overview的那副图(或者如上左边)。使用resnet-c4作为前面的卷积网络,将rpn生成的roi映射到C4的输出,并进行roi pooling,最后进行分叉预测三个目标。

另一个网络就是这里的faster rcnn with fpn。 

Mask Rcnn_第15张图片

上述图像同样来自何凯明的ICCV2017 ppt 
如上,使用fpn网络,每一个阶层连接一个三分支网络。考虑了多尺度信息,因此可以检测更加小的目标。 
至于是否像之前的FPN在各阶层共享三分支网络,不太清楚。

总结

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

但是吧,MRCNN的缺点也很明显,需要大的计算能力并且速度慢,这离实际应用还是有很长的路,坐等大神们发力!

mask rcnn的主要贡献其实就是roi align以及加了一个mask分支。 
目前开源代码有:

https://github.com/TuSimple/mx-maskrcnn

https://github.com/CharlesShang/FastMaskRCNN

CAFFE :https://github.com/jasjeetIM/Mask-RCNN

期待官方的源码放出~~

参考文献

  1. Mask R-CNN论文导读
  2. 如何评价 Kaiming He 最新的 Mask R-CNN?
  3. Mask-RCNN技术解析 [重点推荐]
  4. ROI Align 原理解析和实现细节 [重点推荐]
  5. 论文阅读-《Mask R-CNN》
  6. Mask R-CNN - Notes
  7. Notes: From Faster R-CNN to Mask R-CNN
  8. Implementing Mask R-CNN[重点推荐]
  9. Instance segmentation with Mask R-CNN

mask rcnn视频讲解

mask rcnn是何凯明基于以往的faster rcnn架构提出的新的卷积网络,

成果:一举完成了object instance segmentation. 该方法在有效地目标的同时完成了高质量的语义分割。

文章的主要思路就是把原有的Faster-RCNN进行扩展,添加一个分支使用现有的检测对目标进行并行预测。同时,这个网络结构比较容易实现和训练,速度5fps也算比较快点,可以很方便的应用到其他的领域,像目标检测,分割,和人物关键点检测等。并且比着现有的算法效果都要好,在后面的实验结果部分有展示出来。

劣势:效率低

Mask Rcnn_第16张图片er

二、Modelarchitecture andpaper讲解

Mask rcnn网络结构

Mask Rcnn_第17张图片

Mask Rcnn_第18张图片

 

网络讲解:

  1. 输入图像1024*1024不足的地方补0,进去之后得到了c1-c5的feature map;
  2. C5经过一个conv通道252 1*1(1*1卷积核为了调整维度)得到p5,
  3. P5经过*2 upsample(转置卷积 或者叫反卷积)把图片方法一倍,
  4. C4同c5 并与p5加成p4,一样到p2。
  5. P5是最小的feature map,其抽象层次高,小目标精确;p6仅仅用于RPN网络,是p5通过maxpooling获得的,层次更抽象;p2是最大的feature map,分辨率比较高,信息量也多;
  6. 接着对p2-p5进行conv256(3*3)消除上采样的混叠效应。然后把5个特征层汇入RPN(同一个网络),
  7. 然后concatenate连在一起输出最后一个outputs。Outputs里有rpn-class-logits(损失,做softmax之前叫),Rpn-class(做softmax之后叫class),rpn-bbox(anchor修正值)
  8. Proposallayer作用:为了防止数据量过大,用来选择感兴趣的anchor用来选取一小部分的负例,负例采样),并把Bbox修正的信息应用到得到的anchor上。
  9. Rpn_rois 就是感兴趣区域的一个框(实数框),
  10. Pyramidroialign:根据公式计算从某个特征p层选取出roi,如果框较大,就从维度较大的P5抽取,较小的就从p2抽取,(p2-p5重复使用7*7)
  11. 通过feature map(roi)进入head层,用regression得到位置Bbox;mask得到轮廓,还有分类

论文讲解:

  1. Mask对每一个ROI输出一个二值掩膜;
  2. 之前的一些分类是依托在mask上面,而本文mask和classification是属于并行的;
  3. Decouples是解耦合的,和fcn不同
  4. 如何计算loss,最重要的是mask的损失
  5. Mask representetion:用fcn去做一个分类,输出很多数据(转置卷积);
  6. ROIAlign(或者roipooling最终的目的都是把feature map变成相同的维度,然后才可以进行classification等等):

Mask Rcnn_第19张图片

  1. 使用原因做像素集预测,不允许有偏移
  2. 分成2*2,再在每个小格子再取4个点(每个小格子里算出四个feature值,然后取四个点中最大值最为1/4格子的值,作者给出效果有改善,但比较小)
  1. resnet-fpn backbone结构使得速度和效率最好:

   利用head部分

Mask Rcnn_第20张图片

三、Source code

 

 

你可能感兴趣的:(Mask Rcnn)