机器学习21:全卷积神经网络FCN

机器学习21:全卷积神经网络FCN(整理)

           看了很多关于全卷积神经网络的文章和博客,首先放上三篇我认为最有帮助以及适合入门的文章图像语义分割入门+FCN/U-Net网络解析FCN学习:Semantic Segmentation以及10分钟看懂全卷积神经网络( FCN ):语义分割深度模型先驱。在学习过程中因为对全卷积神经网络中的反卷积算法理解的不够透彻,因此对反卷积算法单独整理为一篇博客机器学习17:反卷积算法

           这篇博客大多整理自前三篇文章,关于反卷积算法的原理和实现,可以参考后一篇论文。

1.CNN 与 FCN概述:

   (1)CNN概述:

            1)CNN网络结构概述:

                  CNN在图像分类方面取得了巨大的成就。通常CNN网络有卷积层提取图像特征,在卷积层之后会接上若干个全连接层, 将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量。

                  CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:

                   a.较浅的卷积层感知域较小,学习到一些局部区域的特征;

                   b.较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。

                  这些抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高。下图CNN分类网络的示意图:

                 这些抽象的特征对分类很有帮助,可以很好地判断出一幅图像中包含什么类别的物体,但是因为丢失了一些物体的细节,不能很好地给出物体的具体轮廓、指出每个像素具体属于哪个物体,因此做到精确的分割就很有难度。

                 以AlexNet为代表的经典CNN结构适合于图像级的分类和回归任务,因为它们最后都期望得到整个输入图像的一个概率的数值描述,用来表示输入图像属于每一类的概率(softmax归一化)。比如下图中的猫, 输入AlexNet, 得到一个长为1000的输出向量表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高。

            2)CNN网络结构的缺点:              

                 传统的基于CNN的分割方法为了对一个像素分类,使用该像素周围的一个图像块作为CNN的输入用于训练和预测。这种方法有几个缺点:

                     a.存储开销很大。不断滑动窗口给CNN进行判别分类,因此则所需的存储空间根据滑动窗口的次数和大小急剧上升。

                     b.计算效率低下。针对互有重叠的像素块逐个计算卷积使得计算有很大程度上的重复。

                     c.像素块大小的限制了感知区域的大小。通常像素块只能提取一些局部的特征,从而导致分类的性能受到限制。

   (2)FCN概述:

                 与图像分类不同的是,图像语义分割需要判断图像每个像素点的类别从而进行精确分割,图像语义分割是像素级别的但是由于CNN在进行卷积和池化的过程中特征图逐渐变小,因此丢失了图像细节,所以不能很好地指出物体的具体轮廓、指出每个像素具体属于哪个物体,无法做到精确的分割。

                 针对这个问题,Jonathan Long等人提出了Fully Convolutional Networks(FCN)用于图像语义分割。自从提出后,FCN已经成为语义分割的基本框架,后续算法其实都是在这个框架中改进而来。FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。

                 经典的CNN在卷积层都会在网络的最后加入一些全连接层,经过softmax后就可以获得类别概率信息,但是这个概率信息是1维的,即只能标识整个图片的类别,不能标识每个像素点的类别,所以这种全连接方法不适用于图像分割。

                 而FCN提出可以将后面几个全连接层换成卷积层,这样就可以获得一张2维的特征图,后接softmax获得每个像素点的分类信息,从而解决了分割问题,如下图所示。

   (3)CNN与FCN的区别总结:

                 简单的来说,FCN与CNN的区别在把于CNN最后的全连接层换成卷积层,输出的是一张已经Label好的图片,全卷积网络(FCN)则是从抽象的特征中恢复出每个像素所属的类别,即从图像级别的分类进一步延伸到像素级别的分类。

