胡志豪作者

SRGAN With WGAN:让超分辨率算法训练更稳定

RGAN 是基于 GAN 方法进行训练的,有一个生成器和一个判别器,判别器的主体使用 VGG19,生成器是一连串的 Residual block 连接,同时在模型后部也加入了 subpixel 模块,借鉴了 Shi et al 的 Subpixel Network [6] 的思想,让图片在最后面的网络层才增加分辨率,提升分辨率的同时减少计算资源消耗。详细的介绍建议大家还是直接看论文 [1],网上也有一些解读的文章,这里就直接介绍实现的一些创新细节。

作者丨胡志豪

单位 | 棒谷网络科技图像工程师

经历丨实现过电商大规模以图搜图、超分辨率等项目

写在前面

此文挖坑了很久,项目本在 7 个月前已经结束,但一直没心思把代码整理出来,后来发现有相同思路的团队把它写成论文占坑了,也就更没动力写了。昨晚发现我的 Github 项目竟然有星星,感受到了莫大的支持,忽然燃起了写文章的动力,于是就有了现在这篇。

SRGAN

SRGAN,2017 年 CVPR 中备受瞩目的超分辨率论文,把超分辨率的效果带到了一个新的高度,而 2017 年超分大赛 NTIRE 的冠军 EDSR 也是基于 SRGAN 的变体。

SRGAN 是基于 GAN 方法进行训练的,有一个生成器和一个判别器,判别器的主体使用 VGG19,生成器是一连串的 Residual block 连接,同时在模型后部也加入了 subpixel 模块,借鉴了 Shi et al 的 Subpixel Network [6] 的思想,让图片在最后面的网络层才增加分辨率,提升分辨率的同时减少计算资源消耗。详细的介绍建议大家还是直接看论文 [1],网上也有一些解读的文章,这里就直接介绍实现的一些创新细节。

GAN存在的问题

传统 GAN 存在一个问题是,你无法知道什么时候该停止训练 Generator,什么时候该停止训练 Discriminator,如果过度训练 Discriminator,Generator 就无法学习下去,反之也会导致模型效果差。

如果能有一个 loss 指标来反映训练情况的话,训练的难度就会大大降低。而 17 年提出的WGAN [3] 正是解决这一问题的重要方法。 

WGAN 使用 Wasserstein 距离来描述两个数据集分布之间的差异程度,只要把模型修改成 WGAN 的形式,就能根据一个唯一的 loss 来监控模型训练的程度。有关 WGAN 的解释强烈推荐大家阅读这篇文章:令人拍案叫绝的 Wasserstein GAN [4],作者用非常直白明了的语言介绍 WGAN

SRGAN结合WGAN

SRGAN 的一个超赞复现来自 @董豪 之手,他也是 tensorlayer 的作者之一,他的复现项目在 Github 上得到了大量的星星,而笔者的代码就正是在他的基础上进行拓展,首先非常感谢作者的开源。

· 判别器最后一层去掉 sigmoid 

· 生成器和判别器的 loss 不取 log 

· 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数 c 

· 不要用基于动量的优化算法(包括 momentum 和 Adam),推荐 RMSProp,SGD 也行 

--来自《令人拍案叫绝的Wasserstein GAN

根据这篇文章的介绍,对代码进行以上四项修改,把 GAN 的训练方式转换成 WGAN,可以在 tensorboard 中监控 loss 的下降情况。因此,笔者对项目原作的进行了一些修改: 

1. 对模型代码进行了上面 WGAN 的改造; 

2. 增加了 Tensorboard,监控 loss 下降情况; 

3. 对作者的 model.py 中,Generator 的最后一层的卷积 kernel 从 1×1 改成 9×9,这是原论文建议的结构。 

SRGAN With Wasserstein GAN 的完整代码已经开源到笔者的 Github [5],里面有详细的改动介绍和使用说明,觉得好的话就给个 Star 呀!

▲ 修改后的训练Loss下降情况


下面是一些复现后的超分复原效果:

一个来自工业界的问题

在实际生产使用中,遇到的低分辨率图片并不一定都是 PNG 格式的(无损压缩的图片复原效果最好),而且会带有不同程度的失真(有损压缩导致的 artifacts)。笔者尝试过很多算法,例如 SRGAN、EDSR、RAISR、Fast Neural Style 等等,这类图片目前使用任何一种超分算法都没法在提高分辨率的同时消除失真

这个问题我在 @董豪 SRGAN 项目的 issue 中也讨论过,同时在知乎也提出过这个问题:SRGAN 超分辨率方法对于低清 jpg 格式的图片复原效果是否比不上对低清 png 格式的复原效果?

可惜没有很好的答案。目前学术界貌似还没有很好的算法,这里欢迎各位在评论区或者 Github 上来讨论。

PaperWeekly
PaperWeekly

推荐、解读、讨论和报道人工智能前沿论文成果的学术平台。

入门卷积VGGGAN
1
相关数据
VGG技术

2014年,牛津大学提出了另一种深度卷积网络VGG-Net,它相比于AlexNet有更小的卷积核和更深的层级。AlexNet前面几层用了11×11和5×5的卷积核以在图像上获取更大的感受野,而VGG采用更小的卷积核与更深的网络提升参数效率。VGG-Net 的泛化性能较好,常用于图像特征的抽取目标检测候选框生成等。VGG最大的问题就在于参数数量,VGG-19基本上是参数量最多的卷积网络架构。VGG-Net的参数主要出现在后面两个全连接层,每一层都有4096个神经元,可想而至这之间的参数会有多么庞大。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

卷积技术

张量技术

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

动量技术

优化器的一种,是模拟物理里动量的概念,其在相关方向可以加速SGD,抑制振荡,从而加快收敛

WGAN技术

就其本质而言,任何生成模型的目标都是让模型(习得地)的分布与真实数据之间的差异达到最小。然而,传统 GAN 中的判别器 D 并不会当模型与真实的分布重叠度不够时去提供足够的信息来估计这个差异度——这导致生成器得不到一个强有力的反馈信息(特别是在训练之初),此外生成器的稳定性也普遍不足。 Wasserstein GAN 在原来的基础之上添加了一些新的方法,让判别器 D 去拟合模型与真实分布之间的 Wasserstein 距离。Wassersterin 距离会大致估计出「调整一个分布去匹配另一个分布还需要多少工作」。此外,其定义的方式十分值得注意,它甚至可以适用于非重叠的分布。

推荐文章
暂无评论
暂无评论~