ICCV2017(Instance Segmentation):Mask R-CNN-论文解读《Mask R-CNN》

原文地址

https://arxiv.org/pdf/1703.06870v3.pdf

论文阅读方法

三遍论文法

初识(Abstract & Introduction & Conclusion)

由于Powerful Baseline System的驱动,目标检测(Fast/Faster R-CNN)领域以及语义分割(FCN)领域得到了快速发展,而本文的目标就是为实例分割领域建立一个simple, flexible并且fast的Framework

实例分割任务十分具有挑战性,它是目标检测任务与语义分割任务的融合,其要求网络检测图像中的所有目标,并同时准确地分割每个实例

在这里插入图片描述
本文提出的方法叫Mask-RCNN,主要在Faster R-CNN的基础上进行扩展。如上图所示,Faster R-CNN本身有一条用于分类以及bounding-box回归的分支,在同一级别(与其平行)增加一条分支用于预测每个ROI的mask(全卷积网络)。并且这条新增的mask分支不会带来很大计算负担,在GPU上达到5Fps(基本上与Faster RCNN一致)。

相识(Body)

2. Related Work

RCNN

首先提到了RCNN家族,包括R-CNN,Fast R-CNN以及Faster R-CNN,并指出目前目标检测任务,基于Faster R-CNN框架改进的网络仍在各大benchmark上表现不俗,这说明Faster R-CNN框架是灵活、鲁棒的。

Instance Segmentation

由于R-CNN的发展,许多实例分割的方法是基于segment proposals的,早期的一些方法采用自下而上的分割;DeepMask系列工作是先生成分割候选框,然后送入Fast R-CNN进行分类;Dai提出了一个多阶段的级联方法,先从bounding-box预测生成分割proposal,再做分类。这些方法先分割再分类,既影响了速度又降低了精度,而Mask R-CNN同时进行分类与分割,更简单也更灵活。

最近,Li提出了"fully convolutional instance segmentation(FCIS)",结合了分割proposal和目标检测系统,利用全卷积预测一组位置敏感的输出channels,这些channels同时解决分类、定位、分割任务,使得系统变得很快,但FCI出现很多错误,例如实例重合、虚假边界等等。

3. Mask R-CNN

之前也提到过,Mask R-CNN的idea的是很简单的,就是在Faster R-CNN的基础上额外增加一个预测mask的分支。相较于分类与bounding-box回归的分支,mask分支需要提取更精细的空间布局信息

Faster R-CNN

Faster R-CNN为两阶段检测器:1. 使用RPN生成Proposals ;2. Fast R-CNN结构,ROI pooling层 + 两条分支(分类+bounding-box偏移量预测)。

其中RPN与检测网络共享卷积计算

Mask R-CNN

同样为两阶段:首先第一阶段不变,仍为RPN;第二阶段,在输出类别和box偏移分支的基础上,增加一条分支为每个ROI输出一组binary mask。

训练使用的损失函数仍为multi-task loss
在这里插入图片描述
Lcls 和 Lbox 的定义与Faste RCNN一致,Mask R-CNN新增了Lmask,首先明确mask分支对每个ROI的输出维度为Km2,代表K个分辨率为m x m的binary mask(K为类别数),而Lmask 为平均二元交叉熵损失(average binary cross-entropy loss)。ROI的ground-truth类别为k,因此Lmask 只与第k个mask有关(其他的mask不计算loss)。

Lcls 和 Lbox 的详情可参见我另一篇博客的对应段落 (https://blog.csdn.net/qq_36560894/article/details/108090046)

需要注意的是,Mask R-CNN分离了分类与分割任务(与语义分割不同 eg. FCN),它为每一个类别都生成了一个binary mask,不存在类别间的竞争,这个设计对于最后的结果很重要

语义分割网络,例如FCN最后会输出一个m x m x (K+1)的mask,(k+1)表示所有目标类别+背景,分类与分割同时进行,所以网络中使用softmax + 多元交叉熵损失;而Mask R-CNN的mask分支对每一类都预测一个binary mask,这不存在类别间的竞争,分类任务依赖于分类分支,所以使用sigmoid+二元交叉熵损失

ROI Align

在Faster RCNN中为了得到固定尺寸的feature map,使用了ROI pooling,为了方便计算,使用了两次量化:

  1. RoI boundaries: 生成的Anchor映射到feature map上的RoI坐标通常为浮点数,会进行取整;

    比如生成的Anchor长宽为200x200,经过backbone(output stride为16),变为100/16=6.25,通常会取整为6x6

  2. **RoI bins:**在进行ROI pooling时,会划分为特定尺寸的区域(eg. 2x2),会对每个单元的边界进行取整。

    如下图,RoI尺寸为4x5,进行2x2的RoI Pooling时会被划分为2个2x2的区域 + 2个2x3的区域`

两次取整过程如下图所示(图来自参考[1]):
在这里插入图片描述
这种像素不对齐误差可能不会影响到分类性能,但对于像素级的分割任务是无法忍受的

比如6.25变为了6,产生的0.25像素差距变换到原图中就是0.25x16=4像素差距

因此作者提出了RoI Align,不进行量化取整,将提取的feature map与输入正确对齐。idea很简单,在RoI boundaries和bins的过程不进行任何取整操作,使用采样的策略并使用双线性插值来获取RoI每个区域内的特征值,然后再对各区域进行max/avg Pool操作(图来自参考[2])。

  1. 将RPN生成的Proposal映射到Feature Map的相对区域(下图的黑色区域,边界大概率无法落到真实的像素点上)
  2. 划分区域(假设为2x2,图中四个黑色区域),在每个区域内采样4个点(蓝色点)
  3. 对每个采样点进行双线性插值(下图左),从而求得蓝点值
  4. 每个区域内得到四个蓝点,进行pooling操作,得到每个区域结果,从而得到最后输出

关于更具体的细节可以参见这篇博客:https://zhuanlan.zhihu.com/p/61317964

在这里插入图片描述
Network Architecture

明确两个概念 1) Backbone:用于整张图像的特征提取;2) Network head:在RoI上进行的两条分支(bounding-box分类/回归 + 预测mask)

关于Backbone,作者主要介绍了两类网络,一类是大家比较熟悉的ResNet和ResNeXt,另一类为FPN(其中ResNet-FPN作为backbone效果最好)。
在这里插入图片描述
这里介绍一下FPN结构(这部分图均来自参考[1]),如上图所示,FPN包含自下而上、自上而下以及横向连接三个部分(有点类似于U-Net),其中每一层都进行输出(具有不同的分辨率),它是一种通用的架构,可以结合各种不同的Backbone(ResNet、VGG等),下图为ResNet-FPN结构图。
在这里插入图片描述
使用ResNet-FPN作为backbone的Mask RCNN网络结构如下图所示:Backbone会产生不同分辨率的输出,具体使用哪种分辨率的feature map来提取特征取决于RoI的尺度(大尺度RoI(小目标)使用小分辨率feature map,小尺度RoI(大目标)使用大分辨率feature map)。

大目标使用小分辨率的Feature Map,主要为了下一步进行RoI Pooling时能捕获到适当的特征:如果使用大分辨率,RoI Pool时每个区域包含的特征数量过多,这样进行max pool可能会损失掉一些特征;而使用小分辨率,区域内为融合程度较高的高级语义特征,且数目比较适当。

eg. 224x224大小的Anchor在大分辨率下的RoI Pool操作:(P2) 128x128 Feature Map → 2x2 fixed size,小分辨率:(P5) 8x8→2x2;明显是小分辨率(P5)要更合理。

小目标使用大分辨率的Feature Map,这同样也是为了在进行RoI Pooling时能捕获到适当的特征:如果使用小分辨率,可能会出现特征数量过小,这样无法进行RoI Pool操作;而使用大分辨率,能保留尽可能多的空间细节和特征数量。

eg. 32x32大小的Anchor在大分辨率下的RoI Pool操作:(P2) 16x16 Feature Map → 2x2 fixed size,小分辨率:(P5) 1x1→2x2;明显是大分辨率(P2)要更合理。

在这里插入图片描述
关于Network head的设计,作者分别为ResNet和FPN设计了不同的架构,如下图所示:
在这里插入图片描述
图左是ResNet作为backbone时network head的架构,其中res5表示ResNet的第5个stage(backbone只用到前4个stage提取特征);图右为FPN作为backbone时的架构,其中x4代表连续进行4次卷积。

3.1 Implementation Details

Training

训练基本与Faster R-CNN设置一样,RoI与groundtruth的IoU大于0.5时为positive,否则为negative,Lmask的计算只与positive RoI有关。训练策略同样为"image-centric",最短边为800,mini-batch=2,每张图像获取N个RoIs(正负比例1:3),使用ResNet时N=64,FPN时N=512。

8GPUs (mini-batch=16),160k iterations,lr=0.02(在120k iteration时下降10倍),weight decay=0.0001,momentum=0.9

RPN生成的Anchors使用5种scales和3种aspect ratios,除了特殊说明,本文中的RPN与Mask R-CNN没有共享权重。

RPN与Mask R-CNN提取特征的backbone是相同的,所以它们可以共享,这里是为了方便后续的消融实验

Inference

测试阶段,使用ResNet时proposal数量为300,FPN时为1000。在bounding-box预测分支(分类+回归)后会进行非极大值抑制处理,mask分支只对得分前100的bounding-box进行分割

这也意味着测试阶段是先做bounding-box预测再做mask预测,不像训练阶段是并行的过程。但这种策略还是加快了速度,因为待分割的bounding-box变少了。

mask分支会为每个RoI预测得到K个binary mask,取第k个mask,k为bounding-box分支预测得到的类别。最终我们得到一个mxm的binary mask,先Resize到RoI的尺寸,然后进行二值化(阈值0.5)。

4. Experiments: Instance Segmentation

Mask R-CNN在COCO数据集上进行了实验,COCO数据集包含3个部分,trainval135k用于训练,minival可以用来进行自测或做一些消融实验,test-dev为最终的测试集(标签为公开)。

实验方面这里就不再赘述了,贴上结果以及简单地说明一下,有兴趣可以看原文对应段落

在这里插入图片描述
上图为Mask R-CNN与一些SOTA方法的比较
在这里插入图片描述
上图为消融实验结果,包括了关于①backbone结构;②是否分离mask分支中的分类与分割任务;③ROI Align的有效性;④mask分支FCN的有效性 几个方面的探索。
在这里插入图片描述
Mask R-CNN还在目标检测任务上进行了实验(取消了mask分支),也取得了不错的成绩,上图为实验结果

5. Mask R-CNN for Human Pose Estimation

Mask R-CNN还可以很好地推广到姿态估计任务上,做一点微小的修改,使网络输出K个mask,每个mask对应一个关节点类型(共K类),与实例分割一样,K个关键点被分别计算,不存在相互竞争。

Human Pose Estimation需要得到一组m x m的binary mask,其中只有一个像素点被标注(代表前景),所以训练时,对m2维的softmax输出(只得到一个点)计算交叉熵损失。这里就不细说修改后的网络结构了,有兴趣可以参照原文,只做了一些微小的改动。

即使网络设计未涉及到姿态估计的领域知识,但其表现还是很惊艳,在COCO数据集上实验结果如下(SOTA):
在这里插入图片描述
进行了一些消融实验,探索了ROI Align的有效性(比在实例分割中提升更多,说明对于位置敏感性任务增益很大),结果如下表所示:
在这里插入图片描述
值得注意的是Mask R-CNN能以5Fps的速度同时预测bounding box,分割mask以及关键点(同时做了目标检测、示例分割、人体姿态估计任务),进行多任务学习的实验结果如下:
在这里插入图片描述

回顾(Review)

虽然Mask R-CNN只是Faster R-CNN的扩展,但如何构造这条mask分支很重要。Faster R-CNN本身用于目标检测任务,输入和输出并不是按照像素一一对齐(pixel-to-pixel alignment)的,Faster R-CNN中的ROI pooling层在提取区域特征时的空间操作很粗略,这样会失去空间位置信息,对分割很不利,因此作者提出了RoIAlign以保留精确的空间信息。其次,与FCN不同的是,本文分离了mask和class预测任务(FCN进行像素级的多分类任务,既包含分割也包含分类),Mask R-CNN的mask分支单独为每一类预测一个binary mask(mask分支不进行分类,分类仅依赖于cls分支)。在不使用任何Tricks的情况下,Mask R-CNN就已经在Object Detection、Instance Segmentation数据集上达到了新的SOTA,并且其具有很好的泛化能力,在人体姿态估计任务上也有不错的表现。不得不说,凯明出品,必属精品。

但是还是可以发现有一些不足,例如在进行最后的mask复原时,仅依靠一个分辨率为28x28的binary mask进行Resize操作,这样会导致最后的分割结果不够准确,细节处理不够好。所以,作为一个强大的Baseline,也出现了很多基于mask R-CNN改进的方法,并取得不错的效果。

参考

[1] https://zhuanlan.zhihu.com/p/37998710 知乎:令人拍案称奇的Mask RCNN 作者:Stone

[2] https://zhuanlan.zhihu.com/p/73138740 知乎:ROI Pooling和ROI Align 作者:Jarvix

代码

先贴上一份GitHub代码(click me),有空再复现一下。


以上为个人的浅见,水平有限,如有不对,望大佬们指点。

未经本人同意,请勿转载,谢谢。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值