FCN模型结构+CNN的区别+三大技术+网络结构

FCN

FCN论文下载地址:
link.

原作者的代码:

link

备注:此文的FCN特指《Fully Convolutional Networks for Semantic Segmentation》论文中提出的结构,并非是广义的全卷机网络。

一、介绍

1.1 FCN

关于图像分割算法,传统方法有很多(图像分割的历史),而全卷机神经网络(FCN,Fully Convolutional Network)是第一次将端到端的卷积网络推广到了语义分割任务当中,随后出现的U-Net也是基于FCN的网络结构。

1.2 网络结构

FCN模型结构+CNN的区别+三大技术+网络结构
FCN模型结构+CNN的区别+三大技术+网络结构
FCN模型结构+CNN的区别+三大技术+网络结构
FCN模型结构+CNN的区别+三大技术+网络结构
橙色是反卷积,偏黄色是直接相加。是的,就是简单的相加。反卷积可以理解一下,不算难。

1.3 CNN和FCN的区别

关于两者的区别可以参考link

我们知道,通常CNNlink在卷积层之后会接上若干全连接层,将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量。以AlexNet为代表的经典CNN结构适合于图像级的分类和回归任务,因为他们最后都期望得到整个输入图像的一个数值描述(概率),比如AlexNet的ImageNet模型输出一个1000维度的向量表示输入图像属于每一类的概率(“全连接层+softmax归一化”的结构)。

下图中的猫,输入AlexNet网络中,经过后面的全连接层后得到一个长为1000的输出向量,再加上softmax归一化后即可以表示输入图像属于每一类的概率,其中在“tabby cat”这类统计概率最高。
输入图片,让神经网络给出这个图片是任何物体的概率,最高的就是神经网络给出的答案。但是FCN必须要给出图上这个猫在哪里,所以最后没有用全连接层。
FCN模型结构+CNN的区别+三大技术+网络结构
概率信息其实就是一个一维张量。也就是说只能表示整个图片的类比,但是你要是问我猫在哪里。那涉及的知识就是语义级别的图像分割(semantic segmentation)问题。
语义分割这个名字起得真的脑残,为啥不叫,我能找出猫在图片中的所有像素

CNN可以解决这个图片是什么的问题,而FCN可以对图像每个像素都是什么进行分类,从而解决语义分割的问题。这样肯定不能像CNN一样使用全连接把数据压缩成一维,肯定需要二维,那么如何满足二维这个条件呢?

FCN想到的方法就是把最后这个已经快压缩到特别小的维度特别高的信息进行放大。采用的方法是上采样。也就是前面橙色的地方。

FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类(最后逐个像素计算softmax分类的损失, 相当于每一个像素对应一个训练样本).如下图所示。
FCN模型结构+CNN的区别+三大技术+网络结构
(PACSAL数据集有20个类别+background=21)

简单的来说,FCN与CNN的区别就是把CNN最后的全连接层换成了卷积层,输入一张原始图,输出的是一张已经label好的图片,做到了端对端。

其实CNN的强大之处在于它的多层结构能自动学习的特征。link并且可以学习到多层次的特征。

  • 较浅层的卷积层感知域(感受野)比较小,学习到一些局部区域的特征;
  • 较深层的卷积层有较大的感知域(感受野),能够学习到更加抽象的一些特征。

这些抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高。下图CNN网络分类的示意图。
FCN模型结构+CNN的区别+三大技术+网络结构
这些抽象的特征对分类很有帮助,可以很好的判断出一幅图像包含什么类别的物体,但是因为丢失了一些物体的细节,不能很好地给出物体的具体轮廓、指出每个像素具体属于哪个物体,因此做到精确分割就很有难度。

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

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

而全卷积网络(FCN)则是从抽象的特征中恢复出每个像素所属的类别。即FCN从图像级别的分类进一步延伸到像素级别的分类。

CNN做图像分类、目标检测的效果已经被证明并广泛的应用,而很多成功的图像分割技术都是基于FCN实现。

三大技术

全卷积神经网络主要使用了三种技术:

卷积化(Convolutionalization)

分类使用的网络通常会在最后连接几层全连接层,它会将原来二维的矩阵(图片)压扁成一维的,从而丢失了空间信息。

卷积化既是将普通的分类网络,比如VGG16,ResNet50/101等网络丢弃全连接层,换上对应的卷积层即可。

图像语义分割的输出需要的是个分割图,且不论尺寸大小,但是至少是二维的。所以,我们需要丢弃全连接层,换上全卷积层如下图所示。
FCN模型结构+CNN的区别+三大技术+网络结构
因此这种全卷积形式的网络可以适应任意尺寸的输入(没有全连接层,全连接的结构是固定的)

2.2 反卷积

FCN作者在论文中讨论了三种上采样(upsample)方法,最后选用的是反卷积的方法(FCN作者称其为后卷积)使得图像实现end to end,可以理解上采样就是使得原来比原始图像小的多的特征图变大,使其大小为原图像的大小。

实际上,上采样(upsampling)一般包括两种方式:

  1. Resize,如双线性差值直接缩放,类似于图像缩放(这种方式在原文中提到)
  2. 反卷积

所以反卷积(Deconvolution)是上采样(upsample)的一种.

反卷积(Deconvolution)也叫转置卷积(Transposed Convolution),当然关于这个名字不同框架不同,Caffe和keras叫做Deconvolution,而tensorflow里面叫做conv_transpose。CS231N这门课中说,叫做conv_transpose。
FCN模型结构+CNN的区别+三大技术+网络结构
如上图所示,a是输入图像,经过卷积和池化得到的特征图分辨率明显下降,而经过反卷积(上采样的一种)提升分辨率的同时,还保证了特征所在的区域权重,最后将图片的分辨率提升原图一致后,权重高的区域则为目标区域所在区域。

传统的网络是下采样(subsampling),对应的输出尺寸就会降低;上采样(upsampling的意义在于将小尺寸的高维度特征图(feature map)恢复回去,以便做像素级的预测(pixelwise prediction),获得每个点的分类信息。

FCN模型结构+CNN的区别+三大技术+网络结构
上采样在FCN网络中的作用如上图所示,明显可以看到经过上采样后恢复了较大的pixelwise的feature map(其中最后一个层21-dim是因为PACSAL数据集有20个类别+Background)。这其实相当于一个编码解码(Encode-Decode)的过程。

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

FCN模型结构+CNN的区别+三大技术+网络结构
相应的卷积公式为:
FCN模型结构+CNN的区别+三大技术+网络结构
而对于反卷积,相当于把普通卷积反过来,输入蓝色2x2矩阵,卷积核大小还是3x3。当设置反卷积参数pad=0,stride=1时输出绿色4x4矩阵,如图,这相当于完全将图4倒过来

FCN模型结构+CNN的区别+三大技术+网络结构
而对于反卷积公式就是将输入和输出反过来:

FCN模型结构+CNN的区别+三大技术+网络结构

反卷积的卷积运算的也是通过BP算法学习出来的,反卷积的前向传播和后向传播,其实就是卷积运算的前后向传播的反向。

2.3 跳跃结构(跳跃层、Skip Layer)

但是,模型前期通过卷积、池化、非线性**函数等作用输出了特征权重图像,由于最后一层的特征图(也叫热图, heatmap, 指卷积池化的最后特征图)太小,我们会损失很多细节。因此我们需要找到一种方式填补丢失的细节数据然后再反卷积,所以就有了跳跃结构(Skip Layer), 这是特征融合的一种方式, 后面的模型会有其它的方式.

未加入skip layer的模型是特别粗糙的,因为热图直接扩大了 32 倍,所以论文中有一个改进,就是利用跳跃结构将网络中间的输入联合起来,即逐点相加,再进行反卷积,这样能够依赖更多的信息,所以可以得到更好的结果,如下图所示:
FCN模型结构+CNN的区别+三大技术+网络结构
fcn-32s 就是直接将最后的结果通过转置卷积扩大 32 倍进行输出,而 fcn-16s 就是联合前面一次的结果进行 16 倍的输出,fcn-8s就是联合前面两次的结果进行 8 倍的输出,我们用上图中 fcn-8s 举例,就是先将最后的结果通过转置卷积扩大 2 倍,然后和 pool4 的结果相加,然后在通过转置卷积扩大 2 倍,然后和 pool3 的结果相加,最后通过转置卷积扩大 8 倍得到和输入形状一样大的结果。

作者在原文种给出3种网络结果对比,明显可以看出效果:FCN-32s < FCN-16s < FCN-8s,**即使用多层feature融合有利于提高分割准确性,**效果如下:

FCN模型结构+CNN的区别+三大技术+网络结构
因而作者提出增加Skips结构将最后一层的预测(有更富的全局信息)和更浅层(有更多的局部细节)的预测结合起来,这样可以在遵守全局预测的同时进行局部预测。

三、FCN的缺点:

  1. 分割的结果不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。
  2. 因为模型是基于CNN改进而来的,即便使用卷积替换全连接,但是依旧是独立像素进行分类,没有充分的考虑像素与像素之间的关系,忽略了在通常的基于图像分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。

每个模型都有自己的不足,所以才会出现各式各样的模型来解决它们的问题。大家如果能分析出每一个模型的缺点,那我们也能构建模型去完善他们的模型,这就是创新的过程。

四、拓展

拓展1:热图

此外,我再将一个概念叫做热图(heatmap)
FCN模型结构+CNN的区别+三大技术+网络结构
经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到 H/32∗W/32 的时候图片是最小的一层时,所产生特征图(feature map)叫做热图(heatmap),热图就是我们最重要的高维特征图。

得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行up
sampling,把图像进行放大、放大、放大,到原图像的大小。

FCN模型结构+CNN的区别+三大技术+网络结构

经过卷积池化最后输出的21张heatmap(由于PACSAL数据集有20个类别+background=21)再经过upsampling变为原图大小的图片,为了对每个像素进行分类预测,这里有一个小trick,就是最后通过逐个像素地求其在21张图像中该像素位置的最大数值描述(概率)作为该像素的分类, 因此产生了一张已经分类好的图片。

拓展2 : FCN + CRF

文章《【总结】图像语义分割之FCN和CRF》link 认为,发展到现在,基于深度学习的图像语义分割“通用框架已经确定”:前端 FCN(包含基于此的改进 SegNet、DeconvNet、DeepLab)+ 后端 CRF/MRF (条件随机场/马尔科夫随机场)优化

FCN模型结构+CNN的区别+三大技术+网络结构