简介
FCN的全称是Fully Convolutional Network,出自2015年Jonathan Long等人的《Fully Convolutional Networks for Semantic Segmentation》,FCN的提出可以说是图像分割领域的一个里程碑,下面从该论文的内容架构记录个人理解。
FCN的提出背景
FCN出现之前,已有许多CNN 网络模型出现,比如AlexNet,VGG net和GoogLeNet等。本文的FCN也是基于CNN网络架构提出的。我们首先对CNN和FCN做一下简单对比。
-
一般的CNN网络通常会在网络最后一个卷积层后面添加若干个全连接层(fully connected layer),这些全连接层可以将卷积层产生的特征图(feature map)映射为一个特征向量,该向量的长度一般取决于分类的类别数量。因此CNN结构适用于图像级别的分类和回归任务,因为它们最后都期望得到输入图像的分类的概率。比如1998年提出的LeNet-5,该网络的最后三层即全连接层。
-
而本文中提出的FCN是对输入图像进行像素级(pixelwise)的分类,从而解决了语义级别的图像分割问题(Semantic Segmentation)。与CNN不同之处在于,FCN将全连接层全部转换为卷积层,因此FCN可以接受任意尺寸的输入图像,同时利用反卷积层(deconvolution layer)对最后一个卷积层的特征图进行上采样,从抽象的特征中恢复出每个像素所属的类别,且得到与输入图像相同尺寸的输出,从而实现逐像素级的预测。
- 从上图中可以看到,在经典CNN中,1-5层为卷积层,6-8三层为全连接层,它们分别对应了大小为4096/4096/1000的一维向量,最终对应着1000个类别的分类概率。而FCN将这3层表示为卷积层,卷积核的大小分别为 1 × 1 × 4096 1\times1\times4096 1×1×4096、 7 × 7 × 4096 7\times7\times4096 7×7×4096、 1 × 1 × 1000 1\times1\times1000 1×1×1000,因此该网络被称为全卷积网络。
核心思想
FCN在CNN的基础上做了以下三方面的改进:
- 将全连接层转换为卷积层,从而可适应任意尺寸的输入;
- 在最后添加反卷积层进行上采样以增大数据尺寸,从而获得更为精细的输出;
关于反卷积,反卷积是上采样的一种方式,上采样有3种常见的方法:双线性插值(bilinear),反卷积(Transposed Convolution)以及反池化(Unpooling)。反卷积也叫转置卷积,它并不是正向卷积的完全逆过程,可以认为它是一种特殊的正向卷积,先按照一定的比例通过补0来扩大输入图像的尺寸,接着旋转卷积核,再进行正向卷积。
详解可以参考:
https://www.zhihu.com/question/48279880
https://www.jianshu.com/p/ff99a7e6c39d - 在不同深度的layer之间添加skip结构,从而增强输出的准确性并确保网络的鲁棒性。原文中给出了添加skip结构的原因,“Semantic segmentation faces an inherent tension between semantics and location: global information resolves what while local information resolves where.”,由于浅层的感受野小,可以看到更为精细的pixels,从而可预测更多的位置信息,通过skip将深层的coarse信息与浅层的finer信息融合在一起,可以兼顾local和global的信息,从而提高输出的准确性。
FCN网络
原文的网络结构
从上图中可以看出:
直观的网络结构
该网络可以适应任意尺寸的彩色图像输入,同时输出与输入的尺寸相同,深度为:20类目标+1背景=21。
卷积部分
虚线上部分为全卷积网络,其中
- 蓝色代表卷积操作
- 绿色代表最大池化操作
- 灰色为裁剪操作,该操作的目的是在融合之前,使用裁剪层统一被融合的两者大小,即裁剪成和输入相同尺寸作为输出
- 黄色为融合操作,这里采用的是逐数据相加(element wise +)
- 橙色为上采样操作,即反卷积层
- 对于不同尺寸的输入图像,各层数据的尺寸相应变化,但其深度(即通道数)保持不变。
skip部分
虚线的下部分为skip连接下的三个预测模板,以第一个预测为例,输入为
16
∗
16
∗
4096
16*16*4096
16∗16∗4096,下一卷积层的卷积核大小为
1
∗
1
∗
21
1*1*21
1∗1∗21,获得输出为
16
∗
16
∗
16*16*
16∗16∗,相当于对每个像素施加一个全连接层,从4096维特征,预测21类结果。
三个预测模块分别给出了三种预测结果:
- FCN-32s
该结果是通过对conv7所得特征图进行卷积核大小为 1 ∗ 1 ∗ 21 1*1*21 1∗1∗21的卷积后,进行上采样以获得精确输出。 - FCN-16s
获取该结果的过程中使用了skip结构,首先对pool4所得特征图进行卷积核大小为 1 ∗ 1 1*1 1∗1的卷积,然后对其进行裁剪得到与conv7预测结果相同尺寸的输出,将该输出与conv7预测结果融合(这里使用的是elementwise +),对该融合结果进行上采样便可得到FCN-16s的预测结果 - FCN-8s
原理同上。
原文给出了这三种预测结果的对比图:
容易看出,随着高层信息逐渐与浅层信息的融合,网络所达到的分割效果是越来越好的。至于为什么不再继续融合更浅层的信息,作者在文中给出解释,“ At this point our fusion improvements have met diminishing returns, both with respect to the IU metric which emphasizes large-scale correctness, and also in terms of the improvement visible e.g. inFigure4,so we do not continue fusing even lower layers. ”,继续融合更浅层信息并不会带来更好的分割效果。同时文中也给出了着三种预测再不同度量标准下的一个对比,从中可以发现,分割效果最好的为FCN-8s。
网络训练
根据作者的设计思路,FCN网络的训练可以分为四个阶段。
第一阶段
以经典的分类网络进行初始化,其中最后两个红色层为全连接层,在训练中将参数弃去不用。
第二阶段
从特征小图
16
∗
16
∗
4096
16*16*4096
16∗16∗4096预测分割小图
16
∗
16
∗
21
16*16*21
16∗16∗21,之后直接上采样为大图。 反卷积的步长为32,这个网络称为FCN-32s。
这一阶段使用单GPU训练约需3天。
第三阶段
升采样分为两次完成。
(1)第一次上采样即FCN-32s中的上采样;
(2)第二次上采样前,把pool4的预测结果与conv7的预测结果融合到一起,之后通过上采样得到大图。这里采用了跳级结构提升输出精确性。
第二次反卷积步长为16,这个网络称为FCN-16s。
这一阶段使用单GPU训练约需1天。
第四阶段
升采样分为三次完成。前两次即上述两次上采样,进一步融合了pool3层的预测结果。 第三次反卷积步长为8,记为FCN-8s。
这一阶段使用单GPU训练约需1天。
较浅层的预测结果包含了更多细节信息,比较2,3,4阶段可以看出,skip结构利用浅层信息辅助逐步上采样,可以获得更精细的结果。