原文标题: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)与其他方法的对比。
其网络结构如下:
网络流程:
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. 最后一层的**函数,可要可不要,但是一定不能是relu,而要用sigmod,因为这儿已经接近输出了,sigmod可以保证输出刚好为0,1之间,符合图像RGB的范围;
5. sub-pixel可以不加,代替做法是直接把groundtruth拆成r^2个channel,这样就可以和最后一层r^2通道的feature来计算MSEloss了。当然也可以直接使用sub-pixel层(pytorch中有这个层,但是遗憾只有2d版本,没有3d版本)。
另外,找到了实现的比较完善的pytorch版本代码,亲测可用:
GitHub代码:https://github.com/leftthomas/ESPCN
后注:测试过后感觉,这种方法虽然PSNR值很高,但是视觉上仍旧感觉是不太清晰。
为方便查阅,本人所有paper reading博文的标题均尽量与paper原文的标题保持一致,并尽量cover关键词。欢迎萌新提问或者大牛指点~~
欢迎点击上方搜索栏,搜索博主更多文章,一起讨论共同进步~~