深度学习之语义分割、实例分割(FCN、Mask RCNN理论篇)

背景:最近在学习深度学习中分割相关的知识点,看了一些论文,这里挑出了两篇经典的并且有代表性的论文,写一篇博客记录一下读后感,供自己回忆,供有需要的人参考~

1、FCN(语义分割中的“典型”)

一、概述:

FCN(Fully Convolutional Networks)是Jonathan Long等人在2015年CVPR中提出的首个端对端的针对像素级预测的全卷积网络,也是深度学习用于语义分割领域的开山之作。FCN将传统的CNN网络后面的全连接层换成了卷积层,同时,使用转置卷积进行上采样,将最终的输出还原为原图像大小。


论文:Fully Convolutional Networks for Semantic Segmentation

二、算法流程:

深度学习之语义分割、实例分割(FCN、Mask RCNN理论篇)_第1张图片

 FCN总体算法步骤可以分为两步:

1、全卷积部分:

首先对输入的图片采用VGG16 Backbone提取特征(最后三层没有用FC)而是改用了3个卷积,分别是Cov2d 7x7、Conv2d 1x1、Conv2d 1x1,这也就是全卷积中的“全”字的由来,采用Conv2d代替了最后三层的FC。

注:7 * 7 * 512直接Flatten的后是20558,则丧失了高度和宽度信息,而改用7 * 7的卷积最终得到的参数是一样的,并且保留了高度和宽度信息

2、反卷积部分:

拿到步骤1的输出,作为本步骤的输入,然后采用转置卷积(ConvTranspose2d)进行上采样,比如上采样32倍,此时图片还原到了原图的大小,输出的shape为h*w*num_cls,那么此时num_cls就是要分类的类别数+背景=21类,那么就拿到了相当于21个通道的高度为h宽度为w的图片,那么图片中的每一个像素点在21个通道中的最大值就是该点预测的像素所属于的类别,并且这个图片最终可以以热力图的形式展现出来。

注:FCN-16s和FCN-8s还采用了跳级结构,其实就是不同层的预测结果结合起来,有点类似于特征融合的意思。(其中-16s和-8s)表示的意思是将步骤1的输出大小上采样16倍和8倍;转置卷积不是卷积的逆运算,也是一种卷积。

三、FCN-32s框架:

深度学习之语义分割、实例分割(FCN、Mask RCNN理论篇)_第2张图片

 四、FCN读后感:

创新点:

1、把全连接层改用了卷积层,这样就可以使用任意尺寸的输入。

2、采用了反卷积(转置卷积)进行上采样,这样就可以更合理的还原图片为原来的大小。

3、结合不同深度层次的跳级结构,融合不同层的特征,使得预测结果更加精准。

不足之处:

1、通过比对输出结果和ground truth,可以发现得到的结果还不够精细,对细节不够敏感。

2、未考虑像素与像素之间的关系,缺乏空间一致性等。

参考博客如下,感谢~

博客1

五、损失计算:

损失计算:Cross Entropy Loss,对每个pixel做cross entropy loss

2、Mask R-CNN(实例分割中的“典型”)

一、概述:

Mask R-CNN是2017年何大神等人在ICCV中提出的用在实例分割中的论文,此外作者中还有R-CNN系列的大神Ross Girshick,Mask R-CNN不仅仅是可以用在实例分割中,还可以做目标检测以及人体关键点检测任务,可谓是集大成者,同时也是2D实例分割中的“典型”。

论文:Mask R-CNN

二、算法流程:

深度学习之语义分割、实例分割(FCN、Mask RCNN理论篇)_第3张图片

 Mask R-CNN总体算法步骤可以分为两步(或是说两个分支):

1、Faster R-CNN分支:

这个分支基本上就是Faster R-CNN一样的处理方式,即先把图像输入到网络得到相应的特征图,然后使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵。将每个特征矩阵通过RoIAlign缩放到7x7大小的特征图,接着将特征图拉平然后通过一系列的全连接层分别预测class和回归box。

注:Faster R-CNN中拿到特征矩阵之后做的是RoI pooling,而这里因为要考虑到丢失在实例分割中可能小部分像素的舍去便会对最终的结果产生明显的影响,也即RoI pooling可能会带来图像shape取整导致的定位不准确问题(文中称为misalignment问题)。

2、Mask分支:

拿到步骤1前期处理得到的特征矩阵之后,开始使用RoIAlign操作把每个特征矩阵缩放到14x14大小的特征图,然后经过卷积进行更深层的特征提取,此时shape不变,然后通过转置卷积ConvTranspose2d 2x2, s2, p0之后,得到shape为28x28x256的图像,然后经过一个1x1的卷积改变通道数为num_cls,于是最后得到的便是28x28xnum_cls的Mask图像,其中对于输入的这个候选框,会给出这个框属于不同类别的28x28的Mask,然后和原图中对应位置进行贴合,就可以得到实例分割的结果图了。

注:训练网络的时候输入Mask分支的图像是由RPN提供的,即Proposals,但在预测的时候输入Mask分支的图像是由Fast R-CNN提供的,个人感觉这样操作有点类似于在训练的时候进行数据增强的意思。

三、Mask R-CNN框架:

1) Faster R-CNN分支:

Faster R-CNN框架

2) Mask分支:

深度学习之语义分割、实例分割(FCN、Mask RCNN理论篇)_第4张图片

注:该分支的输入HxWx256就是Faster R-CNN中的RPN结果给出的众多候选框投影到特征图中的特征矩阵。

 四、Mask R-CNN读后感:

创新点:

1、用RoIAlign替换了Faster R-CNN中的RoI pooling,并且RoIAlign中用到了双线性插值,在实例分割中的效果显著。

2、Mask分支很巧妙的和Faster R-CNN这个分支并联起来。

3、Mask分支中采用了FPN结构

看完不得不说何大神YYDS

五、损失计算:

Mask R-CNN的损失就是在Faster R-CNN的基础上加上了Mask分支上的损失,即:

Loss = L\_rpn + L\_fast rcnn + L\_mask

其中Mask分支的损失就是二值交叉熵损失(Binary Cross Entropy)。

参考博客如下,感谢:

博客1、博客2、博客3

你可能感兴趣的:(计算机视觉,深度学习,人工智能,目标检测,计算机视觉)