深度学习:用生成对抗网络(GAN)来恢复高分辨率(高精度)图片 (附源码,模型与数据集)...

前言


平时生活中,咱们常常碰到一些本身喜欢的图片却苦于分辨率很低,而原图又找不太到。 如今,神经网络能够帮助咱们从一张给定的低分辨率图片恢复出高分辨率的图片。 这个功能听上去既炫酷又实用,具体是怎么作的呢,详见下文!html

Demo效果


上图就是训练了2000次后的模型的效果,只须要输入一张左边的低精度的图片, 就能够生成右边的高精度的图片。肉眼看上去效果仍是很是不错的!
这张GIF则展现了整个训练过程的变化, 左边的图是由神经网络生成的, 中间的是原始的高精度的图片, 右边的是输入到神经网络的低分辨率图片, ==神经网络在整个生成过程当中是没有获得高精度图片信息的,这里给出高精度图片只是为了对比体现生成的效果==。能够看到在100次epoch迭代以后,性能已经很是不错了。

连接

项目源码:基于keras的SRGAN实现. 主要参考了著名的keras-GAN这个库,作了一些小改动使得节目效果更好,适合做为Demo来展现哈哈。若是对你有帮助的话请Star一下哈! 论文地址 被引用了1500屡次,很强了!这个代码也是根据论文里的参数写的。 数据集地址 这个连接给出了百度云和谷歌云盘的下载地址,笔者是用百度云下载的,非会员用户, 5M/s的速度,很给力!git

原理分析

这里提供很是归纳性的分析,想深刻理解的同窗建议参考原文github

系统模型

首先做者使用了很是火热的GAN生成对抗网络(对GAN不熟悉的能够百度一下GAN,已经有许多优质的资料)。 生成网络(上图上半部)接收低精度图片做为输入,经过残差网络等,生成高精度图片。 而后 判别器网络(上图下半部)接收一个输入, 判断其是否为生成的图片。 损失函数为:

\begin{array}{c}{\min _{\theta_{G}} \max _{\theta_{D}} \mathbb{E}_{I^{H R} \sim p_{\mathrm{ranin}}\left(I^{H R}\right)}\left[\log D_{\theta_{D}}\left(I^{H R}\right)\right]+}  {\mathbb{E}_{I^{L R} \sim p_{G}\left(I^{L R}\right)}\left[\log \left(1-D_{\theta_{D}}\left(G_{\theta_{G}}\left(I^{L R}\right)\right)\right]\right.}\end{array}

没有GAN基础的同窗可能比较难理解上述公式,这里深刻浅出的通俗解释下训练过程其实就是:网络

  1. 固定生成器G (参数为{\theta_{G}}), 训练判别器,使得其可以分辨 真实的图片和生成器生成的图片。
  2. 固定判别器, 训练生成器, 使得其可以让固定的判别器将其判别为真实的图片 如此迭代以后, 判别器再也没法分别真实和生成的图片,此时就说明生成器生成的图片已经足够以假乱真。这里真实的图片指的就是高精度的图片,训练完成后,咱们指望生成器能够接收低精度图片,来生成高精度图片。

生成器做者主要使用了ResNet来实现。 判别器是使用了常规的卷积神经网络。函数

损失函数

与普通的GAN网络不一样的是,这篇文章还考虑了content loss:性能

\begin{array}{r}{l_{V G G / i . j}^{S R}=\frac{1}{W_{i, j} H_{i, j}} \sum_{x=1}^{W_{i, j} H_{i, j}}\left(\phi_{i, j}\left(I^{H R}\right)_{x, y}\right.} {-\phi_{i, j}\left(G_{\theta_{G}}\left(I^{L R}\right)\right)_{x, y} )^{2}}\end{array}

意思就是,生成的图片会和准确的图片一块儿,输入到VGG网络中,而后获得特征图。 再将二者的特征图求MSE,并训练生成器缩小该MSE。这就是从内容的角度,让生成的图片和准确图片尽量的接近。htm

结合上述的GAN网络,本文采用的loss是:图片

l^{S R}=\underbrace{l_{\mathrm{X}}^{S R}}_{\text { content loss }}+\underbrace{10^{-3} l_{G e n}^{S R}}_{\text { adversarial loss }}

也就是说在MSE损失的基础上,掺入了一点GAN的损失,做者指出这样会得到更好的性能。内存

实验

上述简单的概述应该很难让读者彻底看懂,建议结合论文与代码一块儿融会贯通。这里说一下仿真细节: 数据集使用了数据集地址 人脸数据集,所以要恢复的图片也应该是人像图才会效果比较好。 笔者的配置是1080Ti + i9-9900k + 48G内存, 所以使用的batch_size为10。配置不够的同窗能够先设为1,确保机器能够跑起来。 具体还能够参见基于keras的SRGAN实现中的readme,有具体的使用方法。get

结束

这个Demo很是简单,可是效果很不错,适合课堂演示,Presentation之类的。 我给出了本身这边训练了2000次后的模型权重,能够从连接下载 提取码:su92 因为训练的模型固定了输出的尺寸,所以你本身想输入的图片也尽量取正方形图片(裁剪一下就行)。