Semantic Seg 经典 Fully Convolutional Network 精读与进阶(Shift-and-stitch 到 backwards strided convolution)

文章来源:Long J, Shelhamer E, Darrell T. Fully convolutional networks for semantic segmentation[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2015: 3431-3440.

Fully convolutional network 全卷积神经网络(FCN)作为实现语义分割的经典利器,从15年CVPR提出至今得到了广泛的运用。网络上关于FCN的博文也是数不胜数,然而个人认为这些博文对于FCN的一些细节问题讲解并不详细。所以博主再一次精读了这篇文献,将其中的来龙去脉和同学们分享一下。本文仅是博主小白的拙见,欢迎大家拍砖交流。

Motivation

现有的AlexNet、VGG net 和 GoogLeNet 都能够较好的解决分类问题,其关键因素在于用于最后分类层之前训练出来的网络能够有效的提取图像特征。可以认为这些网络是一个很好的编码器 Decoder,能够很好的获取图像内的语义信息。然而对于分割问题,我们还需要关注图像的 appearance information,在准确的语义信息 semantic information 的基础上,appearance information 使得分割算法能够对物体有定位效果,最终实现目标物体的分割。

传统网络的缺陷:

  1. 最后的全连接层形成了语义信息高度完备的特征向量,然而由于卷积层的深入,appearance information 逐步损失因此难以对物体形成有效定位。
  2. 不能输入任意尺寸的图像,且不能实现 dense prediction 对每个像素0/1分类。

针对上述缺陷,FCN采用

  1. Skip connection 将 浅层的、位置信息精细的 appearance information 传递到 深层的、位置信息粗糙的 semantic information 上,以实现准确的语义信息和精细的位置信息。
  2. 将传统网络的卷积层之后,分类输出层之前的全连接层替换成全卷积层,实现对任意尺寸输入的兼容。利用 deconvolution 操作对 subsampling 的特征向量上采样还原成原始图像大小。因此能够实现 end-to-end 的 dense prediction 逐项素分割。
  3. 另一个隐性的优势,训练完成的 Alexnet、VGG Net 等网络模型参数并不需要修改(Pre-training),在构建FCN时仅仅需要学习后面 Deconvolution 的参数即可。

实现细节:

- 全卷积结构网络的优势
Semantic Seg 经典 Fully Convolutional Network 精读与进阶(Shift-and-stitch 到 backwards strided convolution)_第1张图片
传统网络在分类物体时,采用固定大小的Patch读入图像,通过一系列网络结构之后形成1000维的特征向量。在通过全卷积网络之后,输出尺寸变得很小。输出特征向量中的每个像素也是对应着原始感受野大小,但是每个感受野之间的Stride是不同的(图中的Stride是32)。正是因为卷积操作使得运算变得更加高效,相比于Patchwise的训练过程。然而输出特征向量的尺寸还是因为降采样变得很小。下面这句话是关键中的关键:输出的尺寸相对于输入的尺寸相差一个系数:这个系数等于输出单元感受野的像素步长~~
上图中输出单元感受野大小 = 原始全连接网络的输入大小 256*256,输出单元在输入图像上感受野的Stride = 32。
所以如何将输出特征向量的维度恢复到同等于输入向量,进而实现 end-to-end 的训练则显得尤为重要。

- 实现 Dense prediction 的方式
作者提供了3种方式从 coarse output 获得 dense prediction 的分割输出。

  1. shift-and-stitch.
    设输出和输入尺寸相差 f,则将原始输入图像向右下移动 (x,y) 其中 [0,f),由此得到 f*f 个 coarse output。然后交错每个 coarse output 合并成大的 output,使得输出单元的感受野能够覆盖到每个输入像素。

  2. decreasing subsampling
    上述采用的shift-and-stitch方案,需要反复计算 f*f 个输入,造成计算效率的降低。而 decreasing subsampling 方法提供了另外的一种思路,减小传统网络中降采样操作,从而实现 coarse output 的 dense prediction。
    考虑其中某一层具有stride = s,后面卷积层具有卷积核权重 fij。现在我们设置原本stride = 1避免降采样的出现,形成上采样结果。然而直接对这样的上采样结果进行按照原本卷积核操作并不能得到相等于 shift-and-stitch的结果。因为这样的卷积核仅仅能看到上采样结果的一小部分,所以我们扩大原本的卷积核:
    这里写图片描述
    值得注意的是,这样的操作方式会造成一种 trade-off:卷积核如果需要看到更精细的信息,往往需要较小的感受野且需要更多的操作。这样的一种方式,使得感受野固定成一种较大的 input size,不能完成精细的定位分割信息。

  3. backwards strided convolution (deconvolution) + skip 结构
    通过学习的方式形成 upsampling 往往能够得到更有效的 dense prediction ,尤其是结合上 skip 结构。其中采用的上采样方式即 backwards convolotion (deconvolution),所以基于 deconvolution 的上采样通过 pixelwise loss 学习,能够实现端对段学习。注意的一点是:deconvolution 卷积核不同于前面传统网络的pre-training参数固定,这边进行上采样的卷积核的参数是通过学习得到的不能fixed
    Semantic Seg 经典 Fully Convolutional Network 精读与进阶(Shift-and-stitch 到 backwards strided convolution)_第2张图片
    前面几层的卷积核结果可以直接由传统网路得到,通过skip结构将浅层处的形态位置信息传递到深层的语义信息处,改善直接 upsampling 的 dense prediction 分割结果。其实在原文章中,对于skip结构的描述并不是直接add过去结合在深层结构上,而是采用1*1卷积的方式添加上去。

总结

相信大部分读者在其他博客上也能够看到大概的FCN的网络构架,但是其核心关键,如何从 coarse output 得到 dense prediction 才是整篇文章构建的核心。从 shift-and-stitch 到 decrease subsampling 再到 backwards strided convolution ,文章清晰地展现了为什么要采用 FCN 这样的一种网络构建实现分割任务的 dense prediction 的思路。相信在理解清晰前两种实现 dense prediction 的基础上,各位读者能够对 FCN 网络有更深刻且具有逻辑性的认识。

你可能感兴趣的:(机器学习,深度学习)