1. FCN介绍
1.1 简介
全卷积网络(Fully Convolutional Networks,FCN)是首个端对端的针对像素级预测的 全卷积网络。
FCN将传统CNN后面的全连接层换成了卷积层,这样**网络的输出将是热力图(也就是特征图)**而非类别,这样对图片的尺寸不再加以限制。
同时,为解决卷积和池化导致图像尺寸的变小,使用上采样方式对图像尺寸进行恢复。
1.2 核心思想
- 不含全连接层的全卷积网络,可适应任意尺寸输入
- 反卷积层增大图像尺寸,也就是上采样,得到一个与原图同样大小的结果。
- 结合不同深度层结果的跳级结构,确保鲁棒性和精确性
2. 尾部卷积化 Convalutionalization
本章节介绍如何将全连接层替换为卷积层。
这里使用VGG中的D类网络作为传统CNN例子,之后会利用到第三个和第四个最大池化层的特征图。
第一个全连接层的运行过程如图所示,先进行展开,然后进行全连接操作,将25088个元素映射成4096个元素。
这个过程中需要使用 25088x4096=102760448个权重参数(忽略偏移)
若不使用全连接层,而是使用卷积层。这里使用4096个7x7x512的卷积核,在步长=1,padding=0(padding可调)的情况下进行卷积操作,最终得到一个1x1x4096的结果。虽然与使用全连接层的结果是一样,都是4096个且值相同,但使用卷积层会保留高宽信息。
这个过程中,一个卷积核需要使用7x7x512=25088个参数,所有一共需要25088x4096个参数,这与使用全连接层的参数个数相同。
而且在全连接层中计算一个节点所需的权重个数=卷积层中一个卷积核的参数个数,因此可以将全连接层中各个节点的所需权重参数分别重构成对应的卷积核,所以这里会有4096个卷积核=4096个全连接层节点。
3.FCN模型类别
FCN常用的类别有FCN-32s、FCN-16s、FCN-8s,其中它们的上采样倍率是不同,分别为32、16、8。
下图是三类的结构。
3.1 FCN-32s
FCN-32s的网络结构如图所示,将对各个部分进行介绍:
3.1.1 VGG16 Backbone
如图所示,由VGG网络的前面部分构成了Backbone。会将输入图像从
h
×
w
×
3
h \times w \times 3
h×w×3变为
h
32
×
w
32
×
512
\frac{h}{32}\times\frac{w}{32}\times512
32h×32w×512
3.1.2 中间的卷积部分
包含三个卷积层,其中:
- FC6:卷积核=7x7x512;有4096个卷积核;padding=3,;步长=1
会得到一个 h 32 × w 32 × 4096 \frac{h}{32}\times\frac{w}{32}\times4096 32h×32w×4096的结果(输出矩阵的大小不变的原因:计算得到) - FC7:卷积核=1x1x4096;有4096个卷积核;padding=0;步长=1
会得到一个 h 32 × w 32 × 4096 \frac{h}{32}\times\frac{w}{32}\times4096 32h×32w×4096的结果,高宽未变 - 卷积核=1x1x4096;有**num_cls(分类的类别个数,包含背景)**个卷积核;步长=1;
会得到一个 h 32 × w 32 × \frac{h}{32}\times\frac{w}{32}\times 32h×32w×num_cls的结果,深度改变了
3.1.3 最后的转置卷积
最后进行转置卷积,进行32倍的上采样来恢复原图的高宽,深度为类别个数。
这里使用了双线性插值的方法来初始化转置卷积的参数。
而在论文中,作者冻结了转置卷积的参数,因此实际上就是一个简单的双线性插值,可以直接使用双线性插值。原因是两种方法的性能差不多,但可以加速训练过程。
3.1.4 总结
最终每个像素都有num_cls个数值,对它们进行softmax操作就可以知道该像素最有可能属于哪个类别。
在FCN-32S中,VGG16、FC6与FC7使用的权重就是VGG中的权重。
3.2 FCN-16S
FCN-16S与FCN-32S存在相同的地方,如Backbone/FC6/FC,也存在不同的地方。
3.2.1 两倍的上采样
前面执行完卷积操作后,执行转置卷积来进行两倍的上采样。
这里使用了双线性插值的方法来初始化转置卷积的参数。
会得到
h
16
×
w
16
×
\frac{h}{16}\times\frac{w}{16}\times
16h×16w×num_cls的结果,深度不变,
3.2.2 使用VGG的MaxPool4的输出
在VGG中,MaxPool4的下采样率是16,因此会得到
h
16
×
w
16
×
512
\frac{h}{16}\times\frac{w}{16}\times512
16h×16w×512的特征图。
在FCN-16S中,使用MaxPool4的特征图进行卷积操作:卷积核大小=1x1x512;有num_cls个卷积核;步长=1。
最后得到
h
16
×
w
16
×
\frac{h}{16}\times\frac{w}{16}\times
16h×16w×num_cls的特征图,这与前面进行转置卷积的大小是一样的。
3.2.3 相加最后16倍上采样
将前面得到的两个
h
16
×
w
16
×
\frac{h}{16}\times\frac{w}{16}\times
16h×16w×num_cls的特征图进行相加,然后通过转置卷积进行16倍的上采样,还原到原图的大小。
3.2.4 总结
FCN-16S使用了VGG中MaxPool4的特征图进行运算。
3.3 FCN-8S
FCN-8S与FCN-16S存在相同的地方,如Backbone/FC6/FC等,也存在不同的地方。
3.3.1 两倍上采样
将前面两个
h
16
×
w
16
×
\frac{h}{16}\times\frac{w}{16}\times
16h×16w×num_cls的特征图求和所得的结果执行转置卷积,进行2倍的上采样。
最后得到
h
8
×
w
8
×
\frac{h}{8}\times\frac{w}{8}\times
8h×8w×num_cls的特征图
3.3.2 使用VGG中MaxPool3
使用VGG中MaxPool3的特征图,会得到
h
8
×
w
8
×
256
\frac{h}{8}\times\frac{w}{8}\times256
8h×8w×256的特征图。
在FCN-8S中,使用MaxPool3的特征图进行卷积操作:卷积核大小=1x1x256;有num_cls个卷积核;步长=1。
最后得到
h
8
×
w
8
×
\frac{h}{8}\times\frac{w}{8}\times
8h×8w×num_cls的特征图,这与前面的上采样结果的大小相同。
3.3.3 前面相加最后8倍上采样
将前面得到的两个
h
8
×
w
8
×
\frac{h}{8}\times\frac{w}{8}\times
8h×8w×num_cls的特征图进行相加,然后通过转置卷积进行8倍的上采样,还原到原图的大小。
3.3.4
同时融合了VGG中的MaxPool3与MaxPool4这些底层信息。
4 损失计算
对每个像素进行softmax计算,然后利用真实标签计算交叉熵损失Cross Entropy Loss。
交叉熵损失: