【个人整理】一文看尽全卷积网络FCN设计架构以及设计思想

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27825451/article/details/89355174

前言:语义分割(Semantic Segmentation)是计算机视觉领域的热点领域之一,当前与目标检测、实例分割等都是非常热门的研究,但是语义分割的历史溯源却非常早,知道深度学习的兴起,特别是卷积神经网络的兴起,给语义分割带来新的发展方向,当前语音分割的模型层出不穷,他们的思想起源都来自于全卷积神经网络,即所谓的FCN,本文就来盘点一下FCN的核心设计思想。

一、什么是语义分割(Semantic Segmentation)

1.1 图像分割的发展历史

1.2 基于深度学习的图像分割技术

1.3 当前一些流行的语义分割模型

二、全卷积网络FCN的三个核心思想

2.1卷积化(Convolutional)——以AlexNet为例

2.2 上采样(Upsample)

2.3 跳跃结构(Skip Layer)

三、FCN的结构以及训练

3.1 训练的四个阶段

3.2 逐像素预测分类

3.3 逐像素分类中的度量指标

四、FCN的优缺点以及拓展

4.1 FCN的优点

4.2 FCN的缺点

4.3 FCN的扩展

一、什么是语义分割(Semantic Segmentation)

同目标检测不一样,目标检测只需要确定物体对象的类别和位置即可,但是语音分割需要将各个物体的边界完全区分出来,在语义分割中我们需要将视觉输入分为不同的语义可解释类别。

从本质上来说:语音分割就是将图片上的所有像素点进行分类;从效果上来说,就类似于抠图,即对图像中不同的物体进行抠图。

1.1 图像分割的发展历史

所有的发展都是漫长的技术积累,加上一些外界条件满足时就会产生质变。我们简单总结了图像分割的几个时期:

2000年之前,数字图像处理时我们采用方法基于几类:阈值分割、区域分割、边缘分割、纹理特征、聚类等。

2000年到2010年期间, 主要方法有四类:基于图论、聚类、分类以及聚类和分类结合。

2010年至今,神经网络模型的崛起和深度学习的发展,衍生出了种类繁多的网络模型,后面会介绍到。

1.2 基于深度学习的图像分割技术

基于深度学习主要的做法有两种:

(1) 基于图像分块:利用像素、超像素块周围小邻域进行独立的分类。(在分类网络中使用全连接层,固定图像块尺寸)

         为了对一个像素分类,使用该像素周围的一个图像块作为CNN的输入用于训练和预测。这种方法有几个缺点:一是存储开销很大。例如对每个像素使用的图像块的大小为15×15,然后不断滑动窗口,每次滑动的窗口给CNN进行判别分类,因此则所需的存储空间根据滑动窗口的次数和大小急剧上升。二是计算效率低下。相邻的像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算也有很大程度上的重复。三是像素块大小的限制了感知区域的大小。通常像素块的大小比整幅图像的大小小很多,只能提取一些局部的特征,从而导致分类的性能受到限制。

(2) 基于全卷积网络FCN:对图像进行pixel-to-pixel的预测,可以得到任意大小的图像分割结果,而且不需要对每个图像块进行分类,速度快。重要的两点:卷积层上采样、skipconnection结构

         FCN对CNN的改进,通常CNN网络在卷积层之后会接上若干个全连接层, 将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量。以AlexNet为代表的经典CNN结构适合于图像级的分类和回归任务,因为它们最后都期望得到整个输入图像的一个数值描述(概率),比如AlexNet的ImageNet模型输出一个1000维的向量表示输入图像属于每一类的概率(softmax归一化)。FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。FCN把cnn全连接层换成了卷积层,可以接受任意尺寸的输入图像,采用反卷积对卷积层的特征图进行采样,使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测,同时保留了原始输入图像的空间信息,然后在上采样上的特征图进行逐像素分类,最后逐个像素计算softmax损失,相当于每个像素对应一个训练样本。(后面会细说)

