语义分割系列(1)FCN的理解

对于这篇论文的学习,我主要带着三个疑问去看:

1、为什么全卷积网络能实现任意图像尺寸的输入?   2、为什么要把全连接改成卷积?  3、如何进行反卷积上采样?

论文地址:https://arxiv.org/pdf/1605.06211.pdf

1、为什么全卷积网络能实现任意图像尺寸的输入?

因为卷积网络的参数之和卷积核的大小和输入输出的channel数有关,和图像的尺寸没关系。

卷积层和全连接层的唯一区别在于卷积层的神经元对输入是局部连接的,并且同一个通道(channel)内不同神经元共享权值(weights).

卷积层和全连接层都是进行了一个点乘操作, 它们的函数形式相同. 因此卷积层可以转化为对应的全连接层, 全连接层也可以转化为对应的卷积层.

举个例子:

VGGNet[1]中, 第一个全连接层的输入是7*7*512, 输出是4096. 这可以用一个卷积核大小7*7, 步长(stride)为1, 没有填补(padding), 输出通道数4096的卷积层等效表示, 其输出为1*1*4096, 和全连接层等价. 后续的全连接层可以用1x1卷积等效替代.

全连接层转化为卷积层的规则是: 将卷积核大小设置为输入的空间大小.这样做的好处在于卷   积层对输入大小没有限制, 因此可以高效地对测试图像做滑动窗式的预测.

2、为什么要把全连接改成卷积?

  1. 参数量太大 假如输入1000*1000像素的图片,即输入层有1000*1000个节点。假设第一个隐藏层有100个节点(这个数量并不多),那么仅这一层就有(1000*1000+1)*100=1亿参数,这实在是太多了!我们看到图像只扩大一点,参数数量就会多很多,因此它的扩展性很差。
  2. 没有利用像素之间的位置信息 对于图像识别,每个像素和其周围的像素的联系都是比较紧密的,和离得远的像素的联系可能就很小。如果一个神经元和上一层所有神经元相连,那么就相当于对于一个像素来说,把图像的所有像素都等同看待,这不符合前面的假设。当我们完成每个连接权重的学习之后,最终可能会发现,有大量的权重,它们的值都是很小的(也就是这些连接其实无关紧要)。努力学习大量并不重要的权重,这样的学习必将是非常低效的。
  3. 网络层数限制 一般而言网络层数越多表达能力越强。但是通过梯度下降的方法训练神全连接神经网络很困难,因为全连接神经网络的梯度很难传递超过3层。因此,我们不可能得到一个很深的全连接神经网络,也就限制了它的能力。

对于卷积神经网络解决以上三个问题,主要有三个思路:

  1. 局部连接 这个是最容易想到的,每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连。这样就减少了很多参数。
  2. 权值共享 一组连接可以共享同一个权重,而不是每个连接有一个不同的权重,这样又减少了很多参数。
  3. 下采样 可以使用Pooling来减少每层的样本数,进一步减少参数数量,同时还可以提升模型的鲁棒性。

3、如何进行反卷积上采样?

具体反卷积低层操作我还没有完全搞明白。但是就网络结构层次而言还是搞懂了。

先给出卷积与反卷积公式:

k:卷积核,s:卷积步长,p:pading,X*X:图像大小

卷积:(X-k+2*p)/s+1

反卷积:(X-1)*s+k

网络修改:

  1. 以Alnext为例,把P5——>F6改为P5——>C6 在一些代码里我看是把卷积核改成7*7 有的是改为6*6(跟数据集有关。PS:个人感觉)
  2. 把F6——>F7改为C6——>C7 看成大小为1*1的卷积层
  3. 同时后面加上一个C8,特征图个数为21(论文里面用的是VOC数据集,该数据集有20个分类+背景像素=21),不同的数据集,最后让其生成的特征图个数理应不同。
  4. 在额外加一个C8,进行反卷积操作,上采样比列为32(下采样(pooling)比例多少,上采样比列就多少)。
  5. 网络中有一个crop层,为了使放大后的图片,大小与原始输入的图片大小完全相同。

以上的修改属于FCN-32s 眼外之一就是一下子将卷积得到的特征图放大32倍。这种效果不好,于是又有了FCN-16s,FCN-8s

FCN-16s:

我们同样以Alnext为例。(先放大两倍,再放大16倍)

  1. 我们现在pool4的结果用1*1的卷积核生成额外的21张score map,
  2. 然后再将其与C8上采样2倍以后的特征图做一个crop操作,
  3. 接着将他们的结果相加(特征图里面的值对应相加)
  4. 上采样16倍,得到扩张32倍的特征图,在与原图做一个crop操作即可

FCN-8s:

我们同样以Alnext为例。(先放大两倍,再放大两倍,最后放大八倍。关于crop操作就不在重复说了,这一个写主要步骤)

  1. 将pool4的结果 用1*1的卷积核生成21张score map
  2. 让它与C8上采样2倍以后的特征图相加,得到一个特征图X
  3. 让X上采样2倍与pool3的结果相加,得到一个特征图Y
  4. 让Y上采样8倍得到所求特征图。再让其与原图做crop操作,得到最后结果。

关于语义分割相关代码及论文可参考:https://github.com/mrgloom/awesome-semantic-segmentation

发布了10 篇原创文章 · 获赞 21 · 访问量 2605

猜你喜欢

转载自blog.csdn.net/mr_qin_hh/article/details/88237966