Mask R-CNN论文阅读笔记2017

Abstract

我们针对目标实例分割提出了一个概念简单、灵活的通用框架。我们的方法可以有效监测图像中的目标,同时对每个目标实例生成一个高质量的分割掩膜。**我们的方法叫做Mask R-CNN,它将Faster R-CNN扩展,与现有的bbox识别分支平行,添加了一个分支来预测目标的掩膜。**Mask R-CNN很容易训练,对于Faster R-CNN只增加了一些计算,可以达到5fps。而且,它非常容易移植到其他任务上,比如在同一个框架下进行位姿估计。我们在COCO的三项中都取得了top成绩,分别是实例分割、bbox目标检测以及人的关键点检测。没有使用其他tricks,Mask R-CNN在每项任务都超过了所有现存的单模型。我们希望我们这种简单有效的方法可以作为baseline,来帮助实例等级的识别任务。

1. Introduction

最近短期时间内,目标检测和语义分割等视觉任务的结果在快速提升。大的方面,这些提升得益于更有力的baseline,比如Faster R-CNN和FCN框架。这些方法在概念上都很直观,并提供了灵活性和鲁棒性,同时有比较快的训练和测试时间。本文的目标是提出一个与之相比的实例分割框架。

实例分割任务是很有挑战的因为它需要对图像中所有目标进行正确检测,同时准确地分割每个实例。**因此,它组合了传统的目标检测任务(目标是使用bbox定位每个目标)和语义分割任务(目标是对每个像素进行分类,不需要区分目标个体)。**既然如此,可能有人认为需要一个复杂的方法才可以达到很好的效果,然而,我们使用一个简单、灵活、快速的系统就可以超过之前的SOTA实例分割结果。

我们的方法,Mask R-CNN,将Faster R-CNN扩展,增加了一个分支来在每个RoI上预测分割掩模令这个分支与原来的分类和bbox回归分支是平行的,见图1。Mask R-CNN(RoIAlign)论文阅读笔记

mask分支是一个小的FCN,应用在每个RoI上,逐像素预测分割的掩模。Mask R-CNN可以很简单应用在Faster R-CNN框架上,并进行训练,这有助于多种灵活的网络结构设计。另外,mask分支值增加了很少的计算量,这使得系统仍是快速的。

原则上来说,Mask R-CNN是对Faster R-CNN的一种扩展,然而正确地构建mask分支是至关重要的。**更重要的是,Faster R-CNN设计中没有对网络的输入和输出进行逐像素的对齐(alignment)。**在使用RoI池化用于实例分割时,RoI用于特征提取,对空间信息进行了粗糙的量化,这对于实例分割就出现了问题。**为了解决不对准的问题,我们提出一个简单的、无量化的层,叫做RoIAlign,可以保留准确的空间位置。**尽管看起来只是一个微小的改变,RoIAlign有着很大的影响:它将mask的准确率相对提升了10%-50%,在更严格的定位尺度下,提升更大。==第二,我们发现将mask和class的预测分离也是很关键的,我们对每个class单独的预测一个二值mask,而没有在类之间竞争,使用RoI的分类网络来预测类别。==相反FCN使用逐像素的多分类,将分割和分类组合,这种方法效果较差。

不加其他东西,我们的Mask R-CNN在COCO实例分割任务上超过了所有SOTA单模型效果。作为副产物,我们同样在COCO目标检测任务上取得很好效果。

我们的模型在GPU上每帧图像处理需要200ms。我们相信,快的训练和测试速度,以及网络的灵活性和准确性,会帮助简化将来实例分割的研究。

最后,我们使用COCO的关键点数据集, 通过位姿检测任务来展示我们框架的概括能力。将每个关键点看成一个one-hot二分类mask,对Mask R-CNN进行一点修改,就可以应用到位姿检测。不使用tricks,Mask R-CNN超过了2016 COCO比赛的冠军,且仍可以达到5fps。Mask R-CNN(RoIAlign)论文阅读笔记

2. Related Work

R-CNN