1.3 当前一些流行的语义分割模型

  • 2014年 FCN 模型,主要贡献为在语义分割问题中推广使用端对端卷积神经网络,使用反卷积进行上采样
  • 2015年 U-net 模型,构建了一套完整 的编码解码器
  • 2015年 SegNet 模型,将最大池化转换为解码器来提高分辨率
  • 2015年 Dilated Convolutions(空洞卷积),更广范围内提高了内容的聚合并不降低分辨率
  • 2016年 DeepLab v1&v2
  • 2016年 RefineNet 使用残差连接,降低了内存使用量,提高了模块间的特征融合
  • 2016年 PSPNet 模型
  • 2017年 Large Kernel Matters
  • 2017年 DeepLab V3

          以上几种模型可以按照语义分割模型的独有方法进行分类,如专门池化(PSPNet、DeepLab),编码器-解码器架构(SegNet、E-Net),多尺度处理(DeepLab)、条件随机场(CRFRNN)、空洞卷积(DiatedNet、DeepLab)和跳跃连接(FCN)。

         当然论文和模型的数量远远不止于此,上面所列出来仅仅是一些有代表性的模型,现在已经分化出了数以百计的模型结构。当然,经过从技术和原理上考究,我们发现了一个特点,那就是当前最成功的图像分割深度学习技术都是基于一个共同的先驱:FCN(Fully Convolutional Network,全卷积神经网络),这也是本文的讨论对象。

二、全卷积网络FCN的三个核心思想

前面所说的不管是图像分类问题,还是基于CNN的图像分割问题,最后都会跟上全连接层,二全卷积网络就是将这些全连接层也用卷积层代替,没有全连接层,这就是为什么称之为全卷积网络的原因,即Fully Convolutional Network。从管技术上来说,全卷积网络FCN主要涉及到三大核心设计思想,即:

  1. 卷积化(Convolutional)
  2. 上采样(Upsample)
  3. 跳跃结构(Skip Layer)

后面会从设计出发点,具体思想来分别说明每一个设计思想。

2.1卷积化(Convolutional)——以AlexNet为例

所谓的卷积化就是将网络后面的全连接层替换成卷积层,为什么要这么做?这么做可行吗?

为什么要这么做?

         我们知道全连接层是将所有的feature map展开,但是这一展开所出现的问题就是原来的像素是二维的,是具有位置关系的,一旦展开之后,这些位置信息,像素之间的关信息完全丢失了。在Alexnet中,输入图像的大小是227x227x3,一系列的卷积层和下采样层将图像数据变为尺寸为7x7x512的特征图, AlexNet的处理方式是将其展开,然后后面跟两个尺寸为4096的全连接层,最后一个有1000个神经元的全连接层用于计算分类评分。对于最后的三层,输出分别为4096维的向量、4096维的向量、1000维的向量

现在要换成全卷积,就是将全连接层全部用卷积层代替,怎么做呢?

  • 由于feature map是7*7*512,将后面的第一个全连接层换成7x7x4096的卷积层,这样输出数据体就为[1x1x4096]了。
  • 针对第二个全连接层,将第二个全连接层换成1x1x4096的卷积层,这样输出数据依然为[1x1x4096]。
  • 对最后一个全连接层也做类似的处理,换成1*1*1000的卷积核,最终输出为[1x1x1000]

为什么可以这样做?可行性分析

全连接层和卷积层之间唯一的不同就是卷积层中的神经元只与输入数据中的一个局部区域连接(局部连接),并且在卷积列中的神经元共享参数(参数共享)。但是不管是全连接层还是卷积层,神经元都是计算点积,所以它们的函数形式是一样的。因此,将此两者相互转化是可能的:

