Mask R-CNN

Mask R-CNN
Kaiming He
Facebook, 2017

Mask R-CNN是一个简洁、有效的通用框架。这么久一直没看实在不太应该。乘着CVPR2019出了一篇Mask Scoring R-CNN,先看了这篇再去看新的。并行一个预测mask的思路应该可以有很多地方可以借鉴,以及RoIAlign的思路。此外从预测出的mask集,根据目标检测结果进行实例分割,论文里没有详细说明,但里面应该有不少技巧和细节需要后续学习。


1. Introduction

视觉领域发展迅速,目标检测和语言分割都有了它们强大的baseline系统,如Faster R-CNN和FCN。它们的概念非常符合直觉,同时具备灵活性和健壮性。我们的目标是在实例分割领域提出一个可与之比肩的框架。

实例分割的难度在于它检测出图中所有物体的同时,需要精确地分割每个个体,从而融合了CV中两个经典任务,目标检测和语义分割的元素。

我们的方法称为Mask R-CNN,在Faster R-CNN的基础上为每个Region of Interest RoI增加了一个预测分割mask的分支,与原有的分类和回归分支并行(图1)。mask分支是应用于每个RoI的一个小FCN,为每个像素预测分割mask。有了Faster R-CNN,Mask R-CNN很容易实现并训练,而且Mask分支只有很小的计算消耗。

图1

大体上,Mask R-CNN是Faster R-CNN(后文以FRCN代替)直觉式的扩展,但构造好的mask分支对结果很关键。而且FRCN并没有为输入输出设计像素级的对齐。这个问题在RoIPool最明显,它为了提取特征进行了粗糙的空间量化(注:把各种形状的RoI box投影到feature上,并调整到固定尺寸)。为了解决对不齐的问题,我们提出了一个简单的、无量化的层,称为RoIAlign,能够完好地保存提取的空间位置。尽管看起来没啥改动,RoIAlign有着很大的影响:它把mask准确率从10%提升到了50%。而且我们发现mask和分类预测的解耦非常有必要:我们为每个类独立的预测一个二元mask,类间没有竞争,依赖网络的RoI分类分支来预测类别。FCN通常会进行每个像素的多类分类,将分割与分类耦合,在我们的实例分割实验里表现较差。

Mask R-CNN无需任何花哨的东西,就在COCO上超越了SOTA的实例分割模型。作为副产品,在目标检测上也获得了优异的结果。

模型在GPU上fps为5,用8GPU训练COCO需要1到2天。

我们还把模型泛化到人体姿态估计任务。把每个关键点看做一个独热二元mask,Mask R-CNN经过一点改变后就能用于检测实例级的姿态。

图2

R-CNN 略。

Instance Segmentation: 受R-CNN的启发,很多实例分割的方法都基于segment proposals。早期方法[13,15,16,9]依靠自底向上的分割[42,2]。DeepMask[33]及其后续[34,8]训练以提出分割候选,然后使用Fast R-CNN进行分类。这些分割先行的方法慢而不准确。类似的,[10]提出了一个复杂的多阶段级联,从限位框proposal预测分割proposal,再进行分类。我们的方法是分割与分类并行预测,更简单也更灵活。
近期[26]结合了[8]的分割proposal系统和[11]的目标检测系统,得到一个“fully convolutional instance segmentation”(FCIS)。其主要思路是全卷积地预测位置敏感的channels输出集。这些channel同时处理物体类别、框和mask,让系统很快。但它对于有重叠的实例仍然处理不好。
另一类解决方案[23,4,3,29]受语义分割的成功所驱动。从每个像素分类结果开始,这些方法尝试把一类的像素分割为不同的实例。与这些先分割的方法不同,Mask R-CNN是先实例的策略。

3. Mask R-CNN

FRCN为每个候选物体输出两个结果,类标签和限位框偏移。我们增加了第三个分支,输出物体mask。但额外的mask输出与类和box不同,需要一个物体更精细的空间位置。接下来将介绍关键的组件,包括逐像素对齐,这也是FRCN所缺少的。

Faster R-CNN: FRCN包含两个阶段,第一阶段称为RPN,提出候选限位框。第二阶段的本质就是Fast R-CNN,从每个候选框使用RoIPooling提取特征,并进行分类和回归。两个阶段共用特征以提升速度。我们推荐[21],最新的一篇把FRCN与其余框架进行综合比较的文献。

Mask R-CNN: Mask R-CNN也是两步结构,第一步也与FRCN一样。在第二阶段增加了一个与分类和回归并行的分支,为每个RoI输出二元mask。与现有的分类依赖mask的方法相反。

训练中我们为每个RoI定义了一个多任务loss,$L=L_{cls} + L_{box}+L_{mask}$,前两个loss与FRCN一致。mask分支为每个RoI输出一个$Km^2$的结果,以$m \times m$的分辨率编码了K个二元mask,每个对应一个类别。我们使用了一个sigmoid计算,并将$L_{mask}$定义为平均binary CE loss。对于与gt类k关联的RoI,$L_{mask}$仅在第k个mask定义。

这样的定义运行网络为每个类生产mask,而没有类间的竞争。我们依赖专业的分类分支来预测类标签,对输出的mask加以选择。这与常见的使用FCN进行语义分割不同,它们通常会为每个像素进行softmax及多项式CE loss,mask类间会进行竞争。我们会通过实验证明我们的方式是好的实例分割的关键。

Mask Representation: 使用了FCN而不是fc输出mask。这也需要我们的RoI特征,它们本身就是小的特征图,得到很好的对齐。

ROIAlign: RoIPooling是从每个RoI提取一个小的特征图(如$7\times7$)的标准操作。它首先把一个浮点数的RoI量化(quantize)为特征图的离散间隔(granularity),量化后的RoI再细分到空间bins中,这些bin本身也是量化,最终再聚合每个bin覆盖的特征值(通常为max pooling)。量化在一个连续坐标上计算,如从x计算$[x/16]$来得到,其中16是特征图stride,而$[]$是取整操作。类似的,在分割到bin时,又进行了量化操作。这些操作为RoI与提取得到的特征间引入了不对齐。这也许不会影响对小的变化健壮的分类,但对预测每个像素精确的mask有很大不利。

为了解决这一问题,我们提出了ROIAlign层,移除了ROIPool里的粗糙量化。改变很简单,我们避免了任何对RoI边界或bin的量化操作(如使用$x/16$替代$[x/16]$)。我们使用bilinear interpolation[22]来在每个bin里4个有规律的采样位置计算以提取输入的特征,并聚合结果(max或average),细节见图3。

图3

后续的多种网络架构、训练细节、实验细节与结果请参看原文,不再赘述。