Mask R-CNN论文笔记

论文:Kaiming He Georgia Gkioxari Piotr Dollar Ross Girshick.Facebook AI Research (FAIR).Mask R-CNN.20 Mar 2017

素质三连

1.论文贡献

在Faster R-CNN的基础上提出Mask R-CNN实例分割模型。

提出了RoIAlign解决RoIPool中的misalign问题

增加一个全卷积网络分枝用于预测mask

将class预测和mask预测解耦

2.实验结果   

在COCO数据集获得实例分割和目标检测的SOTA,可以以5fps运行。

3.存在的问题

速度太慢,无法实时分割

摘要

    本文提出了一种计算简单、灵活的目标实例分割的通用框架。可以高效的检测图像中的目标,同时对每个实例生成高质量的分割掩码(segmentation mask)。这个方法称之为Mask R-CNN,它基于Faster R-CNN进行拓展,增加了与bounding box识别分枝并行的一个分枝,用于预测目标的掩码。Mask R-CNN训练简单,它在Faster R-CNN上一小部分网络得来的,可以以5fps运行。此外,Mask R-CNN很容易泛化到其它任务,比如进行人体姿态估计。Mask R-CNN在COCO系列挑战赛上三个比赛:实例分割,目标检测,人体关键点检测上取得了最顶级的成绩。Mask R-CNN在每项任务上默默的胜过所有的单模型,包括COCO 2016挑战赛的冠军。希望这个简单高效的方法可以作为一个坚实的baseline,有助于未来在实例级(instance-level)识别的研究。代码开源:https://github.com/facebookresearch/Detectron  。


模型提出

    本文的目标是要让Mask R-CNN在实例分割的地位,相当于Faster R-CNN之于目标检测、FCN之于语义分割。实例分割需要正确检测出图片中所有的目标,同时精确的分割每个实体,这意味着需要联合目标检测和语义分割来实现。作者提出的Mask R-CNN框架如下:

1.jpg

    如图所示,Mask R-CNN在Faster R-CNN的最后bounding box预测和分类的部分,增加了一个并行分枝用于预测每个RoI(Region of Interest)的分割掩码。这个掩码分枝(mask branch)相当于应用在每个RoI上的FCN,以逐像素分类的方式预测分割掩码。

    与原始的Faster R-CNN相比,Mask R-CNN仅在最后增加了一个分枝,因此额外增加的计算量很小。但并不是直接放上去就可以了,需要引入一些其它设计。

    首先,Faster R-CNN没有设计网络输入到输出的像素到像素(pixel-to-pixel)对齐,它使用RoIPool用于每个候选框提取特征,但是RoIPool的量化非常粗糙。为了纠正这个问题,作者提出了无量化的RoIAlign层。RoIAlign的加入使得mask精度提高了10%到50%。

    其次,作者发现掩码预测和分类预测的解耦非常重要,独立的为每个类预测一个二值掩码,这样不存在类别之间的竞争,并使用RoI分类分枝来预测类别。而FCN将每个像素进行分类,这样分割和分类是耦合的。根据实验这样做不利于实例分割。

    Mask R-CNN在COCO实例分割任务上默默的超越了之前的单模型SOTA,顺便在COCO目标检测任务中胜出。Mask R-CNN可以在单个GPU上以200ms每帧的速度运行,在一个8-GPU机器上训练两天COCO任务。作者还通过在COCO关键点数据集上评估人体姿态估计任务展示了Mask R-CNN的通用性。


相关工作

    R-CNNFast R-CNNFaster R-CNN,DeepMask,FCIS,FCN


Mask R-CNN设计

    Faster R-CNN有两个输出分枝,对每个候选框预测其类别和包围框的偏置。Mask R-CNN的设想很简单,就是在Faster R-CNN的基础上添加第三个分枝输出目标的掩码。但是mask预测不同于分类和包围框回归,它需要对目标提取更加精细的空间特征。

Faster R-CNN

    Faster R-CNN是是一个两阶段的目标检测模型。第一个阶段是RPN网络,用于生成候选包围框。第二个阶段是Fast R-CNN,使用RoIPool抽取每个候选框的特征,并对特征进行边框回归和分类。

Mask R-CNN

    Mask R-CNN也采用两阶段处理。第一阶段也是使用RPN。第二个阶段除了并行执行边框回归和分类之外,还对每个RoI预测一个二值掩码(binary mask)。Mask R-CNN不像其它实例分割模型那样在mask的基础上分类,而是采取并行预测的方法,简化了pipeline。

    在训练时,对每个RoI定义多任务损失(multi-task loss):L=Lcls + Lbox + Lmask,其中分类损失Lcls和边框损失Lbox与Fast R-CNN一致。每个RoI的Mask分枝输出维度为Km^2,mxm是预测的mask的分辨率,K是类别数。最后逐像素应用sigmoid激活函数,定义Lmask为平均二值交叉熵损失。设该RoI的ground-truth类别是k,则Lmask只定义在第k个mask,其它的mask不定义损失。

    Lmask的定义使得网络对每个类别都产生非竞争的mask,然后根据分类分枝设置mask的标签。这样就将mask预测和class预测解耦了。对于实例分割来说,这种解耦很重要。反之,使用FCN那种耦合预测则不利于实例分割。

Mask表示

    Mask分枝使用FCN对每个RoI预测mxm的mask。之前很多工作都采用fc层预测mask,而这里使用全卷积层,需要的参数更少而且精度更高。

    而这样pixel-to-pixel的方法需要准确的RoI特征能被对齐(RoI都是很小的特征图),以忠实的保持每个像素显式的空间对应。这里提出RoIAlign算法解决这个问题。

RoIAlign

    Fast R-CNN提出的RoIPool是从每个RoI抽取特征的方法。RoIPool使用最大池化将RoI特征图(hxw)转换为预定义分辨率(HxW)特征图。每个ROI被定义为四元组(r,c,h,w),其中(r,c)是候选框左上角的位置,(h,w)是候选框的高和宽。ROIPool是SPP的特例,是单级SPP。RoIPool首先确定池化的粒度,stride=(h/H,w/W),然后对stride进行量化,最后执行最大池化即可。下面举个例子展示RoIPool的过程(参考https://zhuanlan.zhihu.com/p/37998710  )。

    已知当前特征图大小为8x8,RoI为(0,3,5,7),则RoI区域如下:

2.jpg

    设置池化后的大小为HxW=(2,2),则stride=(5/2,7/2)=(2.5,3.5)。然后对stride进行整数量化,得stride=(2,3)。则得划分后的RoI为:

3.jpg

    然后进行最大池化,得抽取的特征:

4.jpg

    上面这个过程有两次整数量化。第一次,候选区域的(x,y,w,h)通常是小数,为了方便操作会把它整数化。第二次,将整数化后的边界区域平均分割成 k x k 个单元,对每一个单元的边界进行整数化。如下:

5.jpg

    经过上述两次整数化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。作者称之为misalignment

    为了解决这个问题,ROIAlign方法取消整数化操作,保留了小数,使用双线性插值的方法获得坐标为浮点数的像素点上的图像数值。

    如下图所示,虚线部分表示特征图,实线表示ROI,这里将ROI切分成2x2的单元格。如果采样点数是4,那我们首先将每个单元格子均分成四个小方格(如红色线所示),每个小方格中心就是采样点。这些采样点的坐标通常是浮点数,所以需要对采样点像素进行双线性插值(如四个箭头所示),就可以得到该像素点的值了。然后对每个单元格内的四个采样点进行maxpooling,就可以得到最终的ROIAlign的结果。

6.jpg

网络架构

    本文会使用不同的backbone,将这些它们命名为network-depth-features。比如Faster R-CNN使用ResNet50作为Backbone,而且它RoIPool所在的层是第四个阶段,因此称该backbone为ResNet-50-C4。此外,本文还使用FPN作为Backbone。FPN+Faster R-CNN,除了从特征金字塔的不同层级抽取RoI特征,其它方面都跟原始的Faster R-CNN一致。在网络头部,增加一个全卷积的mask预测分枝。两种backbone下网络头部的架构如下:

7.jpg


实现细节

    超参数设置跟原始的Fast R-CNN/Faster R-CNN差不多。

训练

    RPN生成的候选框中,只有与真实框的IOU大于0.5时,才会被设置为positive框。而Lmask仅仅定义在Positive框上。

    采用image-centric训练方法,将原始图片的短边缩放置800pix。每个Mini-batch由两张图片,每张图片采样N个RoI,正负样本数为1:3。C4 backbone设置N=64,FPN设置N=512。在8个GPU上训练,迭代160k次,初始学习率为0.02,120k次训练后除以10。权重衰减系数为0.0001,动量系数为0.9。

    对于RPN,设置5个尺度,3中长宽比。

推断

    测试时,设置C4 backbone的候选框数为300,FPN backbone为1000。最后执行NMS。Mask分枝应用到最置信度的100个候选框,这可以加速推断时间和提高精度。每个RoI预测出K个mask,但是这里仅使用第k个mask,k是分类分枝的预测结果。Mask的分辨率为mxm,最后将其resize为RoI的大小,其二值化的阈值为0.5。由于仅预测前100个RoI的mask,mask增加的计算量很小。


实例分割实验

    在COCO数据集上进行实验。COCO的标准评价指标包括:AP(平均IOU阈值),AP50,AP75,APS,APM,APL(不同尺度的AP)。这里使用AP作为mask IoU的评价指标。

实验结果

    Mask R-CNN与其它SOTA方法的比较:

8.jpg

    Mask R-CNN的输出可视化:

9.jpg

10.jpg

    下图比较了FCIS++和Mask R-CNN的输出结果:

11.jpg

    可以看到FCIS++对重叠目标的分割存在系统性的artifacts。


消融实验

架构

    下表显示Mask R-CNN使用backbone的结果。

12.jpg

是否将class预测和mask预测解耦

13.jpg

    可以看到解耦的网络比耦合的网络的AP提高了5.5,这表明一旦实例作为一个整体被分类,就可以单独预测一个mask,这样更容易训练。

RoI对齐

    可以看到RoI对齐的引入对精度的提升也很大。

14.jpg

    作者还使用ResNet-50-C5作为backbone评估了RoIAlign的性能,该backbone有更大的stride=32,可以看到性能精度提升的幅度更大。而且发现该backbone优于ResNet-50-C4。

15.jpg

Mask分枝

    Mask分枝可以使用fc层,也可以使用fcn,下面的结果表明使用fcn的实例分割的精度要更高。

16.jpg


目标检测实验

    Mask R-NN与其它SOTA目标检测模型的比较:

18.jpg

    上表中的Mask R-CNN推断时仅仅输出类别和标签,Faster R-CNN,RoIAlign去掉Mask分枝训练的。结果表明Mask R-CNN同样可以用作目标检测。


时间花费

推断时间

    使用ResNet-101-FPN作为backbone,Mask R-CNN在Nvidia Tesla M40 GPU上的运行时间为195ms(CPU resize该图片需要15ms)。而使用ResNet-101-C4,则需要花费~400ms。

训练时间

    使用ResNet-50-FPN作为backbone,使用COC trainval135k作为数据集,在一个8-GPU上训练需要花费32小时。若使用ResNet-101-FPN则需要花费44小时。



上一篇:
下一篇:

首页 所有文章 机器人 计算机视觉 自然语言处理 机器学习 编程随笔 关于