对于人体姿态估计、语义分割等高分辨率的任务,许多网络设计中采用了encoder-decoder模式。在decoding部分,需要对特征图进行上采样,本文归纳了几种不同的上采样方法。
文章目录
- 双线性插值
- 转置卷积
- Dense Upsampling Convolution (DUC)
- 空洞卷积
双线性插值
插值问题实际上是一种拟合问题。
所谓插值就是用 x’ 某个领域内的函数值按照一定规则拟合出一个函数,再在其中查找 f(x’) 的值。
双线性插值(bilinear upsampling)是其中一种非常简单的拟合方式。
对 srcImage 中某个邻域内进行插值,从而得到 dstImage 中某个像素值。
虽然插值计算速度快,但这种插值的“感受野”是local的,只能看见相邻的四个像素点,在上采样过程中不可避免地产生细节信息损失。且双线性插值没有参数可以学习。
转置卷积
deconvolution / transposed convolution / fractionally strided convolution(反卷积/转置卷积)。
卷积操作可以展开看作一个矩阵乘法,下面介绍一个简单的例子。
输入图片可以从左到右、由上至下展开为一个 的向量,则kernel对应的卷积可以表达为一个稀疏矩阵:
则输出特征图 ,是一个的向量。
以Y为输入,X为输出的逆过程,就是我们所说的转置卷积。,保持了卷积时的连接模式connectivity pattern。
我们总是可以用一个直接的卷积(direct conv)来模拟转置卷积的过程。其缺点是需要在输入图中加上多行/列的零,实现效率低。
对于上述例子,我们可以对2*2输入图片进行zero-padding,再卷积,注意观察下图,仍然保持了连接模式。
对不同的卷积参数,有不同的转换方式。具体情况可以看参考文献 A guide to convolution arithmetic for deep learning
Pytorch中的转置卷积就是根据这种direct conv的方式来定义的。文档
在语义分割任务中,结合Unpooling层,可以更好地恢复空间位置信息。
Dense Upsampling Convolution (DUC)
--> -->
先增加channel,再reshape到需要的上采样大小。方法来自《Understanding Convolution for Semantic Segmentation》。
空洞卷积
Dilated/Atrous Convolution (膨胀卷积/空洞卷积),就是在标准卷积核中注入空洞(0),使感受野增大。
标准卷积 | 空洞卷积 dilation rate=2 |
空洞卷积常在语义分割等需要保持空间信息的高分辨率网络中被用到,取代传统的pooling和strided convolution。保持特征图分辨率,同时获得更大的FOV(field-of-view),以获取全局信息。避免了encoder-decoder架构中信息的损失。
gridding problem:避免在连续的空洞卷积中选择相同的dilation rate,否则会导致感受野不连续,丢失local信息。
参考资料
- 双线性插值:简书
- 空洞卷积:《Understanding Convolution for Semantic Segmentation》
- 转置卷积:
- A guide to convolution arithmetic for deep learning
- 《Learning Deconvolution Network for Semantic Segmentation》