R-CNN方法首先提取许多候选框,然后对每个RoI进行分类和定位回归。继续发展出了Fast R-CNN和Faster R-CNN,之后又有许多对Faster R-CNN的提升,目前Faster R-CNN是很重要的一个baseline。

Instance Segmentation

受到R-CNN有效的驱动,有许多的实例分割方法都是基于segment proposals。早期的方法将bottom-up segments排序。DeepMask以及接下来的方法学习提出segment候选,然后通过Fast R-CNN进行分类。这种方法分类先于识别,因此很慢,准确率较低。我们的方法基于对mask和class labels的平行预测,更简单更灵活。

最近,Li等人将segment proposal系统和目标检测系统进行组合,即全卷积实例分割(FCIS)。通常的想法是预测一系列全卷积的未知敏感的channels。这些通道同时解决目标类别、box和mask,这样最快。但是FCIS在重叠的实例上会产生系统错误,产生假的边缘(如图5所示),表明它受到实例分割的基本困难的挑战。

3. Mask R-CNN

**Mask R-CNN的概念十分简单:Faster R-CNN对每个候选目标有两个输出,class标签和bbox偏移,我们就增加第三个分支来输出目标的mask。**但是增加的mask输出与前两者不同,它需要对目标更细致的空间layout进行提取。下面,我们介绍Mask R-CNN的关键成分,包括逐像素对准,这也是Faster R-CNN中主要缺失的部分。

Faster R-CNN: 首先简单回顾Faster R-CNN方法。它包含两阶段,第一阶段为RPN,来提出候选的bbox。第二阶段是Fast R-CNN,使用RoI池化对每个候选RoI提取特征,然后进行分类和bbox回归。两个阶段的特征图共享。

Mask R-CNN:

**我们同样使用两阶段流程,第一阶段与Faster R-CNN相同(RPN)。第二阶段,与上面的两个分支平行,同样对每个RoI输出一个二分类mask。**这与最近的一些方法相反,它们的分类结果依赖于mask的预测。我们的class分类和bbox回归仍是平行的。

训练期间,我们定义了一个多任务loss,记作Mask R-CNN(RoIAlign)论文阅读笔记,前两者的定义与Faster R-CNN中一致。**mask分支对于每个RoI有一个Km^2维度的输出,即对m * m分辨率生成的掩模,K表示类别总数,即对每个类别生成一个m * m掩模。**我们使用对每个像素的sigmoid,然后定义Lmask为平均的二分类交叉熵loss。对于与GT box类别k相连的RoI,Lmask只有第k层mask计算(其他的mask不参与loss)。

我们对Lmask的定义可以使得网络对每一类生成mask,在类别之间没有竞争。==我们利用平行的分类分支来预测RoI的类别,从而选出输出的mask。==这就将mask和class的预测分离,这与之前的FCN不同。我们实验中发现我们的这种方法效果更好。

Mask Representation:

一个mask可以将一个输入目标的空间layout进行编码。因此,与类别标签或box offset不同(它们是通过fc层变成短的输出向量),提取mask的空间结构需要使用卷积来完成,找到像素之间的相关性。

**具体来说,我们使用FCN来对每个RoI输出一个m * m的mask,这就保持了目标m * m的空间结构。**与之前方法中使用fc层继续对mask预测排序不同,我们的FCN表示需要更少的参数,且更加准确。

这种逐像素之间的行为需要我们的RoI特征,它们是小的特征图,并需要与原图对准,保留每个像素的空间联系。下面的RoIAlign层就是进行这个工作的。

RoIAlign:

RoI池化是对每个RoI提取一个小的特征图(比如7 * 7)的标准操作。RoI池化首先将浮点数的RoI量化到实数,然后量化的RoI分成空间的bin,同样进行了量化,最后将每个bin的值聚合。这些量化这样进行计算,比如[x/16],x为长度,16为该特征图对应的步长,[]表示四舍五入,那么就是直接除,然后进行四舍五入。这样就引入了RoI和提取到的特征的不对齐。这种不对齐对于分类来说不受影响,因为分类对小的平移是鲁棒的,但是会对需要逐像素准确的mask产生很大的影响。

我们提出RoIAlign来解决这个问题,使得提取的特征的输入对准。我们的改变很简单,我们要避免在RoI边界和bin上面的这些四舍五入的量化(比如,我们使用x/16,而不是[x/16])。在每个RoI bin中,我们使用双线性插值计算输入特征4个regularly采样位置的准确值,然后对结果进行聚合(最大值池化或平均)。

RoIAlign取得了很好的效果提升,我们同样使用了RoIWarp进行对比,后者忽视对准的问题,直接应用在RoI上取代RoI池化,我们的效果要更好,这更说明了对准的重要性。

Network Architecture:

为了验证我们方法的generality,我们使用了多种结构来测试。它们的区别主要在于:backbone的不同、用于bbox识别的head不同(分类和回归)、对每个RoI的mask预测网络不同。

对于backbone我们测试了50和101层的ResNet和ResNeXt。我们同样加入了FPN网络,使用Faster R-CNN+FPN,在金字塔的多个等级上进行预测,其他都一样。使用ResNet-FPN backbone可以使得我们的方法在准确率和速度上都获得提升。

对于网络的head,我们选择遵循之前方法中的一些结构,然后加一个平行的分支预测mask。具体来说,我们使用Faster R-CNN - ResNet的head,以及加上了FPN的head,如图3所示。Mask R-CNN(RoIAlign)论文阅读笔记

可以注意到,我们的mask分支是straightforward结构,更复杂的结构可能会提升效果但是不是本文的重点。

3.1 Implementation Details

我们使用Faster R-CNN论文中的超参数设置,尽管这些设置是针对目标检测的,我们发现它们对实例分割系统也是鲁棒的。

Training:

如果RoI与GT box的IoU大于等于0.5,那么认为是正样本,否则为负样本。mask的loss只对正样本产生,mask的目标是RoI与其对应GTmask的交集。

我们使用以image为中心的训练方式。**将图像resize到短边800像素。每个GPU上每个mini-batch 2张图像,每个图像有N个RoI,正负样本1:3采样。**对于C4backbone,N=64,对于FPN,N=512。我们在8个GPU上训练160k,学习率0.02,在120k时学习率除以10,使用0.0001的权值衰减和0.9的动量。

RPN的anchors包含5个尺度,3个长宽比。为了ablation试验,RPN单独训练,不与Mask R-CNN共享特征,其他时候二者共享特征。

Inference:

测试的时候,proposal的数量为300(C4)和1000(FPN),然后使用NMS。mask分支再应用到分数最高的1000个box上。尽管这与训练时的平行计算不同,但是这加速了测试速度并且提升了准确率(因为使用了更少、更准确的RoI)。mask分支对每个RoI预测k个mask,对应k个类别,然后我们只使用对应分类分支结果的那个mask。然后这个m * m的浮点数mask输出被resize到RoI的尺寸,使用阈值0.5进行二值化。

注意到尽管我们只对top100 box进行mask预测,Mask R-CNN与Faster R-CNN相比还是增加了一些计算量(大约20%)。

4. Experiments: Instance Segmentation

我们使用Mask R-CNN进行实例分割的实验,与SOTA进行对比,同样进行了剥离实验。我们使用COCO数据集,使用标准的COCO尺度评价,AP使用mask的IoU来评估。我们使用trainval35k进行训练,在minival上进行剥离实验,在test-dev上也做了测试。

4.1 Main Results

表1中,我们与其他SOTA的实例分割方法进行比较。

Mask R-CNN(RoIAlign)论文阅读笔记

我们的几种方法都超过了之前的方法,包括COCO2015和2016的胜者MNC和FCIS。 Without bells and whistles, Mask R-CNN with ResNet-101-FPN backbone超过了包括多项tricks的FCIS+++。我们使用这些tricks会取得更好效果。

Mask R-CNN结果可视化如图2和图4所示。Mask R-CNN(RoIAlign)论文阅读笔记

我们的方法即使在具有挑战的条件下,也取得了很好的效果。在图5中,我们对比了Mask R-CNN baseline和FCIS+++。Mask R-CNN(RoIAlign)论文阅读笔记

FCIS+++对一些重叠的示例,产生了系统性的错误。

