咱们知道GAN 在图像修复时更容易获得符合视觉上效果更好的图像,今天要介绍的这篇文章——ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks,它 发表于 ECCV 2018 的 Workshops,做者在 SRGAN 的基础上进行了改进,包括改进网络的结构、判决器的判决形式,以及更换了一个用于计算感知域损失的预训练网络。json
超分辨率生成对抗网络(SRGAN)是一项开创性的工做,可以在单一图像超分辨率中生成逼真的纹理。这项工做发表于 CVPR 2017。网络
可是,放大后的细节一般伴随着使人不快的伪影。为了更进一步地提高视觉质量,做者仔细研究了 SRGAN 的三个关键部分:1)网络结构;2)对抗性损失;3)感知域损失。并对每一项进行改进,获得 ESRGAN。框架
具体而言,文章提出了一种 Residual-in-Residual Dense Block (RRDB) 的网络单元,在这个单元中,去掉了 BN(Batch Norm)层。此外,做者借鉴了 Relativistic GAN 的想法,让判别器预测图像的真实性而不是图像“是不是 fake 图像”。函数
最后,文章对感知域损失进行改进,使用激活前的特征,这样能够为亮度一致性和纹理恢复提供更强的监督。在这些改进的帮助下,ESRGAN 获得了更好的视觉质量以及更逼真和天然的纹理。性能
改进后的效果图(4 倍放大):测试
在纹理和细节上,ESRGAN都优于SRGAN优化
SRGAN的思考与贡献spa
现有的超分辨率网络在不一样的网络结构设计以及训练策略下,超分辨的效果获得了很大的提高,特别是 PSNR 指标。可是,基于 PSNR 指标的模型会倾向于生成过分平滑的结果,这些结果缺乏必要的高频信息。PSNR 指标与人类观察者的主观评价从根本上就不统一。.net
一些基于感知域信息驱动的方法已经提出来用于提高超分辨率结果的视觉质量。例如,感知域的损失函数提出来用于在特征空间(instead of 像素空间)中优化超分辨率模型;生成对抗网络经过鼓励网络生成一些更接近于天然图像的方法来提高超分辨率的质量;语义图像先验信息用于进一步改善恢复的纹理细节。debug
经过结合上面的方法,SRGAN 模型极大地提高了超分辨率结果的视觉质量。可是 SRGAN 模型获得的图像和 GT 图像仍有很大的差距。
ESRGAN的改进
文章对这三点作出改进:
1. 网络的基本单元从基本的残差单元变为 Residual-in-Residual Dense Block (RRDB);
2. GAN 网络改进为 Relativistic average GAN (RaGAN);
3. 改进感知域损失函数,使用激活前的 VGG 特征,这个改进会提供更尖锐的边缘和更符合视觉的结果。
网络结构及思想
生成器部分
首先,做者参考 SRResNet 结构做为总体的网络结构,SRResNet 的基本结构以下:
为了提高 SRGAN 重构的图像质量,做者主要对生成器 G 作出以下改变:
1. 去掉全部的 BN 层;
2. 把原始的 block 变为 Residual-in-Residual Dense Block (RRDB),这个 block 结合了多层的残差网络和密集链接。
以下图所示:
思想
BN 层的影响:对于不一样的基于 PSNR 的任务(包括超分辨率和去模糊)来讲,去掉 BN 层已经被证实会提升表现和减少计算复杂度。
BN 层在训练时,使用一个 batch 的数据的均值和方差对该 batch 特征进行归一化,在测试时,使用在整个测试集上的数据预测的均值和方差。当训练集和测试集的统计量有很大不一样的时候,BN 层就会倾向于生成很差的伪影,而且限制模型的泛化能力。
做者发现,BN 层在网络比较深,并且在 GAN 框架下进行训练的时候,更会产生伪影。这些伪影偶尔出如今迭代和不一样的设置中,违反了对训练稳定性能的需求。因此为了稳定的训练和一致的性能,做者去掉了 BN 层。此外,去掉 BN 层也能提升模型的泛化能力,减小计算复杂度和内存占用。
技巧
除了上述的改进,做者也使用了一些技巧来训练深层网络:
1. 对残差信息进行 scaling,即将残差信息乘以一个 0 到 1 之间的数,用于防止不稳定;
2. 更小的初始化,做者发现当初始化参数的方差变小时,残差结构更容易进行训练。
判别器部分
除了改进生成器,做者也基于 Relativistic GAN 改进了判别器。判别器 D 使用的网络是 VGG 网络,SRGAN 中的判别器 D 用于估计输入到判别器中的图像是真实且天然图像的几率,而 Relativistic 判别器则尝试估计真实图像相对来讲比 fake 图像更逼真的几率。
Experiments篇
若是想用tensorboard,只需将train_ESRGAN.json文件中name里的debug拿掉便可:
另外,因为我使用的tensorboard版本比较新,须要将train.py中的49行的SummaryWriter的参数名称有log_dir改成logdir,由于新版的源码里这一块更新过:
PS: Windows上的实现推荐阅读文章vs2017 ESRGAN(Enhanced SRGAN)的PyTorch实现