StackGAN

《StackGAN:Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks》

github

StackGAN_第1张图片

在先前的CGAN中,我们将描述文本作为条件分别输入生成器和判别器,用来实现Text-to-Image。但是通常得到的图像都是只包含了描述文本中的基本特征,并不能很好地表现出文本中的细节部分,因此分辨率很低。那么如何根据一段描述性文本生成一张高分辨率的图像呢?这就是本文StackGAN所要做的事,它可以根据给定的描述文本,生成一张 256 × 256 256\times 256 256×256 的高分辨率的图像。

它采用了一种逐步递进的思想,将高分辨率图像的生成分为两个阶段来操作。首先在第一个阶段描绘出图像的基本轮廓和相关的颜色分布;第二阶段根据给定的文本和第一阶段生成的低分辨率图像,纠正低分辨率图像中的缺陷,并添加更多的细节,使的生成的图像更接近真实,分辨率更高。

同时为了提高生成图像的多样性,加强训练过程的稳定性,作者还提出了一种新的条件增强技术。通过多个实验证明,StackGAN在多个数据集上的效果都由于其他的GANs。


贡献

作者指出本文的贡献主要在以下三个方面:

  • 提出了StackGAN,实现了根据描述性文本生成高分辨率图像
  • 提出了一种新的条件增强技术,增强训练过程的稳定性、增加生成图像的多样性
  • 通过多个实验证明了整体模型以及部分构件的有效性,为后面的模型构建提供了有益信息

StackGAN

StackGAN将Text-to-Image这项工作分为了两个阶段来执行:

  • Stage-I GAN:根据给定的文本描绘出主要的形状和基本颜色组合;并从随机噪声向量中绘制背景布局,生成低分辨率图像
  • Stage-II GAN:修正第一阶段生成的低分辨率图像中的不足之处,再添加一些细节部分,生成高分辨率图像

下面我们来看一它的架构:


StackGAN_第2张图片


Conditioning Augmentation

在此之前,先来看一下它所提出的条件增强技术是怎么回事。如上图所示,在第一阶段开始时刻,文本描述 t t t首先经编码器编码得到描述文本的嵌入向量 ψ t \psi_{t} ψt。在此之前,处理这个问题的方法通常是将其非线性的转换成条件的隐变量输入到G中,但是这样做有一个很大的问题,通过因为隐变量所在的空间维度很高,在数据量有限的情况下,它会造成数据流形上的不连续性,不易用来训练G。

所以为了缓解这个问题,作者提出了一种新的条件增强技术,它会利用 ψ t \psi _{t} ψt生成一个新的条件标量 c ^ \hat{c} c^ ,代替 ψ t \psi_{t} ψt输入到G中。其中 c ^ \hat{c} c^ 是从 N ( μ ( ψ t ) , Σ ( ψ t ) ) N(\mu(\psi_{t}),\Sigma(\psi_{t})) N(μ(ψt),Σ(ψt)) 中随机采样得到,其中 μ ( ψ t ) , Σ ( ψ t ) \mu(\psi_{t}),\Sigma(\psi_{t}) μ(ψt),Σ(ψt)都是关于 ψ t \psi_{t} ψt的函数。通过这样的方式就可以在一定程度上缓解图像文本配对数据很少时的尴尬,而且也有助于增强对条件流形上的小扰动的鲁棒性,即当描述文本变化不大时,生成的图像不至于差别很大。

为了进一步的增强多样性、数据流形上的平滑性以及避免过拟合的出现,作者还添加了如下的正则化项: D K L ( N ( μ ( ψ t ) , Σ ( ψ t ) ) ∣ ∣ N ( 0 , I ) ) D_{KL}(N(\mu(\psi_{t}),\Sigma(\psi_{t}))||N(0,I)) DKL(N(μ(ψt),Σ(ψt))N(0,I))它代表了我们随机采样的高斯分布和标准高斯分布之间的KL散度,这样做有利于对问题的建模,根据一段固定的描述生成更多样性的图像。


公式化理解