对于任一个卷积层,都存在一个能实现和它一样的前向传播函数的全连接层。权重矩阵是一个巨大的矩阵,除了某些特定块,其余部分都是零。而在其中大部分块中,元素都是相等的。相反,任何全连接层都可以被转化为卷积层。就像我们上面的操作替换一样,从结果上来看,FCN将传统CNN中的全连接层转化成卷积层,对应CNN网络FCN把最后三层全连接层转换成为三层卷积层。在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个不同类别的概率。FCN将这3层表示为卷积层,卷积核的大小 (宽,高,通道数) 分别为 (1,1,4096)、(1,1,4096)、(1,1,1000)。看上去数字上并没有什么差别,但是卷积跟全连接是不一样的概念和计算过程,这就是全卷积网络。
 

这样做了有什么好处?

除了上面的好处,即卷积层保留了像素之间的位置信息和关联信息,还有其他的好处。因为全连接层最后得到的是类别的概率,虽然语义分割的本质是对像素进行分类,但是仅仅得到一个分类概率这并不是我需要的最终结果,我所需要的是在一张图片上能够完全展示出来不同的物体的边界分割,就像抠图的效果一样,很明显,这是全连接层最终的概率没有办法达到的,那也就没办法实现端到端的训练以及一步到位得到结果。而使用全卷积层最总得到的输出依然是类似于图像的格式,即(长,宽,通道)形式,正好可以满足在一张图片上将分割边界分割开来的目的,当然具体的实现还需要后面的几个关键步骤。

总结:

既然说了可以将卷积层和全连接层互相转化,实际上如果卷积核的 kernel_size 和输入 feature maps 的 size 一样,那么相当于该卷积核计算了全部 feature maps 的信息,则相当于是一个 kernel_size∗1 的全连接。(仔细体会这句话的含义,对于理解是有帮助的)

2.2 上采样(Upsample)

        其实卷积核池化的过程是一个“下采样”的过程,是的图像的长宽越老越小。所谓的上采样,顾名思义就是一个逆过程,是的图像的长宽变大,在传统的数字图像处理中,也有很多上采样方法,比如双线性插值等方法。这里不讨论。本文所讨论的就是反卷积和反池化操作。

在Alexnet中,前面经过5次卷积+池化后,图像尺寸依次缩小了 2、4、8、16、32倍,也就是得到7*7*512的feature map,上采样就是要根据这个7*7*512的feature map得到原始的输入图像。当然关于上采样也有很多的技术手段,原作者研究了以下几种方法:

  • (1)shift-and-stitch
  • (2)filter rarefaction
  • (3)反卷积(deconvolutional)

关于(1)和(2)这里不做讨论,后面会专门讲解这其中的思想和实现,本文只讨论第(3)种。需要注意的是:

“反卷积”有很多不同的称呼,也称之为转置卷积,Caffe和Kera里叫Deconvolution,而tensorflow里叫conv_transpose。

反卷积和卷积类似,都是相乘相加的运算。只不过后者是多对一,前者是一对多。而反卷积的前向和后向传播,只用颠倒卷积的前后向传播即可。所以无论优化还是后向传播算法都是没有问题。但是从数学意义上来说,反卷积并不是完全意义上的卷积的逆运算,因为它不能恢复到卷积之前的值,是有损失的

反卷积的大致流程如下:


 

关于反卷积的具体运算过程这里就不再讨论了,我前面专门写过关于上采样、反卷积相关的文章,这里大致分析一下它的过程,如下:

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

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