4.2 Ablation Experiments

我们对Mask R-CNN进行了一系列的剥离实验,结果如表2所示,下面进行具体分析。

Mask R-CNN(RoIAlign)论文阅读笔记

Architecture:

如表2a所示,更深的backbone效果越好,包含额外的设计,比如FPN和ResNeXt,效果更好。我们注意到不是所有的方法都会从更深网络和设计中受益。

Multinomial vs. Independent Masks:

Mask R-CNN将mask预测和class预测分解,分类分支来预测类别标签,mask是对所有类别生成的,再根据label选择mask。在表2b中,我们对比使用softmax和多项式loss。这种方法将mask和class预测结合在一起,导致效果损失很大(5.5点),因此,不需要考虑类别,对mask进行二分类预测,效果更好,也更容易训练。

Class-Specific vs. Class-Agnostic Masks:

我们默认的是预测class-specific的mask。令人惊讶的是,class-agnostic的mask预测(不管类别只输出m * m)一样有效,29.7 vs 30.3的AP对比。这更加说明将mask和分类预测分开的有效。

RoIAlign:

我们RoIAlign层的评价结果如表2c所示。我们使用了有效步长16的ResNet-50-C4 backbone。RoIAlign相比于RoI池化提升了3点准确率,它对最大池化/平均池化没有明显区别,后面我们都使用平均池化。

我们也比较了RoIWarp,它量化了RoI,与输入失去了对准,如表2c中所示,效果比RoIAlign差许多,这更突出了正确对准的重要性。

我们同样评估了有32步长的ResNet-50-C5 backbone的RoIAlign,如表2d所示,这将mask准确率提升了7.3点,且比C4的效果更好。RoIAlign在很大程度上解决了使用大的步长进行检测和分割的挑战。

最后,当在FPN使用RoIAlign时,增长了1.5点的mask AP和0.5点的box AP。对于需要更细致对准的关键点检测,使用FPN取得了更大的效果提升。

Mask Branch:

分割是一个逐像素的任务,我们使用一个FCN来得到有空间layout的mask。在表2e中,我们对比了MLP和FCNs,使用ResNet-50-FPN backbone。使用FCN比MLP取得2.1点的AP增长。

4.3 Bounding Box Detection Results

表3中,我们与COCO上SOTA的bbox回归目标检测方法进行对比。为了公平对比,我们只是用了分类和bbox分支,忽略mask分支。使用ResNet-101-FPN作为backbone。使用 ResNeXt-101-FPN, Mask R-CNN进一步提升效果。Mask R-CNN(RoIAlign)论文阅读笔记

进一步比较,我们训练了一个没有mask分支的Mask R-CNN版本,记作表3中的Faster R-CNN RoIAlign。这个模型的效果超过了上面的模型,因为RoIAlign的存在。另一方面,它比Mask R-CNN的box AP要低0.9%,这个差距可能是因为Mask R-CNN的多任务训练loss造成的。

最后,我们发现Mask R-CNN的mask AP和box AP有一点误差。这表明我们的方法极大地缩小了目标检测和更复杂的示例分割任务之间的差距。

4.4 Timing

**Inference: **

我们训练一个ResNet-101-FPN 模型,在RPN和Mask R-CNN阶段共享特征,使用了4步训练法。模型可以达到每张图像处理耗时195ms,并且达到与未共享的模型相当的mask AP。我们也 训练了一个ResNet-101-C4 的模型,它每张图需要花费400ms,因为它有更多更复杂的box head(如图3),所以实际应用中我们不推荐使用这种模型。

尽管Mask R-CNN很快,我们注意到我们的设计没有针对速度进行优化,更好的speed/accuracy平衡可能会进一步达到。

Training:

Mask R-CNN训练也很快,使用8-GPU,在COCO上训练ResNet-50-FPN,需要32小时,训练 ResNet-101-FPN需要44小时。当只使用训练集训练,训练时间可以压缩到一天之内。

5. Mask R-CNN for Human Pose Estimation

这一部分主要是讲解Mask R-CNN扩展应用于位姿估计关键点检测任务,就不再详细翻译了。

相关文章: