Mask RCNN 用于实例分割的Mask RCNN网络

论文在

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

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

Mask RCNN的改进点

先看Mask RCNN的流程图:

另一种表示:

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

ROI Align

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

误差来自于两个阶段:

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

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

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

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

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

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

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

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

基于FCN的Mask层

FCN即Fully Convolutional Networks,特点是输出和输入的shape一致。这个特性意味着一张图片在经过FCN之后能保留每一个像素的一对一映射,这是非常适合用来进行图像分割的:

在网络结构上是这样的:

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种)

上面提到了一个关键的技术:反卷积

反卷积

反卷积(Deconvolution)容易导致误会,叫“转置卷积(Transposed Convolution)”更加合适。

卷积起到降维作用:

反卷积起到还原作用:

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

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

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

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

矩阵进行逆运算:

也就是说代表反卷积所用的卷积核。

以上。

参考

https://blog.csdn.net/gusui7202/article/details/84799535
https://buptldy.github.io/2016/10/29/2016-10-29-deconv/