FCN学习笔记

FCN创新点

FCN全称是 Fully Convolutional Networks for Semantic Segmentation, 用于语义分割的全连接卷积网络。FCN虽然在现在看来存在一些问题,准确度也不够了,但是FCN开创了语义分割的新时代。语义分割后续的发展基本上都是在FCN上提出的理念上进行的。在FCN网络之前的语义分割任务,我没找到好的介绍,但是在论文里有提及到,我大概说一下我的理解,将图片分割为很多个小块 patch,然后将这个小块输入到分类网络中结合传入手工标记的边缘特征,通过前面的卷积得到这个patch的特征图,然后通过全连接层得到这个patch的类别,这样综合起来就能得到大概的语义分割结果。
对比以前的方式,FCN的创新点我个人认为在

  1. 提出了全连接卷积网络的概念,用卷积层替换分类网络或者其它用途网络中存在的全连接层,网络中就只存在卷积层和池化层。这样做的带来的好处之一就是网络不再对输入图片的尺度有限制。
  2. 对卷积得到的特征图通过上采样到和输入图片尺度一样,形成一个端到端的网络。这样就可以在图片的像素级别的特征图,每一个特征图都是对一个类别的预测,而且还保持了图片的空间信息(只能大概保持,因为下采样时会损失细节,上采样也不能完全恢复)。
  3. 提出combining what and where 的概念,卷积网络能够很好的提取图片的特征,越深的网络就越能够提取到图片中抽象的特征,能够学习到图片的不变性(这也是为什么卷积网络能够在分类中大放异彩的原因),但是此时的特征就会丧失物体的空间位置特征,即产生定位不准确的问题。所以论文中提出用浅层的卷积得到的特征预测图片位置信息(好像浅层的卷积网络会对边缘特征比较敏感)和深层的特征拼接,来解决定位不准确的问题。

FCN的关键点

1. 上采样

论文里面关于通过卷积之后特征图的维度变小,要进行上采样说明了一种Shift-and-stitch is filter rarefaction 的上采样方法,大概意思就是通过对特征图不断地在左边和上面添加padding,生成(x, y) ∈ {0, . . . , f − 1} × {0, . . . , f − 1}总共形成 f 2 f^2 f2个输入,经过卷积就能得到维度不下降的特征图,,,,其实没看懂这一块,但是作者最后也没有使用这个方法,具体内容可以看原文。
重点内容是提出的反卷积 deconvolution的方式进行上采样
FCN学习笔记_第1张图片
反卷积的在网上的介绍有很多,反卷积是一种卷积,功能是上采样,只不过这个上采样的参数是可以学习的,通过不断地学习,能够让上采样后具有更多有用的细节,能够更加的逼近原图。举例来说,一个5*5的矩阵A通过一个3*3的卷积核K,stride为1,padding为0得到一个3*3的输出矩阵B。现在我们只知道B、A的维度、卷积核维度、s和padding,要通过对B进行扩充(每个元素之间填充s行0)然后进行步长为1的卷积,通过不断地学习卷积核的值使得卷积的输出更加接近原矩阵。(不能够直接得到原矩阵,不记得在哪里看到的,卷积的过程可以看做原矩阵和卷积变化得到的矩阵的乘积 A*K’=B,因为卷积核变化得到的矩阵不是正定矩阵,列数比行数多,没有逆矩阵所以得不到A)。
这个方法提出后,论文作者说可以得到很好的结果,但是会显著的增加计算量,而且看别的论文里提到很多时候并没有直接的双线性插值的结果好。后面的论文里面也没有使用反卷积进行上采样了。

2. 拼接特征

为了防止卷积层数的加深导致特征图中损失了图片的细节,使得最后的定位不准,FCN设计了一个strip结构,将浅层得到的具有更小的视野,包含更加精细特征的图和后面抱含更加抽象的层相结合。
FCN学习笔记_第2张图片
第4层和第3层输出的反卷积操作(分别需要16倍和8倍的上采样),再把这2个反卷积的结果图像和第5层的输出执行32倍的反卷积拼接求和得到原图,然后再进行一次上采样得到原图大小的特征图(FCN-8s)。

3.网络结构

FCN学习笔记_第3张图片
这一块就是用VGG16作为骨架,然后更改后面的全连接层,然后再用上上面讲的上采样和strip调剂结构。

总结

优点上面已经讲了,总体看来我还是有很多疑惑的地方,首先,不同深度的卷积层特征图直接相加真的能够得到很好效果吗?为什么不再把网络做地更深一点呢?是担心梯度消失问题吗?当然还有后面deeplab中提出的问题,关于多尺度输入问题,上采样精度问题。还有官方实现的代码里为什么要把一个batch的图像变化成一个大小呢?不是可以输入任意尺度的图片吗?最后损失函数是交叉损失函数,是怎么反向传播的(似乎可以简化为卷积神经网络是怎么反向传播的,基础不太好)等等

你可能感兴趣的:(学习,深度学习,cnn,计算机视觉)