Mask R-CNN

一、前言

  • 本文提出了一个概念上简单且灵活通用的目标分割框架——Mask R-CNN
  • Mask R-CNN能有效地检测图像中的目标,同时能为每个实例生成高质量的分割掩码
  • Mask R-CNN训练简单,相对于Faster R-CNN,只需增加一个较小的开销,运行速度可达5 FPS,且很容易推广到其他任务中

二、模型与方法

2.1 设计思路

  • 由于Fast/Faster R-CNN和FCN的出现,使得目标检测和语义分割的效果在短时间得到了很大改善
  • 目标分割它需要正确检测图像中的所有目标,同时也要精确地分割每个目标
  • 目标检测的目的是对目标进行分类,并使用边界框定位每个目标,既是语义分割,又是另一种形式的检测
  • 通过结合目标检测和目标分割最新研究的方法来改善目标分割的结果

Mask R-CNN
主要思路:

  • 在Faster R-CNN的基础上,添加一个用于在RoI上预测分割掩码的分支
  • 掩码分支与用于分类和目标检测框回归的分支并行执行
  • 掩码分支是作用于每个RoI的小FCN,以像素到像素的方式预测分割掩码

2.2 Mask Representation

在目标检测中,如Faster R-CNN中,模型的输出是目标的类别和位置偏移量信息,这信息在模型中,由于通过了全连接层,从而无法避免的输出向量的形式,而掩码不同,它描述的是目标空间布局信息,因此需要通过卷积操作,来实现空间结构上像素到像素对应关系的掩码。

在本文中,作者通过FCN来每个Roi预测一个mxm的掩码,这允许掩码分支中的每个层显式地保持目标的空间布局,而不会将其缩成缺少空间维度的向量表示。此外,使用全卷积对掩码进行预测,需要的参数相对来说更少,并且实验证明其准确度更高。

2.3 RoI Align

2.3.1 Roi pooling的问题

在目标检测网络模型中,因为输出阶段有fc层的存在,所以需要以固定尺寸输入到fc层,因此为了解决不同大小的Roi对应的feature map的输入要以固定的尺寸输入到fc层,提出了Roi pooling方法。
由上述可知,目标分割需要输出像素到像素精确对应的掩码,然而Roi pooling方法会出现原图上的Roi与feature map上对应区域不对准的情况,具体例子如下:
Mask R-CNN
在Faster RCNN中,有两次整数化的过程:

  • region proposal的xywh通常是小数,但是为了方便操作会把它整数化。
  • 将整数化后的边界区域平均分割成 k x k 个单元,对每一个单元的边界进行整数化。

事实上,经过上述两次整数化,此时的候选框已经和最开始回归出来的位置有一定的偏差,因为分类任务是具有平移不变性的,所以影响比较小,但是这在预测像素级精度的掩码时,就会产生非常的大的负面影响

2.3.2 RoI Align操作

为了解决上述所提到的问题,ROI Align方法取消整数化操作,保留了小数,使用双线性插值的方法获得坐标为浮点数的像素点上的图像数值。但在实际操作中,ROI Align并不是简单地补充出候选区域边界上的坐标点,然后进行池化,而是重新进行设计。

下面通过一个例子来讲解ROI Align操作:
Mask R-CNN
如上图所示,虚线部分表示feature map,实线表示ROI,这里将ROI切分成2x2的单元格。如果采样点数是4,那我们首先将每个单元格子均分成四个小方格(如红色线所示),每个小方格中心就是采样点。这些采样点的坐标通常是浮点数,所以需要对采样点像素进行双线性插值(如四个箭头所示),就可以得到该像素点的值了。然后对每个单元格内的四个采样点进行maxpooling,就可以得到最终的ROIAlign的结果

2.3.3 双线性插值

线性插值:
已知数据(x0,y0)(x_0,y_0)与(x_1,y_1),要计算[x0,x1][x_0,x_1]区间内某一位置x在直线上的y值,如下图所示
Mask R-CNN
通过斜率相等构建y和x之间的关系,即可得y值的表达式
Mask R-CNN
其基本思想,就是用xxx0x_0x1x_1的距离作为一个权重,用于y0y_0y1y_1的加权,其中,除以xx0x-x_0是起到归一化的作用

双线性插值:
双线性插值本质上就是在两个方向上做线性插值。
Mask R-CNN
如图,假设我们想得到P点的插值,我们可以先在x方向上,对 Q11Q_{11}Q21Q_{21}之间做线性插值得到R1R_1R2R_2同理可得。然后在y方向上对R1R_1R2R_2 进行线性插值就可以得到最终的P。其实知道这个就已经理解了双线性插值的意思了,如果用公式表达则如***意 ff 前面的系数看成权重就很好理解了)。
首先在 x 方向进行线性插值,得到
Mask R-CNN
然后在 y 方向进行线性插值,得到
Mask R-CNN
这样就得到所要的结果 f(x,y)f(x,y)
Mask R-CNN

2.4 Mask RCNN

Mask RCNN = ResNet + FPN + RPN + RoI Align + Head Architecture
Mask R-CNN
模型结构:

  • 骨干网络:ResNet+FPN,用于提取特征
  • RPN——进行候选区域推荐,RoI Align层固定输出
  • 头部结构:边框回归、分类、Mask预测

本文中,作者提出了两种头部结构,如下图所示:
Mask R-CNN

2.5 损失函数

Mask RCNN定义多任务损失:
L=Lcls+Lbox+LmaskL=L_{cls}+L_{box}+L_{mask}其中,

  • LclsL_{cls}LboxL_{box}与Faster RCNN中的相同
  • LmaskL_{mask}是掩码分支中的Sigmoid二分类损失

LmaskL_{mask} 的说明:

  • 假设掩码分支最后得到的大小为mxmxk,则将ground truth缩放到mxm以针对每个点做二分类损失
  • 在计算Sigmoid二分类损失时,不是每个类别的sigmoid输出都计算二值交叉熵损失,而是该像素属于哪个类,哪个类的sigmoid输出才要计算损失

Mask R-CNN
如上图所示,K个通道表示有k个类别,假设人是第k类,那么只会用第k个mask与ground truth中人的mask做Sigmoid的二分类损失。

三、总结

3.1 解决的问题

问题:

  • Roi pooling方法会出现原图上的Roi与feature map上对应区域不对准的情况

解决:

  • 提出了Roi Align,解决了不对准问题

3.2 主要创新点

  • 提出了RoI Align,解决了misalignment问题
  • 提出了一个概念上简单且灵活通用的目标分割框架——Mask R-CNN

参考文献

[1] https://zhuanlan.zhihu.com/p/37998710
[2] https://zhuanlan.zhihu.com/p/66973573
[3] https://zhuanlan.zhihu.com/p/65321082
[4] https://zhuanlan.zhihu.com/p/25954683
[5] https://zhuanlan.zhihu.com/p/39748372
[6] https://blog.****.net/xiaqunfeng123/article/details/78716136