原创文章,转载、引用请注明出处!
Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network
这篇文章第一次将将生成对抗网络用在了解决超分辨率问题上。
生成对抗网络,Generative Adversarial Network,GAN;
GAN = G + D + 其他;
G:以次充好;D:明辨是非;其他:具体问题具体分析;
网络结构
Generator
G:残差块 + 卷积层 + BN层 + PReLU
卷积层
常规的卷积层。
BN层
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
在多数网络中,BN层的作用主要有以下四个:
- 可以选择比较大的初始学习率,显著提高网络的训练速度
在此之前的深度网络的训练,需要慢慢的调整学习率,甚至在网络训练到中间的时候,还需要考虑对学习率进行渐进的调整,有了BN之后,可以采用初始很大的学习率,然后学习率的衰减速度也很大,因为这个算法收敛很快。当然这个算法即使在选择了较小的学习率,也比以前的收敛速度快,因为它具有快速训练收敛的特性。
无需再理会过拟合中drop out、L2正则项参数的选择问题。采用BN算法后,网络可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性;
再也无需使用使用局部响应归一化层(局部响应归一化是Alexnet网络用到的方法),因为BN本身就是一个归一化网络层;
可以把训练数据彻底打乱。
防止每批训练的时候,某一个样本都经常被挑选到,原文说可以提高1%的精度。
BN在SRGAN里并不是重点。ESRGAN有改进到这个点。
Residual blocks
为什么要使用残差块?意义如何?
在生成器的前6层网络中,运用了残差块。
使用残差块的意义是:当损失函数从D开始反向传播回G的时候,实际上进过来很多层。众所周知,越深的网络隐藏参数越多,在反向传播的过程中也越容易梯度弥散。而且残差连接的方法,就有效的保证了梯度信息能够有效的传递而增强生成对抗网络的鲁棒性。
很多的GAN类模型有这样的操作。
ESRGAN也针对残差做了改进。
为什么使用GAN来解决Image SR的问题?
传统插值方法可以看做把像素复制放大倍数后,用某种固定的卷积核去卷积。
类似于SRCNN这样的基于卷积神经网络的方案也容易理解:学习上述卷积核,根据构建出的超分图像与真实的高分辨率图像(Ground Truth)的差距去更新网络参数。这种方法的损失函数一般都采用均方误差MSE。
当前监督SR效果的算法(损失函数)的优化目标是使恢复后的HR图像与ground truth间的均方差(MSE)最小化。这样做的目的是:取得很高的PSNR。但是由于PSNR是基于像素级图像(pixel-wise image)的差异来定义的,因此PSNR捕捉到和人的感官非常密切的差异(纹理细节)的能力十分有限,因此最高的PSNR不一定能反映人感官上最好的结果。放大倍数越大,越不平滑的情况下PSNR越低。不过从视觉上说最为真实,因为过于平滑会使得图像内部物体的边缘看起来模糊。
上图中的图三是SRGAN给出的结果。PSNR虽然比图二低了近0.1,但是图二的脸和手明显是模糊的,看起来很不真实,图三的各个细节都很清晰,真实度比图二更高。
while GAN drives the reconstruction towards the natural image manifold producing perceptually more convincing solutions.
这张图也说明的是上述问题。一旦放大倍数超过4,那么基于MSE优化的网络产生出来的HR图像在纹理细节方面就会过于平滑,看起来就像是糊成一团,但就是这样PSNR还有很高的得分。
换言之,SRGAN没有以PSNR/MSE为“最高指示”,它更注重人的主观的评价(SRGAN在PSNR的表现确实很一般)。
为了证明“高PSNR并不能带来良好的感官效果”这个观点,原文给出了一个指标,称为Mean opinion score(MOS),是26位评判者的打分。在这26位评委眼中,SRGAN产生的图像更真实:
Discriminator
D:VGG19 + LeakyReLU + max-pooling
VGG19
Very deep convolutional networks for large-scale image recognition
上面提到了SRGAN以人的主观感受为主旨来进行网络的训练。
于是会出现一个无法避免的问题:即使在同一个领域内以及对评判人做过筛选,人的感官也是一定是极其主观的评判。换言之,人的主观感受是无法用数学的语言去确切表达的。那么该如何实现以感官的标准来指定监督算法(损失函数)呢?
作者所选择的是基于VGG的内容损失。先基于预训练的19层VGG网络的ReLU激活层来定义损失函数。内容损失的实质就是从VGG19网络里提取的特征图之间欧式距离的损失函数,无论是超分辨率还是艺术风格的转移,效果都非常好。
如何使用GAN解决Image SR的问题?
GAN的工作过程:给定一个低分辨率图片作为噪声z的输入,通过生成器的变换把噪声的概率分布空间尽可能的去拟合真实数据的分布空间。
而在SRGAN中生成器的输入不再是噪声,而是低分辨率图像;而判别器结构跟普通的GAN没有什么区别。
综上,SRGAN的功能叙述为:把LR看成是一个噪声z的输入,那么G的作用就是生成的是一个fake的HR,D的作用是要去分辨G生成的fakeHR与原始的HR之间的区别,给出判断。
min-max方程
对于判别器D,希望D最大,所以加号之前的log部分应该最大,意味着判别器D可以很好的识别出,真实的高分辨率图像是”true”。而要让log尽可能的大,加号后的这部分中的ΘD(ΘG(z))要尽可能的小,意味着生成模型复原的图片应该尽可能的被D视为”FALSE”。
对于生成器G,应该让G尽可能的小,加号前面的式子并没有G,加号后面的式子中要让ΘG尽可能地小,就要ΘD(ΘG(Z))尽可能的大,也就是说本来就一张低分辨率生成的图片,判别器却被迷惑了,以为是一张原始的高分辨率图片。
损失函数
Perceptual loss function
Perceptual Losses for Real-Time Style Transfer and Super-Resolution and Super-Resolution
最重要的就是本文特别定制的生成器D的损失函数,可以说就是为了这个损失函数才采用GAN的。这个特制的损失函数被称为感知损失,Perceptual loss function。结构如下:
其中,加号左边是Content loss(内容损失),加号右边是Adversarial loss(对抗损失,包括系数)。
Content loss
与先前的基于深度学习的超分方法相比,SRGAN的D在Loss上只有一个明显的变化:Loss不再单是对构建出来图片与真实高分辨率图片求MSE,而是加上对构建出图片的特征图与真实高分辨率图片在VGG19下的特征图求MSE。
简言之,内容损失=原MSE+特征图MSE:
原文中没有上述公式。
原文中也并未明确地指出要加和原MSE,只是给出了VGG19特征图的MSE。
加号左边是原MSE:
其中,θσ是网络参数,ILR是低分辨率图像,减号后面的部分是重建出来的高分辨率图像, 减号之前的是真实的高分辨率图像,r、W、H分别是图片数量、图片宽和高,都可以看成常数。
加号右边是VGG19特征图的MSE,称为VGG loss:
VGG loss与原MSE相比,多的部分是φij,指的是第i个maxpooling层前的第j个卷积的特征图。
VGG Loss的权重,1e-6是个超参,是TensorLayer的设置,设置到这么小应该是因为用了所有的特征图。
Adversarial loss
除了内容损失以外,还要加上一个GAN原有的对抗损失:
其中,log内的部分是判别器对于生成超分图片的输出,-log(x)在(0,1)上是个单调递减的函数。前面提到,生成器D希望log内部分的值越大越好,也就是-log(x)越小越好,因此梯度更新的时候需要最小化对抗损失。
生成器D的Loss
综上,生成器D的Loss
这一部分在Tensorflow平台上的代码:
1 | g_gan_loss = 1e-3 * tl.cost.sigmoid_cross_entropy(logits_fake, tf.ones_like(logits_fake)) |
代码中的logits_real和logits_fake分别判别器对是真实高分图片、GAN生成的高分图片的输出。fake_patchs, hr_patchs分别是生成器的输出、真实的高分图片。feature_fake、feature_real是构建的图片、真实图片在VGG网络中的特征图。
判别器D的Loss
D的Loss用到了sigmoid交叉熵。
这一部分在Tensorflow平台上的代码:
1 | d_loss1 = tl.cost.sigmoid_cross_entropy(logits_real, tf.ones_like(logits_real)) |
损失函数softmax_cross_entropy、binary_cross_entropy、sigmoid_cross_entropy之间的区别与联系:https://www.jianshu.com/p/47172eb86b39
实验
实验部分给出的结论是
未针对实时视频SR进行优化;
较浅的网络有可能提供非常有效的替代方案,但质量性能会有小幅度的降低。而更深层次的网络架构是也可以给出更高的结果。原文针对这一点给出的解释是:推测ResNet的设计对深层网络的性能有很大的影响:即使是更深层次的网络(B>16)也可以进一步提高SRResNet的性能,但代价是需要更长的培训和测试时间。且由于高频伪影的出现,更深层次网络的SRGAN变体越来越难以训练。
In contrast to Dong et al. [10], we found deeper network architectures to be beneficial. We speculate that the ResNet design has a substantial impact on the performance of deeper networks. We found that even deeper networks (B > 16) can further increase the performance of SRResNet, however, come at the cost of longer training and testing times (c.f. supple- mentary material). We further found SRGAN variants of deeper networks are increasingly difficult to train due to the appearance of high-frequency artifacts.
对比实验做的是SRGAN在不同的卷积网络的深度下的效果,显然也是网络越深效果越好。
VGG54取得了最好的视觉效果,原文给出的解释是:更深层的网络层在远离像素空间的情况下代表更高抽象的特征。
In this work, we found lSR VGG/5.4 to yield the perceptually most convincing results, which we attribute to the potential of deeper network layers to represent features of higher abstraction [68, 65, 40] away from pixel space.