下面我们通过公式来理解一下它的整个过程。我们知道在 Vanilla GAN中它的目标函数为:
min ⁡ G max ⁡ D V ( G , D ) = E x ∼ p d a t a ( x ) l o g D ( x i ) + E x ∼ p z ( z ) l o g ( 1 − D ( G ( z i ) ) ) \min \limits_{G} \max \limits _{D} V(G,D)=E_{x \sim p_{data}(x) } logD(x_{i})+E_{x \sim p_{z}(z)}log(1-D(G(z_{i}))) GminDmaxV(G,D)=Expdata(x)logD(xi)+Expz(z)log(1D(G(zi)))
CGAN在此基础上做了改进,对于G和D都添加了一个条件 y y y ,使其可以根据条件生成指定的图像,目标函数为:
min ⁡ G max ⁡ D V ( G , D ) = E x ∼ p d a t a ( x ) l o g D ( x i ∣ y ) + E x ∼ p z ( z ) l o g ( 1 − D ( G ( z i ∣ y ) ) ) \min \limits_{G} \max \limits _{D} V(G,D)=E_{x \sim p_{data}(x) } logD(x_{i}|y)+E_{x \sim p_{z}(z)}log(1-D(G(z_{i}|y))) GminDmaxV(G,D)=Expdata(x)logD(xiy)+Expz(z)log(1D(G(ziy)))

  • stackGAN的第一阶段 G 0 G_{0} G0 D 0 D_{0} D0 的目标函数如下所示,和Vanilla GAN中的思想是一致的,即G生成更逼真同时符合文本描述的低分辨率图像,D尽可能的判别出真实图像和生成图像
    L D 0 = E ( I 0 , t ) ∼ p d a t a [ log ⁡ D 0 ( I 0 , ψ t ) ] + E z ∼ p z , t ∼ p d a t a [ log ⁡ ( 1 − d 0 ( G 0 ( z , c ^ 0 ) , ψ t ) ) ] L_{D_{0}}=E_{(I_{0},t)\sim p_{data}}[\log D_{0}(I_{0},\psi_{t})]+E_{z\sim p_{z},t \sim p_{data}}[\log (1-d_{0}(G_{0}(z,\hat{c}_{0}),\psi_{t}))] LD0=E(I0,t)pdata[logD0(I0,ψt)]+Ezpz,tpdata[log(1d0(G0(z,c^0),ψt))] L G 0 = E z ∼ p z , t ∼ p d a t a [ log ⁡ ( 1 − D 0 ( G 0 ( z , c ^ 0 ) , ψ t ) ) ] + λ D K L ( N ( μ 0 ( ψ t ) , Σ 0 ( ψ t ) ) ∣ ∣ N ( 0 , I ) ) L_{G_{0}}=E_{z\sim p_{z},t\sim p_{data}}[\log (1-D_{0}(G_{0}(z,\hat{c}_{0}),\psi_{t}))]+\lambda D_{KL}(N(\mu_{0}(\psi_{t}),\Sigma_{0}(\psi_{t}))||N(0,I)) LG0=Ezpz,tpdata[log(1D0(G0(z,c^0),ψt))]+λDKL(N(μ0(ψt),Σ0(ψt))N(0,I))
    其中 I I I 表示真实图像, λ \lambda λ 这里是一个正则化系数,平衡 L G 0 L_{G_{0}} LG0 中的两项。那么自然G的目标是 min ⁡ L G 0 \min L_{G_{0}} minLG0 ,D的目标是 max ⁡ L D 0 \max L_{D_{0}} maxLD0

  • stackGAN的第二阶段,根据第一阶段的输出和描述文本,完成低分辨率图像中忽略的细节部分,生成更接近真实的高分辨率图像,这里将第一阶段的输出记为 s 0 = G 0 ( z , c ^ 0 ) s_{0} = G_{0}(z,\hat{c}_{0}) s0=G0(z,c^0),那么对于第二阶段的G和D来说,同样的思想,它们的目标函数为:
    L D = E ( I , t ) ∼ p d a t a [ log ⁡ D ( I , ψ t ) ] + E s 0 ∼ p G 0 , t ∼ p d a t a [ log ⁡ ( 1 − D ( G ( s 0 , c ^ 0 ) , ψ t ) ) ] L_{D}=E_{(I,t)\sim p_{data}}[\log D(I,\psi_{t})]+E_{s_{0}\sim p_{G_{0}},t \sim p_{data}}[\log (1-D(G(s_{0},\hat{c}_{0}),\psi_{t}))] LD=E(I,t)pdata[logD(I,ψt)]+Es0pG0,tpdata[log(1D(G(s0,c^0),ψt))] L G = E s 0 ∼ p G 0 , t ∼ p d a t a [ log ⁡ ( 1 − D ( G ( s 0 , c ^ 0 ) , ψ t ) ) ] + λ D K L ( N ( μ ( ψ t ) , Σ ( ψ t ) ) ∣ ∣ N ( 0 , I ) ) L_{G}=E_{s_{0}\sim p_{G_{0}},t\sim p_{data}}[\log (1-D(G(s_{0},\hat{c}_{0}),\psi_{t}))]+\lambda D_{KL}(N(\mu(\psi_{t}),\Sigma(\psi_{t}))||N(0,I)) LG=Es0pG0,tpdata[log(1D(G(s0,c^0),ψt))]+λDKL(N(μ(ψt),Σ(ψt))N(0,I))
    这里在G的输入中并没有噪声 z z z ,是因为假设在第一阶段的输出 s 0 s_{0} s0 保存了之前输入的噪声信息。其中 c ^ 0 \hat{c}_{0} c^0 ψ t \psi_{t} ψt 和第一阶段中使用的相同,但是通过不同的网络架构来产生不同的高斯分布中的均值和标准差。它的目标同样是G要 min ⁡ L G \min L_{G} minLG ,D要 max ⁡ L D \max L_{D} maxLD

