看得「深」、看得「清」—— 深度学习在图像超清化的应用

基于GAN框架,只要定义好生成网络和分类网络,就可以完成某种生成任务。

而将GAN应用到图像高清问题的这篇论文,可以说是集大成之作。生成模型层次深且使用了residual block和skip-connection;在GAN的损失函数的基础上同时添加了感知损失。

GAN的生成网络和分类网络如图5,其中,生成网络自己也可以是一个单独的图像超清算法。论文中分析了GAN和non-GAN的不同,发现GAN主要在细节方面起作用,但无法更加深入地解释。“无法解释性”也是GAN目前的缺点之一。

像素递归网络(Pixel CNN)

图5中的GAN虽然能够达到比较好的效果,但是由于可解释性差,难免有套用之嫌。

其实,对于图像超清这个问题来说,存在一个关键性的问题,即一张低清图像可能对应着多张高清图像,那么问题来了。

假如我们把低分辨率图像中需要高清化的部分分成A,B,C,D等几个部分,那么A可能对应A1,A2,A3,A4,B对应B1,B2,B3,B4,以此类推。假设A1,B1,C1,D1对应一张完美的高清图片。那么现有的算法可能生成的是A1,B2,C3,D4这样的混搭,从而导致生成的高清图像模糊。

为了验证上述问题的存在,设想一种极端情况。

7图6. 图像超清模糊性问题分析图示。上半部分为分析问题所用数据集的构建。下半部分为现有的损失函数在这个问题上的效果。可以通过对比看出,PixelCNN能够防止这种模糊的出现。

为了分析图像模糊问题的成因,在图6的上半部分,基于MNist数据集生成一个新的数据集。生成方法如下:将MNIST数据集中的图片A长宽各扩大两倍,每张图片可以生成两张图片A1和A2,A1中A处于右下角,A2中A处于左上角。

把原图当做低清图片,生成的图当成高清图片。使用图6下半部分所列举的三种方法进行训练,得到的模型,在生成图像的时候,会产生图6下半部分的结果。即每个像素点可能等概率地投射到左上部分和右下部分,从而导致生成的图片是错误的。而引入PixelCNN后,由于像素之间产生了依赖关系,很好地避免了这种情况的发生。

为了解决上述问题,需要在生成图像的同时引入先验知识。画家在拥有了人脸的知识之后,就可以画出令人信服的高清细节。类比到图像超清问题中,先验知识即是告知算法该选择哪一种高清结果。

在图像超清问题中,这样的知识体现为让像素之间有相互依赖的关系。这样,就可以保证A、B、C、D四个不同的部分对于高清版的选择是一致的。

8

图7. 基于PixelCNN的解决图像超清问题的CNN网络结构。其中先验网络(prior network)为PixelCNN;条件网络(conditioning network)为图像生成网络,其结构与作用同GAN中的生成网络、感知损失中的转换网络均类似。

模型架构如图7。其中条件网络是一个在低清图像的基础上生成高清图像的网络。它能以像素为单位独立地生成高清图像,如同GAN中的G网络,感知损失中的转换网络。而先验网络则是一个Pixel CNN组件,它用来增加高清图像像素间的依赖,使像素选择一致的高清细节,从而看起来更加自然。

那么Pixel CNN是如何增加依赖的呢?在生成网络的时候,Pixel CNN以像素为单位进行生成,从左上角到右下角,在生成当前像素的时候,会考虑之前生成的像素。

若加上先验网络和条件网络的混合, PixelCNN在生成图像的时候,除了考虑前面生成的像素,还需要考虑条件网络的结果。

总结

上述算法是图像超清问题中使用的较为典型的CNN结构,此外,还有很多其他的结构也达到了比较好的效果。随着CNN网络结构层次的日益加深,距离实用场景反而越来越远。譬如,基于GAN的网络结构的训练很难稳定,且结果具有不可解释性;基于PixelCNN的网络在使用中由于要在pixel级别生成,无法并行,导致生成效率极为低下。

更进一步地,从实用出发,可以在数据方向上进行进一步的优化。譬如,现在的算法输入图像都是由低清图像三次插值而来,那么,是否可以先用一个小网络得到的结果来作为初始化的值呢?再如,多个小网络串联是否能得到比一个大网络更好的结果等等。