【CVPR2016】单张图像超分辨率ESPCN

原文标题:Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network
问题领域:超分辨率
简述:实时、图像超分辨率(Super-Resolution)、卷积神经网络(CNN)
原文:https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf
发表:CVPR2016
原文背景:超分辨率问题,是从单张低分辨率(LR)图像通过一个滤波获取高分辨率(HR)图像的问题。已有若干成功的用于超分辨率的CNN工作。但是这些方法大多数都首先将输入的图像做了一个操作(大多数是bicubic插值,可参考https://blog.csdn.net/linqianbi/article/details/78594019),使其放大到和输出图像相同的size。这么做的话,其实是在HR空间中计算的,一方面并不能得到最优的效果,另一方面计算量会非常的巨大。
此文贡献:在LR空间上处理卷积,并由一个sub-pixel层转换到HR上,从而完成工作。下图为其time cost以及PSNR(Peak Signal to Noise Ratio)与其他方法的对比:
【CVPR2016】单张图像超分辨率ESPCN_第1张图片

其网络结构如下:
【CVPR2016】单张图像超分辨率ESPCN_第2张图片

网络流程:
input输入,卷积,激活,卷积,激活…卷积,激活,sub-pixel卷积。

流程简析:

  1. 并不是一般的卷积+激活+池化的套路,这里并没有池化的过程;
  2. 在每一层卷积的过程中,padding为(kernal-size-1)/2;
  3. 最后一层sub-pixel其实并没有做卷积运算,只是将上一层的r^2个channel的feature按规律拼插组合为一张大的map,这个map其实就是恢复到HR空间中,用来预测HR的image的。

流程评价:

  1. 不池化+padding,保证了feature在每一个layer中都是相同的size,只是channel数目不同;
  2. 倒数第二层的channel数目为r^2,这其实就是为了凑出最后一步的长宽都放大r倍的HR的image;
  3. 前面的激活函数,最好能有relu(或者prelu)函数的存在,以便有能力表达出比较尖锐的特征;
  4. sub-pixel可以不加,代替做法是直接把groundtruth拆成r2个channel,这样就可以和最后一层r2通道的feature来计算MSEloss了。当然也可以直接使用sub-pixel层(pytorch中有这个层,但是遗憾只有2d版本,没有3d版本)。

另外,找到了实现的比较完善的pytorch版本代码,亲测可用:
GitHub代码:https://github.com/leftthomas/ESPCN

后注:测试过后感觉,这种方法虽然PSNR值很高,但是视觉上仍旧感觉是不太清晰,另外后续的单张图像超分辨率工作还有很多,后续再慢慢写吧。

你可能感兴趣的:(【CVPR2016】单张图像超分辨率ESPCN)