具体的G和D中的网络架构如上图所示,详细的配置可见原论文。


实验

为了进行效果的对比,作者这里选择了之前实现Text-to-Image的两个相关方法GAN-INT-CLS和GAWWN进行比较。另外设计实验证明了StackGAN各部分的有效性,以及验证了在每个阶段输入文本的必要性。

使用了如下两个评估方式:

  • Inception Score:它表示一个好的模型应该可以生成多种含义丰富的图像,那么括号中的KL散度应该大一些。它的定义式为
    I = e x p ( E x D K L ( p ( y ∣ x ) ∣ ∣ p ( y ) ) ) I = exp(E_{x}D_{KL}(p(y|x)||p(y))) I=exp(ExDKL(p(yx)p(y)))

  • 人类评估:让人去分辨最后的结果的好坏

例如根据文本生成鸟的图像,实验结果如下

StackGAN_第3张图片

从中我们可以看出StackGAN生成的图像更加的真实、清晰,更加符合文本的描述。而且从定量评估来看,StackGAN相比于其他的模型,它的IS和Human rank得分更高,同样可以证明它的效果要优于其他的方法。


StackGAN_第4张图片

在评估StackGAN各成分的重要性的实验中,我们可以看出,使用了条件增强技术的GAN,生成的图像更加的多样性,更加的符合真实情况。


StackGAN_第5张图片

另外针对不同的阶段使用使用CA,以及是否给G和D文本信息也做了实验,结果如下所示


StackGAN_第6张图片

从中我们可以清晰的看出使用CA和对G和D都输入文本会很好的提升模型的效果。但是作者同时提出,如果我们StackGAN仅仅是增大图像的尺寸,而不增加额外的信息,则IS会保持在一个值附近。

更多的实验结果可见原论文。

P.S.纯属个人理解,如有不对还望斧正,谢谢~~

补充(2019.6.26)

StackGAN是一个在GAN的发展过程中具有重要意义的模型,它为我们生成高质量的图像提供了一种很好的思路,即两阶段的生成方式,先根据描述文本生成低分辨率的图像,然后在下一阶段再根据前一阶段生成的低分辨率图像和文本生成最终高分辨率的图像。

那么为什么这样两阶段的生成方式可行呢? 作者在文中的Introduction部分给出了一种解释:在高维的像素空间中,真实图像所满足的分布和模型所表示的分布也许没有交叠部分,根据14年的《Generative Adversarial Nets》可以知道,如果两个分布之间没有交叠的部分,那么就无法通过最小化两个分布的KL散度来训练模型,那么GAN的训练将会很难。而作者认为直接计算真实高分辨率图像所满足的分布和模型表示的分布之间的KL散度也许不容易,那么我们先计算低分辨率图像所满足的分布和模型标识的分布之间的KL散度,它们之间有更大的可能有交叠的部分;而低分辨率图像所满足的分布和高分辨率图像所满足的分布之间也有很大的概率有交叠的部分,这样模型的训练相对就容易一些,同时也可以生成高分辨率的图像。

另一个问题是为什么条件增强技术(Conditional Augmentation)可以实现增加数据流形的平滑性、增强模型的鲁棒性和提高生成图像的多样性呢? 作者认为在实际的训练中,我们能使用的文本-图像配对数据相对较少,那么它们在数据流形上表示就很稀疏,连续性很差,使得模型的训练很难。而使用了CA之后,由于我们不再是从一个个独立的点采样,而是从某个高斯分布中进行采样,这样就使得文本描述相差不多的可以对应同一幅图像,从而增加了文本-图像配对样本的数据量,在一定程度上缓解了流形上的表示的稀疏性,有助于更容易的训练模型。

你可能感兴趣的:(Deep,Learning,GAN)