写在前面:
此文挖坑了很久,项目本在7个月前已经结束,但一直没心思把代码整理出来,后来发现有相同思路的团队把它写成论文占坑了,也就更没动力写了。昨晚发现我的github项目竟然有星星,感受到了莫大的支持,忽然燃起了写文章的动力,于是就有了现在这篇。
SRGAN简介
SRGAN,CVPR中备受瞩目的超分辨率论文,把超分辨率的效果带到了一个新的高度,而超分大赛NTIRE的冠军EDSR也是基于SRGAN的变体。图来自原论文图来自原论文
SRGAN是基于GAN方法进行训练的,有一个生成器和一个判别器,判别器的主体使用VGG19,生成器是一连串的Residual block连接,同时在模型后部也加入了subpixel模块,借鉴了 Shi et al的Subpixel Network[6]的思想,让图片在最后面的网络层才增加分辨率,提升分辨率的同时减少计算资源消耗。详细的介绍建议大家还是直接看论文[1],网上也有一些解读的文章,这里就直接介绍实现的一些创新细节。图来自原论文
GAN存在的问题
传统GAN存在一个问题是,你无法知道什么时候该停止训练Generator,什么时候该停止训练Discriminator,如果过度训练Discriminator,Generator就无法学习下去,反之也会导致模型效果差。如果能有一个loss指标来反映训练情况的话,训练的难度就会大大降低。而提出的WGAN[3]正是解决这一问题的重要方法。
WGAN使用Wasserstein距离来描述两个数据集分布之间的差异程度,只要把模型修改成WGAN的形式,就能根据一个唯一的loss来监控模型训练的程度。有关WGAN的解释强烈推荐大家阅读这篇文章:令人拍案叫绝的Wasserstein GAN ,作者用非常直白明了的语言介绍WGAN。
SRGAN结合WGAN
SRGAN的一个超赞复现来自 @董豪 之手,他也是tensorlayer的作者之一,他的复现项目在github上得到了大量的星星,而笔者的代码就正是在他的基础上进行拓展,首先非常感谢作者的开源。· 判别器最后一层去掉sigmoid
· 生成器和判别器的loss不取log
· 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
· 不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行
根据这篇文章的介绍,对代码进行以上四项修改,把GAN的训练方式转换成WGAN,可以在tensorboard中监控loss的下降情况。因此,笔者对项目原作的进行了一些修改:对模型代码进行了上面WGAN的改造;
增加了Tensorboard,监控loss下降情况;
对作者的model.py中,Generator的最后一层的卷积kernel从1×1改成9×9,这是原论文建议的结构。
SRGAN With Wasserstein GAN的完整代码已经开源到笔者的github:修改后的训练Loss下降情况
下面是一些复现后的超分复原效果:
一个来自工业界的问题
在实际生产使用中,遇到的低分辨率图片并不一定都是PNG格式的(无损压缩的图片复原效果最好),而且会带有不同程度的失真(有损压缩导致的artifacts),笔者尝试过很多算法,例如SRGAN、EDSR、RAISR、Fast Neural Style等等,这类图片目前使用任何一种超分算法都没法在提高分辨率的同时消除失真,这个问题我在 @董豪 SRGAN项目的issue中也讨论过,同时在知乎也提出过这个问题:SRGAN超分辨率方法对于低清jpg格式的图片复原效果是否比不上对低清png格式的复原效果?,可惜没有很好的答案。目前学术界貌似还没有很好的算法,这里欢迎各位在评论区或者github上来讨论。如何提高深度学习数据传输效率
推荐我的Live,在本次Live中,您将会对计算机硬件对数据传输效率影响因素有更深入的认识,而且能学到软件层面提高算法效率的技巧。
参考文献
本文已收录于本人的个人网站,欢迎浏览收藏:https://ijst.me/wp