语义分割(1) - FCN 学习小记

参考很多,仅为个人学习记录使用

论文:Fully Convolutional Networks for Semantic Segmentation

发表时间:2015

一、论文意义

FCN 网络是 CNN 在语义分割领域一次重大的突破,这篇论文也获得了 CVPR 2015 的 best paper。

论文最大的亮点在于把分类网络最后的全连接层改成了卷积层,如上图所示。并通过反卷积的方法输出一个与输入图像尺寸相同的输出,第一次实现了语义分割领域端到端的逐像素预测,也成功的实现了刷榜。

  • 因为去掉了全连接层,所以可以接受任意尺寸的输入;
  • 实现了对每一个像素点的分类预测;
  • 可以直接利用已有的网络做 fine-tune,网络结构改动不大;

二、网络结构

论文中的最佳模型的网络结构用的是 VGG16 并用卷积层替换全连接层。下图就是 FCN 的网络结构。

截止到 pool5,网络结构与 VGG 是相同的。因为有 5 个池化层,所以会把输入的尺寸缩小 2^5=32 倍,假设输入尺寸为 (h ,w),则输出尺寸为 (\frac{h}{32} , \frac{w}{32})

在原来的 VGG 网络中,pool5 的输出尺寸是 (fliters , \frac{h}{32} , \frac{w}{32}),其后会连接三个全连接层:

Linear1(fliters \times \frac{h}{32} \times \frac{w}{32},4096) \rightarrow Linear2(4096,4096) \rightarrow Linear3(4096,classnum)

但在 FCN 中,pool5 后面接的是三个卷积层:

conv6(in=fliters \times \frac{h}{32} \times \frac{w}{32}, out=4096,kernel=7,stride=1)

\rightarrow conv7(in=4096, out=4096,kernel=1,stride=1)

\rightarrow conv8(in=4096, out=classnum,kernel=1,stride=1)

此时,得到的是一个有 classnum 层,尺寸为((\frac{h}{32}-7)+1,(\frac{w}{32}-7)+1) 的特征图。可以看出,如果输入图像的尺寸小于 196 的话,网络是没法处理的。因此,FCN 在第一层卷积时加入了一个 100 的 padding,这样就确保了图像可以被处理(不过也引入了大量的噪声)。

n_{in} = n

n1 = ((n_{in} - 3 + 2 \times 100) / 1 + 1) / 2 = (n + 198) / 2

n2 = n1 / 2 = (n + 198) / 4

n3 = n2 / 2 = (n + 198) / 8

n4 = n3 / 2 = (n + 198) / 16

n5 = n4 / 2 = (n + 198) / 32

n6 = (n5 - 7)/1 + 1 = (n + 6) / 32

对这个输出的特征图,进行反卷积,目的是得到与输入图像尺寸相同的特征图:

nn.ConvTranspose2d(classnum, classnum, 64, stride=32)

反卷积的尺寸计算公式为:output = (input -1) \times stride - 2 \times padding + kernal

计算得到:n_{out} = ((n + 6) / 32 - 1) \times 32 + 64 = n + 38

这里有一个细节,就是作者发现反卷积层的参数虽然可以学习,但是即使学了对性能也没什么影响,因此设置反卷积层的参数为固定值(用双线性插值的方式进行了参数初始化)。

由于 padding 的原因,导致输出的特征图的尺寸比输入图片的尺寸大了一些(大了 38),因此需要对输出进行 crop。在输出的特征图的上下左右各 crop 掉宽为 19 的边,得到 (classnum , h , w) 的输出特征图。每一个像素上都有 classnum 个类别的分数,训练时对每一个像素求交叉熵损失并求和得到总损失,预测时取值最大的类作为该像素的类别。

三、结果优化

只用 pool5 的输出来预测的网络叫做 FCN-32s,其最终得到的结果比较粗糙,在边缘上丢失了很多细节,因此作者提出了一种跳跃连接的方式,如上图所示。

conv7 的输出进行 2 倍的上采样(通过反卷积),此时的输出与 pool4 的输出尺寸相同,将两个输出相加,然后进行 16 倍的上采样,得到结果,这种网络结构叫做 FCN-16s。

FCN-16s 的输出进行 2 倍上采样,在加上 pool3 的输出,然后进行 8 倍上采样,得到结果,这种网络结构叫做 FCN-8s。

在 FCN-16s 和 FCN-8s 中,上采样之后要注意通过 crop 方法对尺寸进行调整。下面是三种方式预测得到的结果。

FCN 的优点是一是它可以接受任意尺寸的输入图像,这也是训练是使用 SGD 而不是 batch-SGD 的原因,因为输入图像的尺寸不同,无法进行批处理。

FCN 的缺点也很明显,就是它没有考虑过像素之间的关系,缺乏空间一致性。

四、卷积与反卷积

反卷积(Deconvolution)也叫转置卷积(conv_transpose),从计算的角度来看,转置卷积可能更贴切一点。

首先从矩阵计算的角度来看卷积。比如下面这个简单的卷积计算,卷积参数(kernal=3, stride=1, padding=0),输入尺寸为 4,输出尺寸为 (4 - 3)/1 + 1 = 2

对于上述卷积运算,我们把上图所示的 3\times3 卷积核在整个矩阵上的计算过程展成一个如下所示的 [4,16] 的稀疏矩阵 A, 其中非 0 元素 w_{i,j}  表示卷积核的第 i 行和第 j 列。

再把 4 \times4 的输入特征展成 16 \times 1 的矩阵 X,那么由 Y=AX 得到一个 [4,1] 的输出特征矩阵,把它重新排列成 2 \times 2 的输出特征就得到最终的结果,从上述分析中可以看出卷积层的计算是可以转换成矩阵计算的。

在反向传播时,我们已知更深层返回的损失 \frac{\partial Loss}{\partial Y} 

根据矩阵微分公式\frac{\partial AX+b}{\partial X} = A^T ,可推得 \frac{\partial Loss}{\partial X} = \frac{\partial Loss}{\partial Y} \frac{\partial Y}{\partial X} = A^T\frac{\partial Loss}{\partial Y} 。

所以,卷积计算中前向传播就是把输入左乘卷积矩阵 A,反向传播就是把梯度左乘卷积矩阵的转置 A^T

反卷积与卷积恰好相反,前向传播就是把输入左乘卷积矩阵的转置 A^T,反向传播就是把梯度左乘卷积矩阵 A。因此,反卷积又可以称为转置卷积。

再看一下反卷积的卷积过程,下图中蓝色部分是反卷积层的输入,绿色部分是反卷积层的输出,卷积核参数为(kernal=3, stride=1, padding=0)

在看步长为 2 的情况,即卷积核参数为 (kernal=3, stride=2, padding=0)\:

如果步长不为 1,就需要根据步长的具体大小在输入的图像中补相应数量的 0,并不是在计算时真的跨相应的距离。

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值