Mask R-CNN

论文链接:https://arxiv.org/abs/1703.06870

代码参考:https://github.com/multimodallearning/pytorch-mask-rcnn/blob/master/model.py

一、简介

Mask R-CNN是He Kaiming大神2017年的力作,其在进行目标检测的同时进行实例分割,取得了出色的效果,其在没有任何trick的情况下,取得了COCO 2016比赛的冠军。其网络的设计也比较简单,在Faster R-CNN基础上,在原本的两个分支上(分类+坐标回归)增加了一个分支进行语义分割,如下图所示:

在这里插入图片描述

二、Mask R-CNN详细介绍

那么为什么该网络会有如此好的效果,又有哪些网络细节呢?下面详细逐一介绍。

在介绍Mask R-CNN之前,首先了解一下什么是分割,因为Mask R-CNN是做这个的,所以这个首先要搞清楚,看下图,主要介绍了几种不同的分割,其中Mask RCNN做的是其中的instance segmentation.

  • 语义分割(semantic segmentation):对图像中逐像素进行分类。
  • 实例分割(instance segmentation):对图像中的object进行检测,并对检测到的object进行分割。
  • 全景分割(panoptic segmentation):对图像中的所有物体进行描述。

下面这张图很好的表示了这几者分割的区别,如下图可见,全景分割的难度最大:
在这里插入图片描述

Mask R-CNN如何取得好结果

首先实例分割(instance segmentation)的难点在于:需要同时检测出目标的位置并且对目标进行分割,所以这就需要融合目标检测(框出目标的位置)以及语义分割(对像素进行分类,分割出目标)方法。在Mask R-CNN之前,Faster R-CNN在目标检测领域表现较好,同时FCN在语义分割领域表现较好。所以很自然的方法是将Faster R-CNN与FCN相结合嘛,作者也是这么干的,只是作者采用了一个如此巧妙的方法进行结合,并且取得了amazing的结果。

在以前的instance segmentation中,往往是先分割然后识别,这往往是低效的,并且准确率较低,就比如Dai【论文中提到的】,采用级联的方法,先通过bounding-boxes生成segment区域,然后进行分类。

那么Mask R-CNN是怎么做的呢?