2.3 跳跃结构(Skip Layer)

        前面说了,FCN有两种方式产生密集输出(dense output/dense prediction),直接放大和拼接放大,直接放大即单纯的对最后的输出特征进行反卷积操作,得到的结果是非常粗糙的,丢失了很多细节,只能够开一个大概,那怎么办呢,于是想到一个办法,不就是丢失了很多特征嘛 ,那我把前面卷积层和池化层输出的低层特征添加一些进来,不就可以弥补一些特征了嘛,于是就出现了 skip layer。跳层结构:结合上采样和上层卷积池化后数据(更详细的特征),修复还原的图像

        现在我们有1/32尺寸的heatMap(即前面的7*7的特征图),1/16尺寸的featureMap和1/8尺寸的featureMap,1/32尺寸的heatMap进行upsampling操作之后,因为这样的操作还原的图片仅仅是conv5中的卷积核中的特征,限于精度问题不能够很好地还原图像当中的特征。因此在这里向前迭代,把conv4中的卷积核对上一次upsampling之后的图进行反卷积补充细节(相当于一个插值过程),最后把conv3中的卷积核对刚才upsampling之后的图像进行再次反卷积补充细节,最后就完成了整个图像的还原。
具体来说,就是将不同池化层的结果进行上采样,然后结合这些结果来优化输出,分为FCN-32s,FCN-16s,FCN-8s三种,第一行对应FCN-32s,第二行对应FCN-16s,第三行对应FCN-8s。 具体结构如下:


         在上图中,image是原图像,conv1,conv2..,conv5为卷积操作,pool1,pool2,..pool5为pool操作(pool就是使得图片变为原图的1/2),注意con6-7是最后的卷积层,最右边一列是upsample后的end to end结果。必须说明的是图中nx是指对应的特征图上采样n倍(即变大n倍),并不是指有n个特征图,如32x upsampled 中的32x是图像只变大32倍,不是有32个上采样图像,又如2x conv7是指conv7的特征图变大2倍。

(1)FCN-32s过程

对conv7的特征图进行上采样,使它扩大32倍。

(2)FCN-16s过程

由于conv7的输出维度是等于pool5的,而pool5的输出维度又是pool4输出的二分之一,因此现将conv7上采样扩大2倍,然后和pool4的输出进行融合,最后对融合之后的上采样扩大16倍,得到与原始图像相同的大小。

(3)FCN-8s过程

同上理,由于conv7的输出尺寸是pool3的输出尺寸的四分之一,pool4的输出又是pool3的二分之一,所以先将conv7的输出上采样4倍,然后将pool4的输出上采样2倍,得到和pool3一样的输出大小,最后将三个融合起来,再进行上采样8倍,得到和输入图像一样的大小。

三、FCN的结构以及训练

3.1 训练的四个阶段

上面的图中已经给出了FCN网络的结构,这里就不重复给出了,这里给出FCN的训练过程。FCN的训练过程分为四个阶段,这四个阶段,也体现了作者的设计思路,值得研究。

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

(2)第2阶段。从特征小图(16*16*4096)预测分割小图(16*16*21),之后直接升采样为大图。 
反卷积(橙色)的步长为32,这个网络称为FCN-32s,即直接上采样扩大32倍。 这一阶段使用单GPU训练约需3天。

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

(4)第4阶段。升采样分为三次完成(橙色×3)。 进一步融合了第3个pooling层的预测结果。 第三次反卷积步长为8,记为FCN-8s。 这一阶段使用单GPU训练约需1天。

总结:

由于较浅层的预测结果包含了更多细节信息。比较2,3,4阶段可以看出,跳级结构利用浅层信息辅助逐步升采样,得到更精细的结果。,如下图所示:

3.2 逐像素预测分类

前面说了我们完全可以将全连接层替换成卷积层来实现分类效果,为什么呢?我们常说,语义分割的本质就是逐像素分类,又怎么理解呢?

下面专门解释一下逐像素分类的含义。我们以1000个分类,加以说明:

(1)如果使用全连接层,

对于最后的一个16*16*256的特征图,我们需要将其展开,然后后面跟一个 65536 (即16*16*256=65536)个节点的全连接层,然后再跟一个 1000 个节点的全连接层作为分类的输出;

(2)如果是使用全卷积层
输入16*16*256 的特征图,卷积模板尺寸1*1*1000,输出16*16*1000。 这样做

