论文在此:https://arxiv.org/pdf/1703.06870.pdf

Mask RCNN是在Faster RCNN基础上的改进算法。这里之所以单独成文是因为Mask RCNN不仅仅用于目标检测,还用于实例分割。

目标检测和实例分割的区别在于,实例分割不仅仅需要将目标识别,还需要将它的轮廓绘出。这意味着需要对每一个像素进行分类。

这么说也不严谨,因为容易跟语义分割混淆。我们还是统一区别一下目标检测,语义分割,实例分割这三者。

下图从左往右分别是目标检测,语义分割,实例分割。

语义分割算法对比 语义分割 实例分割_语义分割算法对比

目标分割是圈出图中目标位置,并对目标分类; 语义分割是圈出目标准确轮廓,并对目标分类;实例分割是圈出目标轮廓,并对目标分类,且在同类别内部再次区分不同个体

好,开始讲解Mask RCNN。

Mask RCNN预测流程

先看Mask RCNN的流程图:

语义分割算法对比 语义分割 实例分割_卷积_02

另一种表示:

语义分割算法对比 语义分割 实例分割_Max_03

Maks RCNN从Faster RCNN改进而来,主要的改进点是:

1)将ROI Pooling改进为ROI Align
2)设计出与图像分类,位置回归平行的第三个分支:基于FCN的mask层用于图像分割

1)ROI Align

ROI Algin的引入是为了解决ROI Pooling精度上的缺陷
ROI Pooling在操作过程中,因为使用了量化,导致proposal框被“四舍五入”,与原框有了误差:

语义分割算法对比 语义分割 实例分割_Max_04

误差来自于两个阶段:

1) 当从feature map上去圈出原图中的框映射过来的ROI时,因为不能保证原图的框坐标正好可以整除缩小到当前feature map上,所以会有量化误差(注意图中黑线边框):

语义分割算法对比 语义分割 实例分割_语义分割和实例分割_05

2)接着,需要进行Max Pooling过程。在前文的章节讲过,为了保持输出结果的shape一致,可以通过高宽分别划分来进行。

现在上图为8*9,需要Max Pooling为3*3,很显然宽可以划分,高被划分3段会出现浮点数。为了避免浮点数,需要将高量化为最近的6以便整除3,所以就是6*9:

语义分割算法对比 语义分割 实例分割_语义分割和实例分割_06

这样经过两个误差之后,ROI其实跟原图所希望圈出的目标框有了不小的误差。

为了避免这个误差,ROI Align决定取消两次量化过程,让浮点数留下来。这样的话,高被分为8/3的三段,宽是3的3段。一共9个区域,每个区域的大小为(8/3,3),如上上图的红线部分。

接下来,进行Max Pooling。此时发现9个区域中的每一个区域都有被“斩断”的像素,我们不知道它的值,因此无法找出哪个才是Max的。怎么办?

此时ROI Align中提出的方法是采用双线性插值来计算虚拟像素点的值,然后进行Max Pooling

语义分割算法对比 语义分割 实例分割_语义分割算法对比_07

如图所示,将9个区域里的每一个区域都等分成4份,并且取中心点值,该值由双线性插值方法获得。然后将这4个点进行Max Pooling,获得代表该区域的值。

2)基于FCN的Mask层

FCN即Fully Convolutional Networks,特点是输出FCN的数据和输入FCN的数据的shape是一致。它是Mask RCNN的核心,因为这个特性意味着一张图片在经过FCN之后能保留每一个像素的一对一映射。保留每一个像素的信息,这使得对图像轮廓的分割成为可能:

语义分割算法对比 语义分割 实例分割_卷积_08

在网络结构上是这样的:

1)将常规CNN网络的最后3个全连接层换成了3个卷积层,这3个层的卷积核大小分别为(1,1,4096),(1,1,4096)和(1,1,21)。意味着每个ROI经过这3个层之后,数据变成了一个21维向量,或者说通道数为21的1*1矩阵。21维向量的每一个数值可以理解为21种类别中某一个的概率值。

2)将21个通道的数据通过反卷积转换为与原图shape一致的特征图,实现像素级的分类。

下图给出了每个ROI和全图的概率转换(种类为1000种)

语义分割算法对比 语义分割 实例分割_语义分割和实例分割_09

上面使用了一个关键的技术:反卷积。下面附带理解一下——

附:反卷积

反卷积(Deconvolution)容易导致误会,其实它不是卷积的逆过程,不如叫它“转置卷积(Transposed Convolution)”更加合适。

卷积起到降维作用:

语义分割算法对比 语义分割 实例分割_卷积_10

反卷积起到还原作用:

语义分割算法对比 语义分割 实例分割_Max_11

也可以使用padding进行反卷积:

语义分割算法对比 语义分割 实例分割_Mask_12

这两个卷积核之间的关系可以通过代数推导:

将矩阵扁平化成为向量X,它通过卷积之后得到向量Y,则有:

语义分割算法对比 语义分割 实例分割_卷积_13

实际上C是下面的稀疏矩阵:

语义分割算法对比 语义分割 实例分割_Max_14

矩阵进行逆运算:

语义分割算法对比 语义分割 实例分割_语义分割和实例分割_15

也就是说

语义分割算法对比 语义分割 实例分割_语义分割和实例分割_16

代表反卷积所用的卷积核。

以上。

参考

https://buptldy.github.io/2016/10/29/2016-10-29-deconv/