基于学习的超分辨率技术
超分辨率:采用大量的高分辨率图像构造学习库产生学习模型,在对低分辨率图像进行恢复的过程中引入由学习模型获得的先验知识,以得到图像的高频细节,获得较好的图像恢复效果。
GANs 生成对抗网络Generative Adversarial Nets
2014 年 6 月,Ian Goodfellow 等学者发表了论文《Generative Adversarial Nets》,题目即“生成对抗网络”,这标志着 GANs 的诞生。文中,Ian Goodfellow 等作者详细介绍了 GANs 的原理,它的优点,以及在图像生成方面的应用。
生成对抗网络是一种生成模型(Generative Model),其背后基本思想是从训练库里获取很多训练样本,从而学习这些训练案例生成的概率分布。而实现的方法,是让两个网络相互竞争,‘玩一个游戏’。其中一个叫做生成器网络( Generator Network),它不断捕捉训练库里真实图片的概率分布,将输入的随机噪声(Random Noise)转变成新的样本(也就是假数据)。另一个叫做判别器网络(Discriminator Network),它可以同时观察真实和假造的数据,判断这个数据到底是不是真的。
更直白的说:
GANs 的基本原理是它有两个模型:一个生成器,一个判别器。判别器的任务是判断给定图像是否看起来‘自然’,换句话说,是否像是人为(机器)生成的。而生成器的任务是,顾名思义,生成看起来‘自然’的图像,要求与原始数据分布尽可能一致。GANs 的运作方式可被看作是两名玩家之间的零和游戏。原论文的类比是,生成器就像一支造假币的团伙,试图用假币蒙混过关。而判别器就像是警察,目标是检查出假币。生成器想要骗过判别器,判别器想要不上当。当两组模型不断训练,生成器不断生成新的结果进行尝试,它们的能力互相提高,直到生成器生成的人造样本看起来与原始样本没有区别。
注:Cifar-10由60000张32*32的RGB彩色图片构成,共10个分类。50000张训练,10000张测试(交叉验证)。这个数据集最大的特点在于将识别迁移到了普适物体,而且应用于多分类(姊妹数据集Cifar-100达到100类,ILSVRC比赛则是1000类)。对CIFAR-10 数据集的分类是机器学习中一个公开的基准测试问题,其任务是对一组大小为32x32的RGB图像进行分类,这些图像涵盖了10个类别:飞机, 汽车, 鸟, 猫, 鹿, 狗, 青蛙, 马, 船以及卡车。
GANs 最重要的应用之一,是生成看起来‘自然’的图像,这要求对生成器的充分训练。
Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network (arxiv, 21 Nov, 2016)这篇文章将对抗学习用于基于单幅图像的高分辨重建。
它是一个能把低分辨率图像重建为高清图像的技术。在机器学习中,实现超分辨率需要用成对样本对系统进行训练:一个是原始高清图像,一个是降采样后的低分辨率图像。本研究中,低分图像被作为输入喂给生成器,它重建出高分辨率图像。然后,重建图片和原始图片被一起交给判别器,来判断哪一幅是原始图像。
通过一系列低分辨率图像和与之对应的高分辨率图像作为训练数据,学习一个从低分辨率图像到高分辨率图像的映射函数,这个函数通过卷积神经网络来表示。传统的方法一般处理的是较小的放大倍数,当图像的放大倍数在4以上时,很容易使得到的结果显得过于平滑,而缺少一些细节上的真实感。这是因为传统的方法使用的代价函数一般是最小均方差(MSE),即
该代价函数使重建结果有较高的信噪比,但是缺少了高频信息,出现过度平滑的纹理。该文章中的方法提出的方法称为SRGAN, 它认为,应当使重建的高分辨率图像与真实的高分辨率图像无论是低层次的像素值上,还是高层次的抽象特征上,和整体概念和风格上,都应当接近。整体概念和风格如何来评估呢?可以使用一个判别器,判断一副高分辨率图像是由算法生成的还是真实的。如果一个判别器无法区分出来,那么由算法生成的图像就达到了以假乱真的效果。因此,该文章将代价函数改进为
该研究中的损失函数可分为两个部分:对抗损失(adversarial loss )和内容损失(content loss)。在较高层面上,对抗损失使图像看起来更自然;内容损失则保证重建图像与低分辨率原始图像有相似的特点。其中,对抗损失和传统的 GANs 应用类似,创新的是内容损失。该研究中的内容损失,可被看作为重建的高分辨率图像和原始高分图像之间特征图(feature map)的欧式距离(Euclidean distance)损失。而 GAN 的损失函数是对抗损失和内容损失的加权和。
第一部分是基于内容的代价函数,第二部分是基于对抗学习的代价函数。基于内容的代价函数除了上述像素空间的最小均方差以外,又包含了一个基于特征空间的最小均方差,该特征是利用VGG网络提取的图像高层次特征
对抗学习的代价函数是基于判别器输出的概率
其中是一个图像属于真实的高分辨率图像的概率。是重建的高分辨率图像。
Github网址:https://github.com/leehomyc/Photo-Realistic-Super-Resoluton
关于DCGAN
Github网址:https://github.com/carpedm20/DCGAN-tensorflow
代码介绍解释:http://www.cnblogs.com/Charles-Wan/p/6338074.html
关于Wasserstein GAN(WGAN)
论文:
《Towards Principled Methods for Training Generative Adversarial Networks》
《Wassertein GAN》
WGAN解读:http://www.sohu.com/a/125625053_610522
代码介绍解释:http://www.cnblogs.com/Charles-Wan/p/6386148.html
优点:彻底解决GAN训练不稳定的问题,不再需要小心平衡生成器和判别器的训练程度。基本解决了collapse mode的问题,确保了生成样本的多样性。训练过程中终于有一个像交叉熵、准确率这样的数值来指示训练的进程,这个数值越小代表GAN训练得越好,代表生成器产生的图像质量越高。
改进后相比原始GAN的算法实现流程却只改了四点:
判别器最后一层去掉sigmoid
生成器和判别器的loss不取log
每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行
关于pix2pix
Github:
Torch版pix2pix:https://github.com/phillipi/pix2pix
pyTorch版pix2pix(Cycle-GAN二合一版):https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
关于GAN的介绍和运用:
https://zhuanlan.zhihu.com/p/25201511
http://www.cnblogs.com/frombeijingwithlove/p/7077448.html
http://www.sohu.com/a/149698227_610300
Pixel recursive super resolution 像素回归超分辨率
论文地址:https://arxiv.org/abs/1702.00783
论文介绍:https://baijiahao.baidu.com/s?id=1563724488442734&wfr=spider&for=pc
但写的有点乱
为了获得生动合理的图像细节,研究者已经提出了详细的去模糊(de-blurr)方法。该方法类似于词典构造(dictionary construction,一种相当简单而基本的方法),更进一步是可以在 CNN 中提取多个抽象(CNN 层中存在的特征)的滤波器核(filter kernel)的学习层,然后通过测量被插值的低分辨率图像和高分辨率图像间的像素损失来调整网络权重。基本上这种基于多层过滤器的方法的特征层越多,其表现就越好。因此,该 SRResNet 通过从许多 ResNet 模块中学习来实现预期的性能。这篇论文应用了类似的条件网络设计来更好地处理高频特征。
超分辨率网络包含了一个调节网络(conditioning network)和一个优先网络(prior network)。其中调节网络是一个 CNN,其接收低分辨率图像作为输入,然后输出 logits——预测了每个高分辨率(HR)图像像素的条件对数概率(conditional log-probability)。而优先网络则是一个 PixelCNN,其基于之前的随机预测进行预测(用虚线表示)。
Prior network 使用PixelCNN 尝试把高分辨率的细节添加到8*8的源图像。Prior network摄入了大量的高分辨率真实图像 - 名人和卧室。 然后,当源图像放大时,它会尝试添加与该图像类别“知道”相匹配的新像素。 例如,如果图像顶部有一个棕色像素,则Prior network可能会将其识别为眉毛:因此,当图像放大时,可能会用眉毛形状的棕色像素集合填充间隙。
这套深度学习算法的工作机制十分复杂,但如果简化来说和大家玩你画我猜的过程差不多:
首先算法要猜出原始图片究竟是什么——它是人脸或是培根——如果它判断是人脸,那么接下来一步则要表达出这是一张人脸。表达人脸的方法是从现有的图片库中找到高像素的人脸素材,将其中可能符合这个图片的部分剪切出来拼凑成一张新的图片。
这个过程中的两个步骤分别调用了调节网络(Conditioning Network)和优先网络(Prior network),前者先把素材库里的高清图片全都压缩成马赛克图片,然后一一和输入计算机的马赛克图片对比;后者则根据对比结果预测这张图片究竟是什么东西,并指挥 PixelCNN(开源图像生成模型)把对应的素材贴到合适的位置,最终形成一幅“高清原图”。
Github网址:https://github.com/openai/pixel-cnn
降采样:即是采样点数减少。对于一幅N*M的图像来说,如果降采样系数为k,则即是在原图中,每行每列每隔k个点取一个点组成一幅图像。降采样很容易实现。
升采样:也即插值。对于图像来说即是二维插值。如果升采样系数为k,即在原图n与n+1两点之间插入k-1个点,使其构成k分。二维插值即在每行插完之后对于每列也进行插值。插值的方法分为很多种,一般主要从时域和频域两个角度考虑。对于时域插值,最为简单的是线性插值。除此之外,Hermite插值,样条插值等等均可以从有关 数值分析书中找到公式,直接代入运算即可。对于频域,根据傅里叶变换性质可知,在频域补零等价于时域插值。所以,可以通过在频域补零的多少实现插值运算。