所谓上采样简单的讲就是将一幅图像的分别率提高,比如原始图像是256*256,经过2倍的上采样变为了512*512的图像。最常见的实现方式是插值,比如双线性插值,立方插值等,还有一些卷积方式的上采样操作,比如反卷积,亚像素卷积等。
下面介绍一些相关的上采样操作:
Unpooling
Unpooling是CNN中max pooling的逆操作。这是从2013年纽约大学Matthew D. Zeiler和Rob Fergus发表的《Visualizing and Understanding Convolutional Networks》中引用的:因为max pooling不可逆,因此使用近似的方式来反转得到max pooling操作之前的情况。
它的实现方式是:Unpooling操作需要记住在做max pooling之前的size以及最大值对应的位置,然后将对应位置填上最大值,其余位置置为0即可,便得到上采样后的结果。其实现示意图如下图所示:
反卷积
与Unpooling不同,使用反卷积来对图像进行上采样是可以习得的。通常用来对卷积层的结果进行上采样,使其回到原始图片的分辨率。反卷积也被称为分数步长卷积(convolution with fractional strides)或者转置卷积(transpose convolution)或者后向卷积backwards strided convolution。
PixelShuffle
正常情况下,卷积操作会使feature map的高和宽变小。
但当我们的stride<1时,可以让卷积后的feature map的高和宽变大——即分辨率增大,这个新的操作叫做sub-pixel convolution,具体原理可以看ESPCN这篇论文,pytorch中相应的实现方法名叫做PixelShuffle。
pixelshuffle算法的实现流程如上图,其实现的功能是:将一个H × W的低分辨率输入图像(Low Resolution),通过Sub-pixel操作将其变为rH x rW的高分辨率图像(High Resolution)。
但是其实现过程不是直接通过插值等方式产生这个高分辨率图像,而是通过卷积先得到r**2个通道的特征图(特征图大小和输入低分辨率图像一致),然后通过周期筛选(periodic shuffing)的方法得到这个高分辨率的图像,其中r为上采样因子(upscaling factor),也就是图像的扩大倍数。其输入输出可以表示如下:
输入: (N,C*upscale_factor**2,H,W)
输出: (N,C,H*upscale_factor,W*upscale_factor)
例如:
>>> ps = nn.PixelShuffle(3)
>>> input = torch.tensor(1, 9, 4, 4)
>>> output = ps(input)
>>> print(output.size())
torch.Size([1, 1, 12, 12])