用SRGAN提升图片清晰度(TensorFlow)
近两年GAN(Generative Adversarial Network
)相关的论文大火了一把,我自己也体验了几次,确实是很神奇的网络,GAN的各种变体基本都是用来生成图片的,关于GAN相关的说明这里不多讲,如有需要了解的可以自行搜索。
但是GAN似乎有个问题,生成的图片清晰度不是很好,因此SRGAN(Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial
Network)也就是针对这个问题作出的优化,不同于普通的GAN是通过噪声来生成一个真实图片,SRGAN的目的在于将一个低分辨率的图片转化为一个高分辨率的图片。
具体的算法这里也不介绍了,GAN的变体太多,我也不是专门研究这些的,所以这里只介绍效果如何,以及怎么用。
先看几组图:

很好奇论文中选择的示例图居然是一个我国少数民族妹子。
训练方法大致就是构建好网络后,找一个高清图片数据集,对每个图片做处理得到低分辨率的图片,从而得到低分辨率图片数据集。用这两个数据集来训练网络,实现低分辨率到高分辨率图片的转化。
我自己测试了几张人脸图的转换:
-
人脸·男:
左:低分辨率 右:高分辨率
-
人脸·女:
左:低分辨率 右:高分辨率
从对比来看很容易发现确实提高了分辨率,至少视觉上看总觉得左边的是眼镜糊了。
我们放大来看一下算法到底做了什么:


从放大图中可以看到,人脸上多了很多奇怪的纹路,但是缩小后看就会觉得确实分辨率提高了,神奇的大自然!
如果你对这个实验感兴趣,也可以自己来尝试一下。在Github可以搜到很多TensorFlow下的开源代码,如果自己机器显卡够强的话可以自己按照说明训练,如果显卡不行也没关系,我实验的这份源码作者提供了预训练好的模型(最爱这种作者了!):https://github.com/brade31919/SRGAN-tensorflow
其训练好的模型需要在Google云盘下载,需要翻墙。
要注意的是,这份代码只能输入png图片,如果你是jpg图片,通过简单的画图工具转换成png格式也是不行的,代码会报错的。
下载源代码和模型后,将模型文件夹“SRGAN_pre-trained”直接放到源代码目录下,创建一个你的图片目录,将png图片丢进去,修改“inference_SRGAN.sh”文件的红框部分为你的图片路径:

然后在终端运行“inference_SRGAN.sh”文件即可,如果成功了会如下:

其中“000156”是我图片的名字。
最后,我的运行环境是:
- macOS 10.12.6
- TensorFlow 1.3.0
- Python 2.7
Have fun!