一、概述及相关概念简介
(1)概述
FCN:FCN是对图像进行像素级的分类(也就是每个像素点都进行分类),从而解决了语义级别的图像分割问题
与经典的CNN不同,FCN对传入的图片尺寸没有要求,并且舍弃了全连接层,转而使用上采样的方法将最后的输出采样到原图的大小;不仅如此,FCN的lebal并不像CNN那样是文字,而是一张图片;训练图与标签如下所示:
可以说,FCN与CNN的区别在于FCN把CNN最后的全连接层换成卷积层,其输出的是一张已经标记好的图,而不是一个概率值
(2)关于上采样的理解
FCN网络要完成的是对每个像素的分类,所以便需要一个上采样过程将输出上采样至原图大小
双线性插值
双线性插值是图像缩放的一种方式,其主要分为两步线性插值,一是在x方向插值,二是用x方向插值结果再在y方向插值;
首先来看线性插值:
这里x0与x1对应的点为已知,(x,y)为需插值的点,x为插值的位置,相当于已知的自变量,则因变量y,即待插值的计算公式为:
对于双线性插值,实质就是进行两次普通的线性插值;实例如下:红色点为已知,待插值的点为P,方法为先对R1、R2进行插值,再对P进行插值,即完成了双线性插值过程
反卷积上采样
顾名思义,就是利用卷积方法扩大图片大小,主要方法可以利用图像边缘置0,再进行卷积,如下图:
但边缘置0的方法会使得边缘信息表现不佳,于是可以采用在图像中间置0的方法以解决上述问题。如下图:
需要注意的是,反卷积运算的参数和CNN的参数一样是在训练FCN模型的过程中得到的,反卷积层也是卷积层,不关心input大小,滑窗卷积后输出output。deconv并不是真正的deconvolution(卷积的逆变换),最近比较公认的叫法应该是transposed convolution,deconv的前向传播就是conv的反向传播
反池化上采样
这种方法比较好理解,即反向进行最大池化操作;首先我们回顾一下正向的最大池化操作,即下图左边的MaxPooling操作,而反池化需要做的就是将最大值重新放回池化前的位置,其余位置直接置0,即下图右UnPooling过程所示
(3)跳级结构
对CNN的结果做处理,得到了dense prediction,而作者在试验中发现,得到的分割结果比较粗糙,所以考虑加入更多前层的细节信息,也就是把倒数第几层的输出和最后的输出做一个fusion,实际上也就是加和(即下图中黄色部分过程):
实验表明,这样的分割结果更细致更准确。在逐层fusion的过程中,做到第三行再往下,结果又会变差,所以作者做到这里就停了。
二、几种经典FCN网络结构
(1)FCN-8s
这是所介绍的几种结构中效果最好的一种,由于进行了三次上采样过程,加上跳级结构的帮助,该结构进一步融合了几个pooling层的预测结果,详细结构如下:
(2)FCN-16s
与FCN-8s相似,该结构仅使用了两次上采样过程,并使用了调剂结构,融合了最后一个pooling层的预测结果,详细结构如下:
(3)FCN-32s
仅进行了一次上采样过程,并且未使用跳级结构,上采样过程步长为32,故名为FCN-32s,详细结构如下:
三、FCN总结
FCN的卷积网络部分可以部分采用VGG等经典的CNN网络,在这些预训练的基础上进行迁移学习,再让对反卷积的结果跟对应的正向feature map进行叠加输出,从而得到更加准确的像素级别分割
缺点
1.得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感
2.对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性
这里放上自己训练完成后一个预测的效果,自行感受: