介绍

  • 通常CNN网络在卷积层之后会接上若干个全连接层,将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量,以AlexNet为代表的经典CNN结构适合图像级的分类和回归任务,因为最后得到整幅图像的的数值描述,比如AlexNet的ImageNet模型输出一个1000维的向量表示输入图像属于每一类的概率(softmax归一化)。
  • 例子:AlexNet网中输入是下图中猫的图片,输出的结果是一个向量,表示输入图像属于每一类的概率,其中“tabby cat”这一统计概率最高。

img

  • 而在本文中建立了一种可以接受任意大小图像,并输出与输入等大小的图像的全卷积神经网络,在文章中作者定义了全卷积神经网络(FCN)的空间结构,解释了FCN在空间密集型预测任务上的应用并且给出了他与之前其他网络之间的联系,之后通过迁移学习的方法进行微调(finetune),以此来完成所需要的分割任务。此外作者还定义了跳跃结构,通过结合来自于深的、粗糙层的语义信息和来自浅、细层的表征信息来产生准确和精细的分割。

相关工作

  • 卷积网络在识别领域前进势头很猛,卷积网不仅在全图式的分类上有所提高,在结构化输出的局部任务上也取得了进步。包括检测目标边框、关键点预测和局部通信的进步。

  • 在以往的分割方法中,主要有两大类缺点:

    1. 基于图像块分割的效率低,往往需要前期或后期处理;
    2. 语义分割面临在语义和位置的内在张力问题:全局信息解决的是什么。局部信息解决的是在哪里
  • 为了解决上面这两个问题,本文主要有三个创新点:

    1. 将分类网络结果重新解释为全卷积神经网络结构,这里面具体包括两点,一个是全连接层转化为卷积层,还有就是通过反卷积进行上采样。
    2. 使用迁移学习的方法进行 finetune ,因为很明显通过第一点可知可以将 VGG 这类有预训练权重的分类网络重新解释为 FCN
    3. 使用跳跃结构使得,使得深的粗的语义信息可以结合浅的细的表征信息,产生准确和精细的分割。
  • 以往的方法主要有以下的缺点:

    1. 限制容量和感受野的小模型;
    2. 分块训练;
    3. 超像素投影的预处理,随机场正则化、滤波或局部分类;
    4. 对于密集输出采用输入移位和输出交错的方法;
    5. 多尺度金字塔处理;
    6. 饱和双曲线正切非线性;
    7. 集成
    • 基于 FCN 的方法没有以上缺点。
    • 传统的基于CNN的分割方法:为了对一个像素分类,使用该像素周围的一个图像块作为CNN的输入用于训练和预测。这种方法有几个缺点:一是存储开销很大。例如对每个像素使用的图像块的大小为15x15,然后不断滑动窗口,每次滑动的窗口给CNN进行判别分类,因此则所需的存储空间根据滑动窗口的次数和大小急剧上升。二是计算效率低下。相邻的像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算也有很大程度上的重复。三是像素块大小的限制了感知区域的大小。通常像素块的大小比整幅图像的大小小很多,只能提取一些局部的特征,从而导致分类的性能受到限制。

全连接网络(fully convolutional networks,FCN)

  • 好了,本文的重点终于要出来了。前面说通常CNN在接收图片输入时,输出是一个向量,代表图像属于哪一类的概率,而在FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。如下图:

img

  • 可以看到在最后得输出层的通道数为21,但这不是最后得分割结果,取21个通道中像素值所属类别概率最大的那个值作为每个位置像素的分类结果,即上图中最右边的图。

Combining what and where(结合“是什么”和“在哪里”)

  • 虽然上述方法取得较好的结果,但是分割结果看起来依旧很粗糙,所以采用跳跃连接结构对分割进行细化,即结合最后预测层和具有更小步长的跨层信息,该方法结合了精细层和粗糙层,让模型能做出遵从全局结构的局部预测。如下图:

img

  • 通过一个16像素步长层预测。我们增加了一个1*1的卷积层在pool4的顶部来产生附加的类别预测。我们将输出和预测融合在conv7(fc7的卷积化)的顶部以步长32计算,通过增加一个2×的上采样层和预测求和(见上图)。我们初始化这个2×上采样到双线性插值,但是允许参数能被学习,最后,步长为16的预测被上采样回图像,我们把这种网结构称为FCN-16s。FCN-16s用来学习端到端,能被最后的参数初始化。这种新的、在pool4上生效的参数是初始化为0的,所以这种网结构是以未变性的预测开始的。这种学习速率是以100倍的下降的。
  • 上面是原文叙述的原话,我没怎么看懂,不过我理解的过程是这样的:第一行的 pool4 画了一个箭头直接指向第二行的 pool4,这不是直接拿过来用,而是在第一行的 pool4 上面增加一个 1x1 的卷积层使其与conv7之后的feature map的通道数相同。之后将 conv7 进行两倍的上采样,这里采用双线性插值的方法(实际上是反卷积),插值的权重是可学习的。然后将第二行的 pool4 与 2x conv7 相加,在进行 16 倍的上采样(反卷积)就可以得到最后的结果。这里 1x1 的卷积初始化为 0,保持其原来的分割结果,注意哦,不是随机初始化,而是初始化为0,然后通过学习更新这个卷积核即 FCN-16s。我理解的,上采样的过程都是使用双线性插值的方法进行初始化的。使用类似的方法可以得到 FCN-8s。
  • 注:上面的conv7表示经过conv7卷积之后的feature map。
  • 实验结果如下:

img

  • 由实验结果可以发现,FCN-8S的效果最好,当上采样的步长降低到8时,效果已经不是很明显了,即收益递减,可以不用融合更多浅层特征了。

实现细节

查看源码的时候,发现首层的pad值为100,为什么要令pad=100呢?

img

  • 100像素输入填充可确保网络输出可与给定数据集中任何输入大小的输入对齐。
  • 至于为什么可以,我们可以看下下面的推导过程。假设是一般的VGG16结构,第一个卷积层只pad 1,并且假设输入图片的高度是h,根据我们的卷积公式:

img

  • 由于在VGG中缩小输出map只在池化层,所以下面我们忽略卷积层,计算公式如下:

img

  • 很明显,feature map的尺寸缩小了32倍,接下来是卷积化的fc6层,如下图:

img

  • 注意fc6层中,pad=0,kernel_size=7,所以计算公式与前面6层稍有不同。
  • 接下来还有两个卷积化的全连接层,fc7以及score_fr,但他们都是1*1的卷积核,对输出的尺寸并不会有影响,所以最终在输入反卷积之前的feature map尺寸就是(h-192)/2^5.
  • 推导到这里pad 100的作用已经很明显了,如果不进行padding操作,对于长或宽不超过192像素的图片是没法处理的,而当我们pad 100像素之后:

img

  • 这样就解决了以上问题,但是毋庸置疑,这会引入很多噪声。同样这样的输出会使得上采样得到的图像与输入图像不等大,所以以计算必要的精确 offset参数 并消除这种填充量。

文章的创新点与不足

创新点

  • 实际上理解好这篇文章,只需要理解好一下三点即可
    1. 将分类网改写为用于分割的像素点分类网。具体的包括两个方面,即将全连接层改写为卷积层,和使用反卷积完成上采样的过程;
    2. 使用跳跃连接的结构,将深的粗糙的信息与浅的精细的信息相结合,产生准确和精细的分割;
    3. 使用微调进行实验。

缺点

  • 在这里我们要注意的是FCN的缺点:
       (1) 分割结果不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。
       (2) 是对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。

参考