前言
在CNN-based 的 模型中,我们可能会用到downsampling 操作来减少模型参数,以及扩大感受野的效果。
下图是一个graph segmentation的例子,就先使用 downsampling来减少每个image的size,再使用upsampling来将size还原回最初大小
1 Upsampling
downsampling 即 池化操作,在机器学习笔记:CNN卷积神经网络_UQI-LIUWJ的博客-CSDN博客里面已经提到过了,这里就不说了,我们这里说一下怎么将image的size 提升上去
1.1 最原始的方法
这种方式显然不是理想的方式,因为它添加的信息仅仅是冗余的信息, 同时使得整个image不连续
1.2 Nearest neighbor
1.3 双线性插值
注意左侧图的阴影小点
1.4 Max unpooling
模型中存储 max pooling 操作中,都是哪些位置的值成为了池化结果。然后在max unpooling的时候在这些位置填充值
1.4.1 DeconvNet
Learning Deconvolution Network for Semantic Segmentation (ICCV 2015)
使用 unpooling来进行上采样
2 up convolution
那么既然池化操作有“逆运算”,那么卷积操作有吗?
答案是有的。
我们同样设置filter,让相应位置的值乘以这个filter,将结果拼接成一个大size 的image
对于重叠的部分,我们可以取mean,取max等各种操作。而比如我们需要4*4的矩阵,在矩阵之外的部分可以去掉。
2.1 举例:1维“逆卷积”
2.2 举例: 2维”上卷积“
计算方式:我们按照之前说的方式,进行计算即可
2.2.1 卷积的等价形式
给定一个特征图a,给定相应的卷积核,逆卷积等价于:
- 对输入的特征图a进行一些变换,得到新的特征图a’
- 比如原来特征图是H*W,卷积核的kernel size是Size,步长是Stride,padding大小为Padding
- 那么新特征图H=H+(Stride-1)*(Height-1)【W同理】
- 原先高度方向上两个相邻的值,中间插上Stride-1个0
- 求新的卷积核配置,得到新的卷积核配置
- 卷积核的kernel size不变,Stride’=1,padding'=Size-Padding-1
- 用新的卷积核在新的特征图上做常规的卷积,得到的结果就是逆卷积的结果
3 FCN
Fully Convolutional Networks for Semantic Segmentation 2015 CVPR
传统CNN会在网络层的最后接上一些全连接层,最终的输出经过softmax后可以获得一些类别概率信息
为了进行端到端的图像分割,FCN把CNN最后的那几层全连接层替换成卷积层。这样输出的是一个二维的feature map。
之后再接softmax,就是每个像素点的分类信息,也即图像分割问题。
upsampling也就是前面说的上池化&上卷积
误差:每一个样本的熵 之和
3.1 FCN的三种结构
上卷积就是一步完成的(放大多少倍和kernel size,stride等参数有关)
以FCN-32S为例,32倍就是一步上卷积
不同的上采样方式效果和精度是不同的
FCN-8s 上采样的时候同时可以考虑不同粒度的feature信息,所以图像分割的结果也更好一点
4 U-net
但是上述的这种down&up sampling问题有一个很明显,就是经过downsampling之后,一些细节方面的信息会丢失
于是U-net便采用了这样的一种思路,把高分辨率的image直接传给之后的神经网络,和经过down&up sampling后相同size的image经过某种方式融合在一起
5 Pyramid Scene Parsing Net
CVPR 2017
这个和upsampling没有关系,只是另一种解决detail 信息丢失的办法。
我们可以设立不同size的池化层,然后将不同size池化层的池化结果 用某种方式concatenate起来
参考文章
ConvTranspose2d原理,深度网络如何进行上采样?_月下花弄影的博客-CSDN博客_convtranspose2d