文章目录

  • 1.(反)卷积
  • (反)卷积原理
  • (反)卷积过程
  • 2. 上池化(Unpooling)
  • 3. 上采样(Upsampling)


利用 CNN 做有关图像的任务时,肯定会遇到 需要从低分辨率图像恢复到到高分辨率图像 的问题。解决方法目前无非就是 1)插值2)反卷积

一般 上采样 (upsamping) 就使用了插值法,包括 “最近邻插值”“双线性插值”“双三次插值”。这些方向好比时手工的特征工程,网络是不会对此有任何学习行为的。

如果想要让网络学习如何才能最优地进行上采样,就可以使用 转置卷积,转置卷积没有预先定义好的插值方法,而是具有可学习的参数。

1.(反)卷积

卷积(Convolution)的主要目的就是对事物进行特征提取,然后根据特征对其进行识别或决策。而 反卷积(Deconvolution)也叫做转置卷积(Transposed Convolution),其目的是恢复特征图的分辨率,一般用于图像分割任务中,需要恢复特征图到原图大小的情况。

(反)卷积原理

假设有一张 盲去卷积 python图像 盲解卷积图像复原_人工智能 的输入矩阵(Input),现在要用 盲去卷积 python图像 盲解卷积图像复原_深度学习_02 的卷积核(Kernel)对其进行卷积操作,无 padding,stride 为 1,容易知道输出矩阵(Output)是一个 盲去卷积 python图像 盲解卷积图像复原_卷积_03

卷积输出维度计算公式:
盲去卷积 python图像 盲解卷积图像复原_盲去卷积 python图像_04

其中,input 为输入矩阵的大小,p 为 padding,k 为卷积核大小,s 为卷积步长。根据计算公式可知,卷积后输出大小为 盲去卷积 python图像 盲解卷积图像复原_盲去卷积 python图像_05

盲去卷积 python图像 盲解卷积图像复原_计算机视觉_06


具体的卷积过程是这样的:Kernel 每次覆盖在 Input 上进行元素级相乘再求和,就得到了 盲去卷积 python图像 盲解卷积图像复原_计算机视觉_07

盲去卷积 python图像 盲解卷积图像复原_卷积_08


盲去卷积 python图像 盲解卷积图像复原_卷积_09


可以看出,卷积操作是 “一对多” 的过程,即 多个值对应一个值,从而达到提取特征的作用。

通常卷积操作会使得输入矩阵变小,如果想要保留原尺寸,只需要修改 pad 大小为 盲去卷积 python图像 盲解卷积图像复原_卷积_10

反过来,我们已经得到了 盲去卷积 python图像 盲解卷积图像复原_卷积_03 大小的输出矩阵(Output),现在要将其恢复到原本的 盲去卷积 python图像 盲解卷积图像复原_人工智能

反卷积输出维度计算公式:
盲去卷积 python图像 盲解卷积图像复原_盲去卷积 python图像_13

其中,input 为输入矩阵的大小(此时的 Input 是 盲去卷积 python图像 盲解卷积图像复原_卷积_03 大小的矩阵,即经过卷积得到的矩阵),p 为 padding,k 为卷积核大小,s 为卷积步长。根据计算公式可知,反卷积后输出大小为 盲去卷积 python图像 盲解卷积图像复原_卷积_15

盲去卷积 python图像 盲解卷积图像复原_卷积_16

盲去卷积 python图像 盲解卷积图像复原_盲去卷积 python图像_17

(反)卷积过程

上面卷积核在输入矩阵上不停移动和计算的过程,在实际运算时,其实是将 卷积核重新排列为了 “卷积矩阵”输入矩阵拉成了一列:如下是 盲去卷积 python图像 盲解卷积图像复原_深度学习_02 的卷积核,将它重排列为 盲去卷积 python图像 盲解卷积图像复原_深度学习_19 的矩阵,空余的地方用 0 来填充。这个 盲去卷积 python图像 盲解卷积图像复原_深度学习_19 是根据输入矩阵的大小决定的,4 表示卷积核会在输入矩阵上进行卷积运算 4 次(也就是每一行都表示一次卷积运算),16 为输入矩阵的数据个数。

盲去卷积 python图像 盲解卷积图像复原_深度学习_21


输入矩阵 Input 原本是 盲去卷积 python图像 盲解卷积图像复原_人工智能 大小的矩阵,现在拉平为一个 盲去卷积 python图像 盲解卷积图像复原_深度学习_23 的列向量,然后将卷积矩阵与输入矩阵的列向量进行相乘,得到 盲去卷积 python图像 盲解卷积图像复原_盲去卷积 python图像_24 的列向量,然后 reshape 到 盲去卷积 python图像 盲解卷积图像复原_卷积_03,就得到了卷积结果。

盲去卷积 python图像 盲解卷积图像复原_人工智能_26

反卷积就是卷积的逆操作,想要根据得到的 盲去卷积 python图像 盲解卷积图像复原_卷积_03 大小的输出矩阵恢复到 盲去卷积 python图像 盲解卷积图像复原_人工智能 大小的输入矩阵,只需要将 shape 为 盲去卷积 python图像 盲解卷积图像复原_深度学习_19卷积矩阵 C 转置一下,得到 shape 为 盲去卷积 python图像 盲解卷积图像复原_盲去卷积 python图像_30转置卷积矩阵 C.T,然后用这个转置卷积矩阵与拉成列向量的 盲去卷积 python图像 盲解卷积图像复原_卷积_03 输出矩阵进行矩阵相乘,就可以得到一个 盲去卷积 python图像 盲解卷积图像复原_深度学习_23 的列向量,同样将它 reshape 到 盲去卷积 python图像 盲解卷积图像复原_人工智能 就 OK 啦。

盲去卷积 python图像 盲解卷积图像复原_卷积_34


需要注意的是,反卷积并不能还原出卷积之前的特征图,只能还原出卷积之前特征图的尺寸

反卷积(Transposed Convolution)在搭建网络时主要有两个作用:

  1. 像素级分割,需要将图像尺寸恢复到原本的大小;
  2. 可视化特征,通过反卷积将网络中间层输出的 feature map 还原到像素空间,观察 feature map 对哪些 pattern 响应最大,即卷积结果受到哪部分的影响最大。

2. 上池化(Unpooling)

池化(Pooling)操作通常用于将输入特征图缩小一半,达到筛选重要特征的作用。

上池化(Unpooling) 是在 CNN 中常用的来表示 max pooling 的逆操作。这是论文《Visualizing and Understanding Convolutional Networks》中产生的思想,下图示意:

盲去卷积 python图像 盲解卷积图像复原_卷积_35


反卷积和上池化效果对比:

盲去卷积 python图像 盲解卷积图像复原_深度学习_36

  • b,d,f,h,j 为反卷积结果
  • c,e,g,i 为上池化结果

3. 上采样(Upsampling)

在 FCN、U-net 等网络结构中,涉及到了上采样。上采样概念:上采样指的是任何可以让图像变成更高分辨率的技术。最简单的方式是 重采样插值:将输入图片进行 rescale 到一个想要的尺寸,并计算每个点的像素值,使用如双线性插值等插值方法对其余点进行插值来完成上采样过程。

盲去卷积 python图像 盲解卷积图像复原_深度学习_37


对比上采样和上池化的示意图,可以发现区别:

  • 上采样(UnSampling)没有使用 MaxPooling 时的位置信息,而是直接通过内容的复制来扩充 Feature Map。
  • 上池化(UnPooling)过程在 Maxpooling 时保留了最大值的位置信息,之后在上池化时使用该位置信息扩充 Feature Map,除最大值位置以外,其余位置补 0。