2.FCN与CNN的转化:

          全连接层和卷积层之间唯一的不同就是卷积层中的神经元只与输入数据中的一个局部区域连接,并且在卷积列中的神经元共享参数,然而在两类层中,神经元都是计算点积,所以它们的函数形式是一样的。因此,将此两者相互转化是可能的。
          全连接层与卷积层的两种变换中,将全连接层转化为卷积层在实际运用中更加有用。假设一个卷积神经网络的输入是 224x224x3 的图像,一系列的卷积层和下采样层将图像数据变为尺寸为 7x7x512 的激活数据体。AlexNet使用了两个尺寸为4096的全连接层,最后一个有1000个神经元的全连接层用于计算分类评分。我们可以将这3个全连接层中的任意全部转化为卷积层:

          针对第一个连接区域是[7x7x512]的全连接层,令其滤波器尺寸为F=7,这样输出数据体就为[1x1x4096]了;

          针对第二个全连接层,令其滤波器尺寸为F=1,这样输出数据体为[1x1x4096];

          对最后一个全连接层也做类似操作,令其F=1,最终输出为[1x1x1000]。

3.FCN技术梳理:         

   (1)卷积化(convolutionalization):

                分类所使用的网络通常会在最后连接全连接层,它会将原来二维的矩阵(图片)压缩成一维的,从而丢失了空间信息,最后训练输出一个标量,这就是我们的分类标签。 而图像语义分割的输出则需要是个二维的分割图,所以需要将全连接层替换为卷积层,而这就是所谓的卷积化。

                再次放上第1节的图片,这张图显示了AlexNet卷积化的过程,简单来说卷积化就是将其最后三层全连接层全部替换成卷积层。

                将全连接层换成卷积有什么好处呢?这里我们要理解一句比较专业的话:如果卷积核的 kernel_size 和输入特征图 的 size一样,那么相当于该卷积核计算了全部特征图的信息,则相当于是一个 kernel_size∗1 的全连接。这句话的大概意思为:当输入的图片大小和卷积核大小一致时,其实等价于建立全连接。                    

                但是还是有区别的,全连接的结构是固定的,当我们训练完时每个连接都是有权重的,而卷积过程我们其实为训练连接结构,学习了目标和哪些像素之间有关系,权重较弱的像素我们可以忽略。

                全连接不会学习过滤,只会给每个连接分权重,但是并不会修改连接关系;卷积则是会学习有用的关系,没有用到的关系它会弱化或者直接 dropout,这样卷积块可以共用一套权重,减少重复计算,还可以降低模型复杂度。

   (2)上采样(Upsampling):

                在一般的CNN结构中,如AlexNet,VGGNet均是使用池化层来缩小输出图片的size,例如VGG16中经过五次池化后图片被缩小了32倍;而在ResNet中,某些卷积层也参与到缩小图片size的过程。 而在语意分割中我们需要得到的是一个与原图像尺寸相同的分割图,因此我们需要对最后一层进行上采样,

                上采样也就是对应于上图中最后生成heatmap的过程。实际上,上采样(upsampling)一般包括2种方式:

                a.Resize,如双线性插值直接缩放,类似于图像缩放;

                b.反卷积(Deconvolution),也叫转置卷积(Transposed Convolution),此处只介绍反卷积。       

                对于一般卷积,输入蓝色4x4矩阵,卷积核大小3x3。当设置卷积参数pad=0,stride=1时,卷积输出绿色2x2矩阵,如图所示。

                而对于反卷积,相当于把普通卷积反过来,输入蓝色2x2矩阵,卷积核大小还是3x3。当设置反卷积参数pad=0,stride=1时输出绿色4x4矩阵,这相当于完全将普通卷积的示意图倒过来。

                传统的网络是降采样的,对应的输出尺寸会降低;上采样的意义在于将小尺寸的高维度特征图恢复回去,以便做像素级预测,获得每个点的分类信息。上采样在FCN网络中的作用如下图所示,明显可以看到经过上采样后恢复了较大的特征图(其中最后一个层21个节点是因为该数据集有20个类别+背景),这其实相当于一个编码和解码的过程。

                如下图所示,a是输入图像,b是经过卷积得到的特征图,分辨率明显下降。经过上采样(反卷积)提升分辨率得到同时,还保证了特征所在区域的权重,最后将图片的分辨率提升原图一致后,权重高的区域则为目标所在区域。

                FCN模型处理过程也是这样,通过卷积和反卷积基本能定位到目标区域,但是模型前期是通过卷积、池化、非线性激活函数等作用输出了特征权重图像,再经过反卷积等操作输出的图像实际是很粗糙的,毕竟丢了很多细节。因此需要通过某种方式填补丢失的细节数据,所以就有了跳跃结构。

   (3跳跃结构(Skip Architecture):

                跳跃结构主要是用来优化最终结果的,思路就是将不同池化层的结果进行上采样,然后结合这些结果来优化输出,具体结构如下:

                而不同的结构产生的结果对比如下:


 4.FCN的训练过程:

          训练过程分为四个阶段, 较浅层的预测结果包含了更多细节信息。比较第二、三、四阶段可以看出,跳级结构利用浅层信息辅助逐步升采样,会产生更精细的结果。

          (1)第一阶段:以经典的分类网络为初始化。最后两级是全连接(红色),参数丢弃不用。

这里写图片描述

          (2)第二阶段:从特征小图(16*16*4096)预测分割小图(16*16*21),之后直接升采样为大图。 反卷积(橙色)的步长为32,这个网络称为FCN-32s。

这里写图片描述

          (3)第三阶段:升采样分为两次完成(橙色×2),在第二次升采样前,把第4个pooling层(绿色)的预测结果(蓝色)融合进来。使用跳级结构提升精确性。 第二次反卷积步长为16,这个网络称为FCN-16s。 

这里写图片描述

          (4)第四阶段:升采样分为三次完成(橙色×3),进一步融合了第3个pooling层的预测结果。第三次反卷积步长为8,记为FCN-8s。 

这里写图片描述

 

5.FCN的缺点:

          (1)得到的结果仍然不够精细,进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。

          (2)对各个像素进行分类没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。

6.实践与代码分析

          作者在github上开源了代码:Fully Convolutional Networks,首先将项目克隆到本地。项目文件结构很清晰,如果想训练自己的模型,只需要修改一些文件路径设置即可,本文应用已经训练好的模型来测试一下自己的图片:

          下载voc-fcn32s,voc-fcn16s以及voc-fcn8s的caffemodel(根据提供好的caffemodel-url),fcn-16s和fcn32s都是缺少deploy.prototxt的,根据train.prototxt稍加修改即可。

          (1)标签图片生成:

                   从VOCdevkit处下载VOC2012的训练/验证集,解压之后,在SegmentationClass文件夹下可以看到标签图像。

                   在PIL中,图像有很多种模式,如'L'模式,’P'模式,还有常见的'RGB'模式,模式'L'为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。

                   模式“P”为8位彩色图像,它的每个像素用8个bit表示,其对应的彩色值是按照调色板索引值查询出来的。标签图像的模式正是'P'模式,因此测试时要生成对应标签图像的图片的话,构建一个调色板即可。

                   按照上图,对应修改调色板和infer.py,就可以测试自定义图片。如上述,对代码的主要修改是增加了一个调色板,将L模式的图像转变为P模式,得到类似标签图像的图片。接下来只需要修改script中的图片路径和model的路径,就可以测试自己的图片了。

          (2)测试结果:

                    1)结果对照:

                          下图为的最终结果,可以看出skip architecture对最终的结果确实有优化作用,这里没有对最终结果上色。

                          按照VOC的颜色设置之后,可以得到论文结果。

                    2)其他图片测试结果:

                          下面是测试其他一些图片的结果:

6.参考资料:

           (1)https://zhuanlan.zhihu.com/p/30195134

           (2)https://blog.csdn.net/qq_36269513/article/details/80420363

           (3)图像语义分割入门+FCN/U-Net网络解析

           (4)FCN学习:Semantic Segmentation

           (5)10分钟看懂全卷积神经网络( FCN ):语义分割深度模型先驱

发布了84 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_39504171/article/details/103885280