FCN简单理解

整体把握

  1. FCN的论文主要集中于语义分割,当然这种结构现在已经运用在计算机视觉的各种任务中。
  2. FCN创造性的将传统CNN的全连接层都转换成了卷积层。
  3. FCN支持任意尺度的图片输入,改变了传统CNN要求固定输入图片尺寸的要求。
  4. FCN中可将卷积分为两个过程,分别使得图片“缩小”、“变大”。所谓“缩小”指的是经过卷积提取图片的特征,所谓“放大”指的是经过反卷积将“缩小”的特征图还原成与输入图像尺寸相同的特征图。
输入图片
卷积
特征图
反卷积,上采样
与输入图片尺寸相同的特征图
  1. FCN中如果直接将特征图的尺寸通过反卷积转换为与输入图片尺寸相同,结果会非常粗糙。于是作者提出了跳级的思想,这样可以很好的解决这一问题。另外这种思想与之后的FPN、yolo等非常相似。
  2. FCN的运行原理:将一张任意尺寸的图片输入到FCN中,首先经过卷积得到特征图(因为该特征图非常小,故可以称为热图),然后运用反卷积和跳级的方法,还原出与输入图片尺寸相同的特征图,将该特征图与原始图像对比,实现了每个像素的预测,保留了原始输入图像中的空间信息。
  3. 整体的运行流程如下所示:
    FCN简单理解

卷积层替换全连接层的意义

  1. 之所以要进行替换,是为了方便和高效
  2. 对于方便而言。
    1. 传统的CNN要求输入图片的尺寸必须要固定,这是因为传统的CNN全连接层的权值参数是固定的,则输入全连接层的尺寸也必须是固定的。如果输入图片的尺寸不固定,等运行至全连接层就会出错。
    2. FCN中没有全连接层,也就没有某一个要求的固定输入,从而对输入图像的尺寸没有要求。
  3. 对于高效而言。
    1. 传统的CNN要求输入的尺寸必须要固定,在图片中包含多个待检测物体时,一般做法是将图片裁剪成多个图片块输入网络,检测这多个图片块的分类置信度。
      1. 比如现有 384 × 384 384\times384 384×384大小的图片,CNN要求输入图片的尺寸为 244 × 244 244\times244 244×244,这时图片将按照 244 × 244 244\times244 244×244的大小裁剪为多个图片块,之后输入到CNN模型,判断这些图像块的分类置信度。最后整合判断图像包含的物体。
      2. 比如现有图片 244 × 244 244\times244 244×244,虽然符合CNN模型的输入尺寸,但是因为图片中包含有多个待检测物体,所以一般也将图片分成多个图像块,之后利用填充等方法将图像块扩充至 244 × 244 244\times244 244×244。最后整合判断图像包含的物体。
      3. 这种做法,一方面会使CNN因为多个图片块的出现,增大运算负担;另一方面,这些图片块只包含着局部信息,不利于图片的整体分析。
    2. FCN将整张图片输入,经过多次卷积后形成的特征图,也叫热图,能够整体概括图片中出现目标的检测概率。

卷积层替换全连接层的具体方法

一般而言,CNN是由全连接层和卷积层组成的。下面我们以图像分类为例,阐述方法。
FCN简单理解
上图中上半部分是传统的CNN结构,下半部分代表着FCN结构。

  1. 传统的CNN:假如输入的图片经过5层卷积层后,生成的特征图为 256 × 7 × 7 256\times7\times7 256×7×7(通道数、宽、高)。那么,经过三层全连接层后,特征图分别变换为 1 × 1 × 4096 1\times1\times4096 1×1×4096 1 × 1 × 4096 1\times1\times4096 1×1×4096 1 × 1 × 1000 1\times1\times1000 1×1×1000,三个一维的向量。
  2. FCN:假如输入的图片经过5层卷积层后,生成的特征图为 256 × 7 × 7 256\times7\times7 256×7×7(通道数、宽、高)。设置尺寸为[7,7],维度为4096的卷积核,得到特征图为 4096 × 1 × 1 4096\times1\times1 4096×1×1。设置尺寸为[1,1],维度为4096的卷积核,得到特征图为 4096 × 1 × 1 4096\times1\times1 4096×1×1。最后,设置尺寸为[1,1],维度为1000的卷积核,得到特征图为 1000 × 1 × 1 1000\times1\times1 1000×1×1

网络结构中“放大”、“缩小”

仔细观察第一张图,会发现“缩小”的过程中每层卷积层输出的尺寸是上一层尺寸的一半;而在“放大”过程中每层卷积层输出的尺寸是上一层的一倍。个人认为这是作者有意为之,尺寸之间存在着一种隐秘的线性关系。

跳级的思想

前面提到了“放大”、“缩小”的两个卷积过程,可是根据实际操作发现,一步直接将“缩小”后特征图放大效果非常不好,有很多图片的细节没有办法体现。于是作者提出了跳级的思想。
FCN简单理解
所谓跳级,也就是分步将特征图“放大”。可以看到图中有三种“放大”的策略,它们分别是FCN-32s,FCN-16s,FCN-8s。而且FCN中对特征图的放大一共是32倍。
我们以FCN-8s为例讲解跳级思想,首先将 1 × 1 1\times1 1×1特征图上采样2倍,然后与之前特征图尺寸相同的相加,得到新的上采样2倍特征图。
新的上采样2倍的特征图继续上采样2倍,然后与之前特征图尺寸相同的相加,得到新的上采样4倍的特征图。
之后,特征图不再与之前的特征图相加,以2倍的上采样不断进行,直到采样的总倍数为32倍。
所以跳级的精华在于与之前的特征图相融合,可以更好的利用底层位置信息和高层语义信息。
实验证明FCN-8s是效果最好的。
FCN简单理解

损失函数

因为FCN在目标分割的输出是逐像素的预测,所以将每个像素当成一个训练样本,损失函数用softmax表示。