Mask R-CNN是建立在Faster R-CNN基础上的,那么我们首先回顾一下Faster R-CNN,Faster R-CNN是典型的two stage的目标检测方法,首先生成 RPN候选区域, 然后候选区域经过Roi Pooling进行目标检测(包括目标分类以及坐标回归),分类与回归共享前面的网络
Mask R-CNN做了哪些改进?Mask R-CNN同样是two stage的,生成RPN部分与Faster R-CNN相同,然后,Mask R-CNN在Faster R-CNN的基础上,增加了第三个支路,输出每个ROI的Mask(这里是区别于传统方法的最大的不同,传统方法一般是先利用算法生成mask然后再进行分类,这里平行进行

自然而然,这变成一个多任务问题

网络结构如下

下图所示是两种典型的Mask R-CNN网络结构,作者借鉴FPN(不了解FPN可以点击参考此博文)的思想,分别设计了两种网络结构,左边的是采用ResNet or ResNeXt作为网络的backbone提取特征,右边的网络采用FPN网络作为backbone进行特征提取,并且作者指明,使用FPN作为基础网络的效果其实是最好的。
在这里插入图片描述
损失函数的设计是网络的精髓所在

Mask R-CNN的损失函数为: L = L c l s + L b o x + L m a s k L=L_{cls}+L_{box}+L_{mask} L=Lcls+Lbox+Lmask

这里主要介绍一下 L m a s k L_{mask} Lmask L m a s k L_{mask} Lmask是对每个像素进行分类,其含有 K ∗ m ∗ m K*m*m Kmm维度的输出,K代表类别的数量,m*m是提取的ROI图像的大小。 L m a s k L_{mask} Lmask被定义为 average binary cross-entropy loss(平均二值交叉熵损失函数)。这里解释一下是如何计算的,首先分割层会输出channel为K的Mask,每个Mask对应一个类别,利用sigmoid函数进行二分类,判断是否是这个类别,然后在计算loss的时候,假如ROI对应的ground-truth的类别是 K i K_{i} Ki则计算第 K i K_{i} Ki个mask对应的loss,其他的mask对这个loss没有贡献计算二值交叉熵搞的公式如下图中的函数接口。这里不同于FCN的是,FCN是对每个像素进行softmax分类,分为K个类别,然后计算softmax loss。那在inference的时候选择哪个mask作为最终的输出呢?作者根据分类分支的预测结果进行判断,是不是很神奇,并且作者解释到,利用这种方法比softmax效果要好,【这里我觉得是肯定的,因为简化了loss并且利用了分类信息,应该会有提升的】。
在这里插入图片描述
另一个创新点:ROI Align

另外由于分割需要较准确的像素位置,而Faster R-CNN方法中,在进行Roi-Pooling之前需要进行两次量化操作(第一次是原图像中的目标到conv5之前的缩放,比如缩放32倍,目标大小是600,结果不是整数,需要进行量化舍弃,第二次量化是比如特征图目标是5*5,ROI-pooling后是2*2,这里由于5不是2的倍数,需要再一次进行量化,这样对于Roi Pooling之后的结果就与原来的图像位置相差比较大了),因此作者对ROI-Pooling进行了改进,提出了RoI Align方法,在下采样的时候,对像素进行对准,使得像素更准确一些。

ROI Align是怎么做的呢?

ROI-Align取消了所有的量化操作,不再进行4舍5入,如下图所示比较清晰,图中虚线代表特征图,其中黑框代表object的位置,可见object的位置不再是整数,而可能在中间,然后进行2*2的align-pooling,图中的采样点的数量为4,所以可以计算出4个位置,然后对每个位置取距离最近的4个坐标的值取平均求得。采样点的数量怎么计算? 这个可以自己设置,默认是设置4个点。 2*2是4个bin。
在这里插入图片描述

【补充知识】ROI-Warp:在Roi-Pooling前面增加一层,将Roi区域缩放到固定大小,然后在进行roi-pooling,这样就减少了量化的操作。

网络训练

这里其实跟Faster R-CNN基本一致,IOU > 0.5的是正样本,并且 L m a s k L_{mask} Lmask只在正样本的时候才计算,图像变换到短边 800, 正负样本比例 1:3 , RPN采用5个scale以及3个aspect ratio。

inference细节

采用ResNet作为backbone的Mask R-CNN产生300个候选区域进行分类回归,采用FPN方法的生成1000个候选区域进行分类回归,然后进行非极大值抑制操作,** 最后检测分数前100的区域进行mask检测**,这里没有使用跟训练一样的并行操作,作者解释说是可以提高精度和效率,然后mask分支可以预测k个类别的mask,但是这里根据分类的结果,选取对应的第k个类别,得到对应的mask后,再resize到ROI的大小, 然后利用阈值0.5进行二值化即可。(这里由于resize需要插值操作,所以需要再次进行二值化,m的大小可以参考上图,mask最后并不是ROI大小,而是一个相对较小的图, 所以需要进行resize操作。

三、实验结果:

实验效果还是杠杠的,Mask R-CNN轻松打败了上界冠军FCIS(其使用了multi-scale训练,水平翻转测试,OHEM等)
在这里插入图片描述

在这里插入图片描述

溶解实验:

下面一张图基本上说明了所有的对比问题:

  • 表(a),显示了网络越深,效果越好。并且FPN效果要好一些。
  • 表(b),sigmoid要比softmax效果好一些。
  • 表(c,d),roi-align效果有提升,特别是AP75提升最明显,说明对精度提升很有用。
  • 表(e),mask banch采用FCN效果较好(因为FCN没有破坏空间关系
  • 另外作者实验,mask分支采用不同的方法,方法一:对每个类别预测一个mask ,方法二:所有的都预测一个mask,实验结果每个类预测一个mask别会好一些 30.3 vs 29.7

在这里插入图片描述

对于目标检测的结果:

对比下表,可见,在预测的时候即使不使用mask分支,结果精度也是很高的,下图中’Faster R-CNN, ROIAlign’ 是使用ROI Align,而不使用ROI Pooling的结果,较ROI Pooling的结果高了约0.9个点,但是比MaskR-CNN还是低了0.9个点,这个提升,作者将其归结为多任务训练的提升,由于加入了mask分支,带来的loss改变,间接影响了主干网络的效果。

在这里插入图片描述
对于时间消耗来说,Mask R-CNN FPN网络195ms,比Mask R-CNN, ResNet网络的400ms要快一些。

人体关键点检测:

与Mask R-CNN进行Mask检测有什么不同呢?

  • 人体关键点检测,作者对最后m*m的mask进行one-hot编码,并且,mask中只有一个像素点是foreground其他的都是background。
  • 人体关键点检测,最后的输出是m^2-way 的softmax, 不再是Sigmoid,作者解释说,这有利于单独一个点的检测。
  • 人体关键点检测, 最后的mask分辨率是56*56,不再是28*28,作者解释,较高的分辨率有利于人体关键点的检测。
    在这里插入图片描述
  • 15
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值