论文笔记:FCN

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hongbin_xu/article/details/83382678

原文:Fully Convolutional Networks for Semantic Segmentation

FCN

1、四个问题

  1. 要解决什么问题?
    • 语义分割。
  2. 用了什么方法解决?
    • 提出了“全卷积神经网络”,可以接收任意尺寸的输入,并给出对应大小的输出。
      • 使用一些图像分类模型(如:AlexNet、VGG、GoogLeNet)等做迁移学习。
      • 使用skip architecture的结构,结合深层的较粗糙的信息和浅层的较精细的信息,得到更精确的结果。
      • 使用反卷积做上采样。
  3. 效果如何?
    • 在PASCAL VOC 2012、NYUD v2、 SIFT Flow等数据集上取得了当时(2015年)领先的效果。并且在PASCAL VOC 2012上取得了62.2%的mean IU,比之前的最优方法提高了20%。
    • 文中的FCN网络对每张图片处理耗时为0.2s。
  4. 还存在什么问题?
    • FCN是深度学习用于语义分割任务的开山之作,现在来说效果不能算很好。

2、论文概述

2.1、几个知识点总结

  1. 语义分割:我的理解是,像素级别的分类,判断每个像素属于哪个类(即语义)。
  2. end-to-end:端到端。很好理解,一个端到端网络的输入是你的原始数据,输出就是你想要的预测结果。中间过程不需要对数据另外做处理。
  3. deconvolution
    1. 有的地方翻译成“反卷积”,有的地方翻译成“转置卷积”(见如何理解深度学习中的deconvolution networks?)。直观上来说,我觉得“反卷积”更合适;不过从数学形式上来说“转置卷积”更贴切。怎么叫的顺口就怎么叫吧。
    2. 特征图进过普通的卷积层后,输出的特征图尺寸通常都会缩小,相当于一个下采样的过程;而反卷积就是与卷积相反的过程,会让输出的尺寸增大,相当于一个上采样的过程。这篇文章中有可视化的例子,有助于理解。
    3. 论文中解释是:卷积(convolution)的forward、backward过程相互对调,就是反卷积(deconvolution)。

2.2、FCN结构

2.2.1、将分类用于dense prediction

  • 作者指出,全连接层可以修正维度并会丢弃空间坐标关系。然而这些全连接层本身也可以看做是覆盖了整个feature map的卷积核组成的卷积层。
  • 使用卷积层替代全连接层。实质上全连接层也可以看做 1 1 1 * 1 的卷积。
    • 以图中的网络为例:
      1. 普通的全连接层:假设最后倒数第二个卷积层的feature map为 7 7 256 7 * 7 * 256 ,我们令最后一个卷积层的卷积核尺寸为 7 7 256 4096 7 * 7 * 256 * 4096 ,得到的结果是 1 1 4096 1 * 1 * 4096 。将结果flatten,展开成1维的向量,随后接全连接操作。
      2. 使用 1 1 1 * 1 卷积替代全连接:与前面一样,倒数第二个卷积层的feature map为 7 7 256 7 * 7 * 256 ,最后一个卷积层的卷积核尺寸为 7 7 256 4096 7 * 7 * 256 * 4096 ,得到的结果是 1 1 4096 1 * 1 * 4096 。下面接上 1 1 1 * 1 卷积,卷积核为 1 1 4096 4096 1 * 1 * 4096 * 4096 ,其实还是等价于全连接。
      3. 1 1 1*1 卷积操作取代全连接,其实就是对将卷积核上同一点的所有channel进行FC操作。
  • 对示例图的解释:
    1. 上面的网络是一个在ImageNet上预训练的CNN网络,输入一个 224 224 224 * 224 的图像,跑完全部的卷积层后输出应该正好是 1 1 4096 1* 1 * 4096 ,随后flatten得到4096维的神经元,之后再接上全连接层,输出1000维的softmax。这里为止都是常规套路。
    2. 将全连接替换成 1 1 1 * 1 卷积。
    3. 上面的网络中处理的图片是下面的图片中的一部分。那么推广到处理下面这副同时有"猫狗"的图像的情况下,可以看作从中取出了 m n m * n 227 227 227 * 227 的patch,分别送到FCN中,每个patch都会有一个1000维的输出。那么这些patch的输出拼在一起就可以构成一个heatmap了。
    4. 就以tabby cat这个例子来看,再对应tabby cat的那个通道,只要patch里面包含了猫,那么输出的概率应该都会比较高,而其他patch则会较低,最后结果应该会像图中所示,有猫的区域在heatmap中的值明显更大吧。)
  • 我个人的看法是,直接将分类网络的全连接层改为 1 1 1 * 1 卷积,从下图中已经可以在一定程度上进行语义分割了(见heatmap),只要再进行微调不难取得相对精确的效果。

在这里插入图片描述

2.2.2、基本结构

在这里插入图片描述

  • 假设使用的预训练网络是VGG-16,整个FCN网络中除了最后deconv的部分都与VGG一样。
  • 以图中的网络为例,FCN网络的conv7输出的heatmap,通过deconv进行上采样32倍得到第一个预测结果FCN-32s。
  • 接着作者使用了skip layers将几个pooling层输出的结果结合起来:
    • 先将pool4的输出接上 1 1 1 * 1 卷积层,然后对conv7的输出使用deconv进行2倍上采样,随后两个输出相加。最后再接上stride为16的deconv层进行16倍上采样。得到第二个预测结果FCN-16s。
    • 同理,将pool3的输出接上 1 1 1 * 1 卷积与pool4以及conv7的输出组合起来,最后可以得到第三个预测结果FCN-8s。

2.2.3、训练细节

  1. 在整个网络上微调,包括预训练模型(如VGG)的全部参数。
  2. 作者实验结果表明,采样多个patch进行训练和直接使用原始图片训练,发现基本上没有太大差别,并且采样patch还更费时。所以,不进行采样,直接使用整幅图片进行训练。
  3. 样本均衡(class balancing),影响不大,不做处理。
  4. 数据增强,给训练数据加入镜像和抖动,性能没有太大提高。

2.2.4、度量指标

在这里插入图片描述

2.3、其他

在这里插入图片描述

  1. 为了给数据引入深度信息,作者最先训练了一个4通道输入(RGB-D)的网络。发现效果并没有好多少,可能是由于模型内具有此类信息的梯度较难传递。后来,尝试了对深度信息进行三位HHA编码,仅仅利用这部分的深度信息进行训练一个网络。另外使用RGB图像数据训练一个网络,最后将这两个网络的结果进行融合,效果有较大的提高。这个方法可能也可以用来处理RGB-D的一些其他任务。
  2. 其他上采样方法:关于FCN 论文中的 Shift-and-stitch 的详尽解释

3、资料

  1. 译文
  2. 关于FCN 论文中的 Shift-and-stitch 的详尽解释
  3. https://zhuanlan.zhihu.com/p/35370022

猜你喜欢

转载自blog.csdn.net/hongbin_xu/article/details/83382678
今日推荐