之前介绍了第一篇超分辨率模型在深度学习中的实现——SRCNN模型,具体的介绍请参看我这一篇博客:https://www.cnblogs.com/Robin-tao/p/12942977.html
SRCNN的缺点是:(1) 是依赖于图像区域的context;(2)是训练收敛速度太慢;(3)是网络只适用于单一尺度。这些缺点在基于残差网络的SR应用中解决了,简称为VDSR模型。
今天来介绍ESPCN网络模型
1 ESPCN模型介绍
图1-SRCNN 模型图
图1是SRCNN的网络模型,对于左端网络输入来说,已经是双三次插值的高分辨率图像(注:在SRCNN中,网络的输入是经过双三次插值方法到HR图像相同尺寸的图像,这个输入图像算是“粗糙”的高分辨率图像)。这已经是在高分辨率空间了。也就是说剩下的Patch extraction 和Non-Linear mapping 和 Reconstruction都是在高分辨率空间中完成的操作。
但ESPCN指出,由于SRCNN是在最后一步是重构高分辨率图像块,作为输入是经过双三次插值的,已经高分辨率图像(图像尺寸和HR图像一样),在中间的2个网络相当于在高分辨率空间中进行处理,这增加了运算的复杂度。
后面有文献总结了不同上采样模型的策略,如图2所示:
图2-4种上采样网络结构
ESPCN就是图2上面4种上采样网络结构(b),也就是Post-upsampling SR结构。SRCNN是采用了(a):Pre-upsampling SR结构。至于剩下2种网络结构后面的模型会采用,咱以后继续说。
ESPCN的网络结构:
图3 ESPCN模型结构图
网络模型的pytorch代码:
图4 ESPCN 网络代码
ESPCN提出在网络的最末端实现LR到HR的分辨率,并从LR特征图中获得高分辨率的HR数据。这样就不需要在更大的HR分辨率下执行大部分SR操作。也就是输入是低分辨率图像(未经过插值处理,尺寸和HR图像不一样),在隐藏层中都是低分辨率图像进行处理,也就是在隐藏层没有添加任何关于高分辨率的先验信息。到了亚像素卷积层,才映射到高分辨率空间。
将$\boldsymbol{r}^2\times \boldsymbol{H}\times \boldsymbol{W} $的特征图像,重新排列成的$1\times \boldsymbol{rH}\times \boldsymbol{rW}$ 高分辨率图像。亚像素卷积层如图5所示
图5 亚像素卷积层
亚像素卷积层,并没有做卷积操作,而是直接将$\boldsymbol{r}^2$ 个通道的特征图,重新进行排列,这样就完成了LR到HR的恢复。主要学习映射的步骤已经隐含在之前的隐藏层网络中。
亚像素卷积层能够将LR数据映射到HR空间中,与传统的卷积层相比,所需的计算量很小。
pytorch中的API即完成了网络中的最后一层,亚像素卷积层,
nn.PixelShuffle()
功能是:
Pixelshuffle会将shape为 ( _ , r * r * C , H , W) 的Tensor reshape成( _ , C , r * H , r * W) 的Tensor。
输入输出的shape如下:
- Input: (N,C∗upscale_factor2,H,W)
- Output: (N,C,H∗upscale_factor,W∗upscale_factor)
2 总结
ESPCN的创新点:
(1)采用亚像素对高分辨率信息进行恢复。
(2)采用Post-upsampling SR上采样模型。
(3)选择tanh而不是relu作为激活函数。
3 结果(摘自原论文)
对几种方法的PSNR比较:
结果图: