綜述

  1. ESPCN直接在Low Resolution的圖片上做Convolution與SRCNN先Scale Up後再進行Convolution不同,較少的Resolution較少的計算量
  2. ESPCN提出了sub-pixel convolution與FSRCNN的deconvolution分庭抗禮但sub-pixel convolution要求的計算量又更低,便是Real-Time標題的由來。
  3. 在PSNR的表現其實沒有超越SRCNN很多,主要突出在計算效率部分。

模型概述

  1. 在前半部分的Hidden Layers其實一般CNN概念相同,但在接入sub-pixel convolution layer前要維持Low Resolution的形狀不變
  2. 在後半部分的Sub-pixel convolution layer,在倒數第二層的通道為( r²c ),其中c為最終圖像的維度c=3 如RGB圖,YUV的話c=1。r為Upscale至目標圖片的整數倍數。

3. 再將每一channel的輸出如上圖所述拼接還原就可以得到 r²的Upscale圖像,在Pytorch中可以直接call PixelShuffle method來達成。

Pytorch Code

  1. 使用Tanh instead of RELU
  2. 倒數第二層的channel數 = num_channels x scale_factor x scale_factor
class ESPCN(nn.Module):
def __init__(self, scale_factor, num_channels=1):
super(ESPCN, self).__init__()
self.first_part = nn.Sequential(
nn.Conv2d(num_channels, 64, kernel_size=5, padding=5//2),
nn.Tanh(),
nn.Conv2d(64, 32, kernel_size=3, padding=3//2),
nn.Tanh(),
)
self.last_part = nn.Sequential(
# channels = scale factor * scale factor * channel
nn.Conv2d(32, num_channels * (scale_factor ** 2), kernel_size=3, padding=3 // 2),
# Pixel Shuffle provide by Pytorch
nn.PixelShuffle(scale_factor)
)

--

--