相当于对每个像素施加一个全连接层,预测1000类结果

如何理解这句话?

在16*16*256 的特征图中,每一个像素有256个通道,而使用的的是1*1*1000的卷积层,即1000个1*1的卷积核,每一个层对应的像素位置都是特征图上对应位置的256个通道得出来的,这样,在同一个像素位置,实现了从256维向1000维的转化,这不就是对某该位置的这个像素进行分类吗?这就是所谓的“逐像素分类”。如下图:

3.3 逐像素分类中的度量指标

     我们从常见的语义分割和场景解析评估中提出四种度量,它们在像素准确率和在联合的区域交叉上是不同的。令n_ij为类别i的被预测为类别j的像素数量,有n_ij个不同的类别,令

为类别i的像素总的数量。我们将计算:

 比如FCN在 32倍上采样过程,16倍上采样过程8倍上采样过程,他们的上述指标为:

四、FCN的优缺点以及拓展

4.1 FCN的优点

与传统用CNN进行图像分割的方法相比,FCN有两大明显的优点:

(1)一是可以接受任意大小的输入图像,而不用要求所有的训练图像和测试图像具有同样的尺寸。

(2)二是更加高效,因为避免了由于使用像素块而带来的重复存储和计算卷积的问题。

(3)端到端的训练,这样做的好处是通过缩减人工预处理和后续处理,尽可能使模型从原始输入到最终输出,给模型更多可以根据数据自动调节的空间,增加模型的整体契合度。

4.2 FCN的缺点

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

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

(3)端到端的缺点。通过大量模型的组合,增加了模型复杂度,降低了模型可解释性。(端到端是一把双刃剑)

4.3 FCN的扩展

       虽然FCN不够完美,但是其全新的思路开辟了一个新的图像分割方向,对这个领域的影响是十分巨大的,从2015年3月在arxiv和6月在CVPR会议上发表到写下这篇博客的时候一年的时间,该文章已被引用高达400次。

在FCN的基础上,UCLA DeepLab的Liang-Chieh Chen[2]等在得到像素分类结果后使用了全连接的条件随机场(fully connected conditional random fields),考虑图像中的空间信息,得到更加精细并且具有空间一致性的结果。

Liang-Chieh的这篇文章有两大特点,一是忽略下采样过程,转而使用稀疏的卷积核以增加感知范围。如下图所示: 

         二是使用了Fully Connected CRF。CRF的能量函数中包括数据项和平滑项两部分,数据项与各个像素属于各类别的概率有关,平滑项控制像素与像素间类别的一致性。传统的CRF的平滑项只考虑相邻像素类别的关联性,而Fully Connected CRF将图像中任意两个像素之间的类别关联性都考虑进来。

下图是CNN与Fully Connected CRF结合的示意图。 

实际上,CRF或者Fully Connected CRF是对CNN或者FCN输出的一种后处理技术。像素分类和空间规整这两步是分别进行的。Shuai Zheng[3]等人将Fully Connected CRF表示成回流神经网络的结构(recurrent neuron network,RNN),将CNN与这个RNN放到一个统一的框架中,可以一步到位地对两者同时进行训练。将图像分割中的三个步骤:特征提取、分类器预测和空间规整全部自动化处理,通过学习获得,得到的结果比FCN-8s和DeepLab的方法的效果好了许多。
         CNN、FCN与Fully Connected CRF的结合及统一的自动训练具有很不错的应用价值,已有很多的研究对这几篇文章进行跟进([2]和[3]的引用都已过百)。例如,帝国理工的Konstantinos Kamnitsas,Daniel Rueckert等人在这几篇文章的基础上,提出了三维的多尺度CNN和全连接CRF结合的方法,称为DeepMedic, 用于脑肿瘤的分割,最近(4月4号)刚发表于arXiv。

猜你喜欢

转载自blog.csdn.net/qq_27825451/article/details/89355174
今日推荐