语义分割和实例分割_实例分割算法之Mask RCNN

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

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

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

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

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

14e261bafb8f288adf44cb15a0d90bf6.png

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

好,开始讲解Mask RCNN。

Mask RCNN预测流程

先看Mask RCNN的流程图:

8e513221abed17d31efabd89a2c96594.png

另一种表示:

b5adcffdf2e9ac59bbf74331c49f852a.png

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

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

1)ROI Align

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

6091ae5639001a8a870b6961dead4360.png

误差来自于两个阶段:

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

ca2fdd68d63c0e9681273962c50bd577.png

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

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

2da5a1f1b1e1b612f98add6627c8d039.png

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

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

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

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

0b18ebf07631014fa9855a1f147d3ad0.png

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

2)基于FCN的Mask层

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

9404e1cab85a55966ab2a377489abeb7.png

在网络结构上是这样的:

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

fac9550975da43f9a3e3e3b234298043.png

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

附:反卷积

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

卷积起到降维作用:

a869f344a2e53add29aecabc0de84fd8.gif

反卷积起到还原作用:

bca61d9a0586356f4f703dcb8c5133a2.gif

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

418275d94f650623ed6fdd65970e89e1.gif

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

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

017708c1e8b51f48d8b129d5c2448563.png

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

256babe20326fdbd21a03ecb3d7279d5.png

矩阵进行逆运算:

130bcdef64e61f85994261d446dc8e21.png

也就是说50527e8598f5ab3ab640662c2aa10b4f.png代表反卷积所用的卷积核。

以上。

参考

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值