Mask R-CNN
0.摘要
本文提出了一个简单、灵活且通用的框架mask rcnn。本框架能够在检测目标的同时为每个目标预测一个mask,相比faster rcnn,只是增加了一个分支而已,且只增加了很少的资源耗费,达到了5fps。同时,本框架也可以容易地泛化达到其他任务,比如说人体关键点检测。在不限时的前提下,本框架在检测、实例分割和人体关键点检测任务上的表现超过了现存的所有单模型框架。
1.引言
近期,视觉任务的结果已经有了快速的提高,比如目标检测和语义分割。这些进步很大程度上都是因为有强大的baseline,比如说检测中的fast/faster rcnn和分割中的fcn。本文的目标是开发一个支持实例分割的框架。
实例分割是一个具有挑战性的任务,因为它综合了目标检测和语义分割。目标检测,就是定位目标的位置并且将其分类;语义分割,就是将每一个像素都进行分类,但是不用管目标是什么。考虑到这些,人们可能会觉得要想做好实例分割就得有一个复杂的框架,然而,本文证明了一个简单、灵活并且快速的框架就能超过以前的SOTA。
本框架通过扩展faster rcnn而来,在新加的分支上,使用小型FCN,通过对ROI预测语义mask来达到目的。在获取faster rcnn的前提下,实现和训练mask rcnn是很容易的,以为前者提供了一系列灵活的架构设计。
构建mask分支对结果的好坏是至关重要的。有一点很重要,faster rcnn设计的时候并不是pix to pix的对于input和output。(这一点在ROIPOOL中体现的很明显。ROIPOOL中de facto核心操作执行粗糙的空间量化来进行特征提取。)为了应对这个问题,本文提出了非量化的、简单的层,叫做ROIalign,这种方式确实保留了具体的空间位置信息。尽管ROIalign看起来是个很小的修改,但是却有很大的影响:1)it improves mask accuracy by relative 10% to 50%, showing bigger gains under stricter localization metrics.2)we found it essential to decouple mask and class prediction: we predict a binary mask for each class independently, without competition among classes, and rely on the network’s RoI classification branch to predict the category.与此相比,FCN通常对每个像素进行多类别分类,这种方法耦合了分割与分类,实验表明,这种方法在实例分割上表现不佳。
最后,通过小的修改,将每个关键点看做one-hot mask,进行了instance-specific的姿态检测。
2.相关工作
- RCNN致力于有限数量的候选区域并且在每个ROI上单独地使用CNN,这种方式获取了更高的acc和更快的速度。Faster rcnn通过使用RPN学习注意力机制,改进了这种方法。
- 受到RCNN影响,许多实力分割方法基于segment proposal。早期的方法依赖于自底向上分割。Deepmask和后续的工作学习提出segment候选,然后将结果送入fast rcnn进行分类。在这些方法中,分割在识别之前,导致速度慢并且acc低。同样的,Dai et al. [10] proposed a complex multiple-stage cascade that predicts segment proposals from bounding-box proposals, followed by classification。然而,本文的方法同时进行分类与mask预测,更简单和灵活。
3.Mask rcnn
Faster rcnn有两个分支,一个预测类别,一个预测bbox。而mask rcnn在此之上增加了一个分支用来预测mask。但是增加的这个分支比较特殊,需要更加精细的空间特征。接下来的内容中,pix to pix alignment是fast/faster rcnn所没有的。
- Faster rcnn:包括两个stage,第一个stage使用RPN选出候选的bbox,第二个stage本质上是fast rcnn,从每个候选bbox中获取到特征然后ROI pooling进行分类和bbox的回归。图像的特征在两个stage都是共享的,可以加快推理速度。
- Mask rcnn:mask rcnn也采用两个stage的方式,第一个stage与faster rcnn完全相同,使用RPN。第二个stage采用并行方式,执行分类,bbox回归和mask预测。总的损失为新增的mask分支输出为k*m*m,其中k代表k类,m为分辨率。采用了per pix sigmoid,并且将loss定义为二分类交叉熵损失。对于一个ROI属于第k类,损失定义时只使用第k个mask输出值。这种方法生成mask时没有进行类间竞争,而是使用二分类的mask对某一类物体进行mask预测,这样就解耦了分类与分割,这与那些使用FCN、per pix softmax、多分类交叉熵的方法是不同的。实验表明,采用二分类的方式对于取得好的结果是至关重要的。
- Mask表示
- ROI align
以前使用了ROI pooling导致ROI特征和量化后的特征之间的位置不匹配,这对于分类来说影响不大,因为分类任务对于一些小的变化是鲁棒的。但是对于mask预测任务来说,有大的负面效应。为了应对这个,提出了ROI Align,将抽取的特征与ROI特征对齐。
ROI Align中没有采用取整哪样的硬量化,而是采用插值的方式获取每个point的值。(每个point均匀分布)实验中注意到,这种方式对于采样点的位置和数量不敏感,只要不使用硬量化。
- 网络结构
为了证明这种方法的通用型,使用多种架构进行了实例化。不同的架构区别主要在于:1)抽取整幅图特征的网络2)各自用于ROI进行分类、bbox回归和分割的网络。我们使用术语network-depth-features来表示backbone架构。
Backbone使用Resnet-fpn效果比较好,包括精度和速度。
3.1实现细节
超参数采用fast/faster rcnn同样的。
训练
推理 测试时,首先获取到300/1000个proposals,然后在这些proposal上执行box分类和回归,之后使用NMS去除一些box。Mask 分支被用于得分最高的100个box,由于减少了ROI,推理变得更快,acc更高。Mask分支的结果是k*m*m,根据分类分支的结果获取第i个map,然后将该map resize到ROI大小,然后使用0.5的阈值进行处理。
4.实验:实例分割
4.1主要结果
4.2消融研究