在韩国首尔举办的ICCV 2019会议上,SinGAN: Learning a Generative Model from a Single Natural Image获得最佳论文奖,作者来自以色列理工学院(Technion)和谷歌(Google)。
我们知道,一般来说训练GAN来生成图像,至少需要有成千上万的训练数据才可能有不错的效果。
从名字上来看,SinGAN只需要单张自然图像,就可以训练一个生成式模型,单从这一点就足够吸引眼球。
事实上,在SinGAN之前已经有很多工作尝试使用单张图像训练生成式模型,但这些工作大多是条件式生成模型,只能完成某种特定的图像到图像的转换任务(如超分辨率等),另外一些非条件式生成模型也只局限在纹理这样简单结构的图像生成上。
SinGAN是第一个非条件式的、使用单张自然图像训练的生成式模型。也就是说,训练后的SinGAN可以接受一个随机噪声的输入,生成新的自然图像。
对于SinGAN的生成效果,论文中有一句话来总结描述:“SinGAN可以生成新的具有真实感的图像样本,在保留了原始的图像块分布的基础上,创造了新的物体外形和结构”。听不懂没关系,耳听为虚眼见为实:
每行中最左边是用来训练的图像,右边四张是随机生成的图像。
说人话,就是SinGAN可以生成与训练图像相似场景下,物体排布略有不同的真实图像。
看到这里,是不是觉得SinGAN也就那回事了,没什么厉害的?非也。
一方面从生成效果上来说,(至少作者挑出来展示的这些例子)确实能够以假乱真;
另外其设计思路之精巧,有很高的借鉴价值;
最后,我们会提到它在各种图像操作任务上都有着很好的应用,SinGAN会像两年前的Mask R-CNN一样,成为这些任务新的baseline。
这就是为什么我认为SinGAN这篇文章值得一读,欢迎读者们和我一起,一窥其奥妙。
如无特别说明,我们下面提到的GAN是Ian Goodfellow等人在Generative Adversarial Nets中所描述的GAN。
简单地说,GAN可以在一个数据集上以无监督的方式进行训练,进而可以生成与原数据集中样本相似的新样本。如下图,a)图中的GAN在手写数字数据集MNIST上训练,b)图在人脸数据集TFD上训练。黄框中的图像为训练数据集中的图像,其余为GAN生成的图像。
我们知道,对于一个随机变量X,假设它属于某个分布(如下图的input distribution);对于任意X的函数g(X),它依然是一个随机变量,并且属于某个新的分布(如下图的output distribution)。
GAN就做了这么一个分布变换的事情,它将一个均匀分布/高斯分布,通过一个参数为theta的神经网络建模的复杂函数G,映射到一个新的分布,并且希望这个新分布尽量接近于训练数据的分布。
如果能够做到这一点,我们在均匀分布/高斯分布中随机采样,就可以基本等价于从真实数据分布中采样,进而得到接近真实数据的新样本。
为了知道变换后的分布是不是如我们所愿接近训练数据的分布,GAN引入了一个新的模块D,输入一个样本点x,输出D(x)代表着x是来自训练数据分布的概率。不难想象,对于一个完美的D,输入任何训练数据集中的数据,其输出应该是1。我们来总结一下GAN的两个模块:
神经网络G(Generator,生成器),作用是生成分布。输入属于均匀分布/高斯分布的随机变量z,输出G(z),其分布尽量接近真实数据分布。
神经网络D(Discriminator,判别器),作用是判别分布。输入数据点x,输出D(x)表示x属于真实分布的概率。
上面对于生成器和判别器功能的描述当然只是一个美好的愿景,我们需要训练它们尽量接近我们的期望。看下面这个损失函数:
其中D(x)表示D对于真实数据x的输出,D(G(z))表示D对于生成数据G(z)的输出。不难理解,D希望前者为1,后者为0,希望V(D,G)越小越好;而G希望后者为1,希望V(D,G)越大越好。G和D的“利益”产生了冲突,GAN就是通过二者的对抗过程进行训练。
GAN采取迭代式的训练方式。从D开始,固定G的参数,选取一批真实数据和一批生成数据,根据损失函数J(D)进行梯度回传与参数更新;接下来训练G,固定D的参数,选取一批生成数据,根据损失函数J(G)进行梯度回传与参数更新……以此循环往复。
这里注意,一定要从D开始优化,大家可以思考一下为什么。不难想象,在最理想的情况下,训练后的D无论对于真实图像还是生成图像,其输出都接近1/2,因为它已经无法分辨二者的真伪。
GAN以一种无监督的模式,隐式地估计了真实数据的分布。
经过多年的发展,基于GAN的生成式模型已经可以生成能以假乱真的高分辨率图像。
复习完了GAN,现在我们假设自己是SinGAN的作者,思考这样一个关键的问题:如何只用一张图像来训练GAN?大家可以跟着我的思路走下去:
我们之前提到,GAN估计了真实数据的分布。
一张图像是从真实数据分布中采样的一个样本点。
我们没法只通过一个样本点估计出原始分布。就好比现在有一个均值、方差都未知的正态分布,告诉你一个从该分布随机抽样的样本值,我们无法估计出原始分布的均值和方差。
一个直观的想法是,我们可以把这一张图像切成块,这样我们就有很多张图像了!
切成多大的块?
假设我们切成比较小的块。举个例子,对于200x200分辨率的图像,切成若干11x11的块。最多能切出多少个?三万多个。用这三万多个11x11的小图像块,训练一个GAN,生成接近真实的11x11分辨率的图像块。听着很靠谱?但我们不知道怎么把这些小块拼起来组成一张高分辨率的图像……
假设我们切成比较大的块。举个例子,对于200x200分辨率的图像,我们切成若干个150x150分辨率的块。最多能切出多少个?大约2500个。样本空间多大?256^(150x150x3)。样本空间相比我们拥有的样本数目来说太大了,换句话说,很难只用2500张图像训练就能生成分辨率高达150x150的真实图像(与此对比,MNIST数据集是分辨率28x28的二值图,训练数据都有55000张)。
11x11的图像块容易训练,但是捕捉的内容太细,对生成整体图像帮助不大;150x150的图像块描绘了图像的整体信息,但是又太难训练……
或许,我们可以先将图像缩小,再切出大图像块来训练。这样图像块分辨率低,容易训练,并且也保留了图像的整体信息。举个例子,对于原先200x200分辨率的图像,我们先降采样到40x40,再切成若干个11x11的块,能切出约800个,再用这800多个图像块训练GAN,生成的图像块应当保留了图像整体的布局信息。
虽然这样生成的图像很模糊,但我们已经有了一个整体的大致结构,只需要给图像上加上细节就可以了。不难想到,我们之前在原始图像上切出的11x11小图像块训练的GAN模型就有了意义,里面包含了我们目前所需要的细节信息。
再多加几个尺度进来,从最模糊的图像逐步加入细节。
我们有了SinGAN。
SinGAN使用多个GAN结构分别学习了不同尺度下分辨率11x11的图像块的分布,并从粗糙到细致、从低分辨率到高分辨率逐步生成真实图像。
如果理顺了之前的思路,上面这个架构图应该很好从整体上理解。SinGAN由N+1个GAN结构组成,从粗糙到精细分别为(GN, DN),…(G0, D0)。对于其中第i层,Gi学到了该尺度下11x11图像块的分布,并能够结合上一尺度的输出生成该尺度下的真实图像;Di能够判别一个11x11图像块是否是该尺度下的真实图像块。
你的第一反应一定是:说好的11x11图像块在哪里?我看到的网络的输入分明都是完整的图像啊?
没错,输入确实都是完整的图像,这里有一个非常精巧的结构设计:所有的G和D都拥有相同的网络结构,都由5组3x3的卷积组成,都拥有11x11的感受野。将一张图像输入一个拥有11x11感受野的网络,网络输出的每个位置的值,等价于原图以该位置为中心,大小为11x11的图像块输入网络后的输出值。(并不严谨,大家意会一下)不难理解,在这样的设计下,输入完整的图像,和把图像切成11x11的块分别输入,是等价的。
这个设计是我觉得SinGAN的所有设计里最精巧的部分。
要想知道G生成什么,先看D在判别什么。
对于第i层判别器Di,输入降采样r^i倍的训练图像xi(或生成图像x’i),设其大小为NxMx3。首先输出大小为NxM的矩阵,其中每个位置的值都表示了输入图像以该位置为中心11x11的图像块属于真实图像块的概率。
Di最终的输出是这NxM个值的算术平均值。用这种方式,Di判别了某个11x11图像块是否来自该尺度下真实的图像块分布。这种判别器叫做Markovian Discriminator,并不是SinGAN的原创工作。
终于来到了生成过程。输入噪声图zN,经过生成器GN,得到图像x’N;将x’N放大r倍后,连同另一个噪声图z(N-1)一起输入生成器G(N-1),生成细节更多的图像x’(N-1)……以此类推,直至经过生成器G0得到拥有丰富细节的图像x’0。形式化如下:
对于i<N,Gi输入一张噪声图和放大后的上一层生成器输出,作者采用了一种残差学习的方式。即将噪声图和图像叠加后输入网络,将网络输出与原图叠加后作为最终的输出。网络学习到的将是图像中缺失的细节信息。如下图所示:
SinGAN采用逐层训练的方式,从第N层(最粗糙的层)开始,每层训练结束后参数就固定下来,接着训练下一层,如下图所示:
SinGAN的损失函数形式如下:
损失函数由adversarial loss和reconstruction loss两部分组成。其中adversarial loss使用了WGAN-GP loss,可以认为是文初提到的GAN loss的升级版,可以提升训练稳定性。reconstruction loss的目的是希望存在一组随机噪声输入,最终输出的图像就是原图。为此,作者选取这组特定的随机噪声如下:
其中z*是训练前随机选取的一个值,之后不再改变。reconstruction loss形式化如下:
也就是说,希望以该组噪声作为输入的情况下,第i层生成器的输出与该层尺度下的原图之差的二范数尽可能小。个人认为reconstruction loss的引入很大程度上也是为了训练稳定性方面的考虑。
作者设定最粗糙尺度下,图像的最短边为25像素,尺度系数r尽量接近4/3,以此计算出尺度的数量N。
由于SinGAN中G和D网络是全卷积的,因此可以生成任意尺寸的图像:
还有一些fancy的高分辨率图像生成的例子:
SinGAN在许多图像任务上都有着很好的应用。
在一张低分辨率图像上训练SinGAN,不断将图像上采样并输入最精细级别的生成器中,可以达到超分辨率的效果。下图是SinGAN和其他超分辨率方法的效果对比。
在一张图像上训练SinGAN(第一列),将一张绘画风格的图像(第二列)输入某较粗糙尺度的生成器中,输出的结果将该绘画转换成了真实图像。下图是两个例子,以及和其他方法的对比。
下图比较了输入不同层所产生输出的区别。
在一张图像上训练SinGAN,将经过编辑(下例中为图像块的移动)的图像输入某中间尺度生成器,输出的结果恢复了图像的真实感。下图是SinGAN和Content Aware Move方法的对比。
下图比较了输入不同层所产生输出的区别。
在一张图像上训练SinGAN(如下图梵高的《星夜》)。在图像中加入“不和谐”因素(如一个非常“不和谐”的飞船),输入某中间尺度生成器后,输出的结果实现了图像整体风格的和谐化。下图是两个例子以及和Deep Paint Harmonization方法的对比。
下图比较了输入不同层所产生输出的区别。
SinGAN的局限性主要表现在:
第一,当图像块的差异较大时,无法学到很好的分布,容易导致不真实的现象出现。下图中人脸图像就是很好的例子,直接使用人脸图像训练SinGAN,生成的图像非常不真实(n=N列)。后两列是将原图降采样后输入N-1层和N-2层产生的输出结果,虽然不真实感有所降低,但图像和原图的差异也变得非常小。
第二,生成图像的内容高度受限于训练图像提供的语义信息,换句话说就是“创造性”较差。
SinGAN虽然有着明显的局限性,但是其局限性基本可以认为来源于其“单张图像训练”的设定。
瑕不掩瑜,SinGAN在设计上有很多值得我们借鉴的精巧之处,个人认为SinGAN被评为最佳论文可以说是实至名归。
希望这篇文章可以让大家更好地理解SinGAN的思想,为手头的研究工作提供新的可借鉴的思路。
— 完 —
大咖齐聚!量子位MEET大会精彩回放
量子位 MEET 2020 智能未来大会精彩回放来袭!李开复、倪光南、景鲲、周伯文、吴明辉、曹旭东、叶杰平、唐文斌、王砚峰、黄刚、马原等AI大咖与你一起读懂人工智能。扫码观看回放吧~ ~
跟大咖交流 | 进入AI社群
量子位 QbitAI · 头条号签约作者
վ'ᴗ' ի 追踪AI技术和产品新动态
喜欢就点「在看」吧 !