参考很多,仅为个人学习记录使用
论文:Fully Convolutional Networks for Semantic Segmentation
发表时间:2015
一、论文意义
FCN 网络是 CNN 在语义分割领域一次重大的突破,这篇论文也获得了 CVPR 2015 的 best paper。
论文最大的亮点在于把分类网络最后的全连接层改成了卷积层,如上图所示。并通过反卷积的方法输出一个与输入图像尺寸相同的输出,第一次实现了语义分割领域端到端的逐像素预测,也成功的实现了刷榜。
- 因为去掉了全连接层,所以可以接受任意尺寸的输入;
- 实现了对每一个像素点的分类预测;
- 可以直接利用已有的网络做 fine-tune,网络结构改动不大;
二、网络结构
论文中的最佳模型的网络结构用的是 VGG16 并用卷积层替换全连接层。下图就是 FCN 的网络结构。
截止到 ,网络结构与 VGG 是相同的。因为有 5 个池化层,所以会把输入的尺寸缩小
倍,假设输入尺寸为
,则输出尺寸为
。
在原来的 VGG 网络中, 的输出尺寸是
,其后会连接三个全连接层:
但在 FCN 中, 后面接的是三个卷积层:
此时,得到的是一个有 层,尺寸为
的特征图。可以看出,如果输入图像的尺寸小于 196 的话,网络是没法处理的。因此,FCN 在第一层卷积时加入了一个 100 的 padding,这样就确保了图像可以被处理(不过也引入了大量的噪声)。
对这个输出的特征图,进行反卷积,目的是得到与输入图像尺寸相同的特征图:
反卷积的尺寸计算公式为:
计算得到:
这里有一个细节,就是作者发现反卷积层的参数虽然可以学习,但是即使学了对性能也没什么影响,因此设置反卷积层的参数为固定值(用双线性插值的方式进行了参数初始化)。
由于 的原因,导致输出的特征图的尺寸比输入图片的尺寸大了一些(大了 38),因此需要对输出进行 crop。在输出的特征图的上下左右各 crop 掉宽为 19 的边,得到
的输出特征图。每一个像素上都有
个类别的分数,训练时对每一个像素求交叉熵损失并求和得到总损失,预测时取值最大的类作为该像素的类别。
三、结果优化
只用 的输出来预测的网络叫做 FCN-32s,其最终得到的结果比较粗糙,在边缘上丢失了很多细节,因此作者提出了一种跳跃连接的方式,如上图所示。
将 的输出进行 2 倍的上采样(通过反卷积),此时的输出与
的输出尺寸相同,将两个输出相加,然后进行 16 倍的上采样,得到结果,这种网络结构叫做 FCN-16s。
FCN-16s 的输出进行 2 倍上采样,在加上 的输出,然后进行 8 倍上采样,得到结果,这种网络结构叫做 FCN-8s。
在 FCN-16s 和 FCN-8s 中,上采样之后要注意通过 crop 方法对尺寸进行调整。下面是三种方式预测得到的结果。
FCN 的优点是一是它可以接受任意尺寸的输入图像,这也是训练是使用 SGD 而不是 batch-SGD 的原因,因为输入图像的尺寸不同,无法进行批处理。
FCN 的缺点也很明显,就是它没有考虑过像素之间的关系,缺乏空间一致性。
四、卷积与反卷积
反卷积(Deconvolution)也叫转置卷积(conv_transpose),从计算的角度来看,转置卷积可能更贴切一点。
首先从矩阵计算的角度来看卷积。比如下面这个简单的卷积计算,卷积参数,输入尺寸为 4,输出尺寸为
。
对于上述卷积运算,我们把上图所示的 卷积核在整个矩阵上的计算过程展成一个如下所示的 [4,16] 的稀疏矩阵
, 其中非 0 元素
表示卷积核的第
行和第
列。
再把 的输入特征展成
的矩阵
,那么由
得到一个 [4,1] 的输出特征矩阵,把它重新排列成
的输出特征就得到最终的结果,从上述分析中可以看出卷积层的计算是可以转换成矩阵计算的。
在反向传播时,我们已知更深层返回的损失
根据矩阵微分公式 ,可推得
。
所以,卷积计算中前向传播就是把输入左乘卷积矩阵 ,反向传播就是把梯度左乘卷积矩阵的转置
。
反卷积与卷积恰好相反,前向传播就是把输入左乘卷积矩阵的转置 ,反向传播就是把梯度左乘卷积矩阵
。因此,反卷积又可以称为转置卷积。
再看一下反卷积的卷积过程,下图中蓝色部分是反卷积层的输入,绿色部分是反卷积层的输出,卷积核参数为
在看步长为 2 的情况,即卷积核参数为
如果步长不为 1,就需要根据步长的具体大小在输入的图像中补相应数量的 0,并不是在计算时真的跨相应的距离。