0、前言
- 上采样:可以简单的理解为任何可以让你的图像变成更高分辨率的技术。
- 最简单的方式是重采样和插值:将输入图片input image进行rescale到一个想要的尺寸,而且计算每个点的像素点,使用如双线性插值bilinear等插值方法对其余点进行插值。
- Deconvolution(反卷积)在CNN中常用于表示一种反向卷积 ,但它并不是一个完全符合数学规定的反卷积操作。
- 反卷积也被称为分数步长卷积(convolution with fractional strides)或者转置卷积(transpose convolution)或者后向卷积backwards strided convolution。
1、Vision Layer
在PyTorch中,上采样的层被封装在torch.nn中的Vision Layers里面,一共有4种:
① PixelShuffle
② Upsample
③ UpsamplingNearest2d
④ UpsamplingBilinear2d
1.1 PixelShuffle
正常情况下,卷积操作会使feature map的高和宽变小。
但当我们的stride = 1/r < 1 时,可以让卷积后的feature map的高和宽变大——即分辨率增大,这个新的操作叫做sub-pixel convolution,具体原理可以看PixelShuffle《Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network 》的论文。
-
实现的功能是:将一个H × W的图像变为rH x rW的高分辨率图像(High Resolution)。
-
原理:通过卷积先得到 r^2 个通道的特征图(特征图大小和输入低分辨率图像一致),然后通过周期筛选(periodic shuffing)的方法得到这个高分辨率的图像,其中rrr为上采样因子(upscaling factor),也就是图像的扩大倍率。
-
定义:class torch.nn.PixleShuffle(upscale_factor)
upscale_factor就是放大的倍数,数据类型为int。
以四维输入 (N, C, H, W) 为例,Pixelshuffle会为 (∗, r^2 x C, H, W) 的Tensor给reshape成 (∗, C, rH, rW) 的Tensor。
eg:扩大两倍
输入: (12, 64, 224, 224)
输出: (12, 16, 448, 448)
>>> ps = nn.PixelShuffle(3)
>>> input = torch.tensor(1, 9, 4, 4)
>>> output = ps(input)
>>> print(output.size())
torch.Size([1, 1, 12, 12])