《Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel》 提出了一种新的上采样方式,对于SR(super-resolution) 任务的计算速度和重建效果都有不错的提升。
文章推出了一种在以往算法(SRCNN、Bicubic)上对于重建表现力以及计算效率(重建速度、计算资源损耗)都有一定提升的SR算法——ESPCN。
SRCNN先对输入图像做Bicubic插值,然后进行特征提取,这种方式相当于直接在HR层面做超分,作者证明这种方式是一种次优策略且会带来计算复杂度的提升。
针对这种问题,作者提出了ESPCN结构:
亚像素卷积层
,该层通常为网络的最后一层,它以之前特征提取后的feature map为输入,通过学习一个上采样滤波器来做到LR→SR的重建。ESPCN主要2个点很重要:①是直接对L R LR层级图像进行特征提取,②就是一个亚像素卷积层,下面展开来说下:
亚像素卷积层
。增加deconvolution layer是从最大池化和其他图像下采样层恢复分辨率的常用方法。这种方法已经成功地用于visualizing layer activations[49]和 generating semantic segmentations using high level features from the network[24]。
可以看出,SRCNN中使用的双三次插值(bicubic interpolation)是反卷积层的一个特殊情况,如[24,7]所述。[50]中提出的deconvolution layer可以看作是每个input pixel 与一个步幅 r r r的滤波器元素的element-wise 成绩,以及对结果输出窗口的和,也称为backwards convolution[24]。
提出背景:
另一种upscale LR图像的方法是在LR空间中进行步幅为 1 r \frac {1}{r} r1的卷积,如[24]所述,这可以简单地通过interpolation、perforate[27]或从LR空间un-pooling到HR空间[49],然后在HR空间中又进行步幅为1的卷积来提升性能。这些实现增加了 r 2 r^2 r2的计算成本,因为卷积发生在HR空间中。
因此作者提出了一种同样以 1 r \frac{1}{r} r1 为步长,但不需要额外计算量的隐式卷积层——亚像素卷积层(sub-pixel convolution layer)
。
亚像素卷积的核心思想:一张图像放大r倍,就相当于每个像素都放大r倍。
在网络倒数第二层卷积过程输出通道数
为r^2
与原图同样大小
的特征图像
然后经过亚像素卷积层周期性排列,得到大小为(w × r , h × r)
的重建图像。
如上图中倒数第二层红圈框住的9个特征,排列后组成箭头所指的最后一层小方框,这就是原图中框住的像素经过网络构成的重建块。这九个像素刚好使原像素的长宽各放大了三倍。
亚像素卷积(Sub-pixel Convolution)其实并没有卷积运算,只是抽取特征然后进行简单排列。
亚像素卷积的原理
- 为什么叫亚像素卷积?
可以将亚像素卷积层看成是一个隐式卷积
的过程:隐式卷积的意思就是还是会用一个滤波器去抽取信息,但是和传统的卷积运算不同,这里并没有涉及可学习的滤波器参数以及任何乘加运算
。
亚像素卷积过程中从左到右的过程就好像以一个 s t r i d e = 1 r stride=\frac{1}{r} stride=r1对LR图像做卷积,从而在直观上好像卷积生成出了一些小小的像素点,又因为 1 r ≤ 1 \frac{1}{r}\leq1 r1≤1 ,意味着它做的是整像素内部的运算,我们称之为亚像素,比如视频处理中常见的 1 2 \frac{1}{2} 21、 1 4 \frac{1}{4} 41像素都是亚像素。
- 亚像素卷积是如何工作的?
在LR空间中,一个步幅为 1 r \frac {1}{r} r1的卷积与一个大小为 k s k_s ks且weight spacing为 1 r \frac {1}{r} r1的滤波器 W s W_s Ws将激活卷积中 W S W_S WS的不同部分。落在像素之间的权重不被激活,不需要计算。激活模式的数量正好是 r 2 r^2 r2。每个激活模式,根据其位置,最多激活 ⌈ k s r ⌉ 2 \left\lceil\frac{k_s}{r}\right\rceil^2 ⌈rks⌉2个权重。根据不同的sub-pixel 的位置: m o d ( x , r ) mod (x, r) mod(x,r), m o d ( y , r ) mod (y, r) mod(y,r),其中 x , y x, y x,y是HR空间中的输出像素坐标。在本文中,我们提出了在 m o d ( k s , r ) = 0 mod (k_s, r) = 0 mod(ks,r)=0时实现上述操作的一种有效方法 :
I S R = f L ( I L R ) = P S ( W L ∗ f L − 1 ( I L R ) + b L ) \mathbf{I}^{S R}=f^L\left(\mathbf{I}^{L R}\right)=\mathcal{P} \mathcal{S}\left(W_L * f^{L-1}\left(\mathbf{I}^{L R}\right)+b_L\right) ISR=fL(ILR)=PS(WL∗fL−1(ILR)+bL)
其中 P S PS PS是一个周期变换算子,它将 H × W × C ⋅ r 2 H×W×C·r^2 H×W×C⋅r2 张量的元素重新排列为 r H × r W × c rH × rW × c rH×rW×c形张量。该操作的效果如图1所示。数学上,这个操作可以用下面的方式描述 :
P S ( T ) x , y , c = T ⌊ x / r ⌋ , ⌊ y / r ⌋ , C ⋅ r ⋅ m o d ( y , r ) + C ⋅ m o d ( x , r ) + c \mathcal{P S}(T)_{x, y, c}=T_{\lfloor x / r\rfloor,\lfloor y / r\rfloor, C \cdot r \cdot \bmod (y, r)+C \cdot \bmod (x, r)+c} PS(T)x,y,c=T⌊x/r⌋,⌊y/r⌋,C⋅r⋅mod(y,r)+C⋅mod(x,r)+c
卷积操作 W L W_L WL 的形状是 n L − 1 × r 2 C × k L × k L n_{L-1}\times r^2C\times k_L\times k_L nL−1×r2C×kL×kL。请注意,我们没有将非线性应用到最后一层卷积的输出。很容易看出,当 K L = k s r K_L=\frac{k_s}{r} KL=rks, 而 m o d ( k s , r ) = 0 mod(k_s,r)=0 mod(ks,r)=0 则相当于在LR空间与滤波器 W s W_s Ws进行sub-pixel convolution。
我们将我们的新层称为sub-pixel convolution layer
,我们的网络称为efficient sub-pixel convolutional neural network(ESPCN)
。最后一层从LR特征映射直接生成一个HR图像,每个特征映射都有一个upscaling 滤波器,如图4所示。
训练方式
给出了一个包含HR Image 示例的训练集 I n H R , n = 1... N I_n^{HR},n=1...N InHR,n=1...N,我们生成相应的LR图像 I n L R , n = 1 , . . , N I_n^{LR},n=1,..,N InLR,n=1,..,N,然后计算 pixel-wise mean squared error (MSE) 作为目标函数来训练我们的网络。
ℓ ( W 1 : L , b 1 : L ) = 1 r 2 H W ∑ x = 1 r H ∑ x = 1 r W ( I x , y H R − f x , y L ( I L R ) ) 2 \ell\left(W_{1: L}, b_{1: L}\right)=\frac{1}{r^2 H W} \sum_{x=1}^{r H} \sum_{x=1}^{r W}\left(\mathbf{I}_{x, y}^{H R}-f_{x, y}^L\left(\mathbf{I}^{L R}\right)\right)^2 ℓ(W1:L,b1:L)=r2HW1x=1∑rHx=1∑rW(Ix,yHR−fx,yL(ILR))2
关于亚像素卷积层,pytorch 中也提供了对应的实现torch.nn.PixelShuffle()
和 torch.nn.PixelUnshuffle()
用法详见【torch.nn.PixelShuffle】和 【torch.nn.UnpixelShuffle】
https://blog.csdn.net/MR_kdcon/article/details/123837994