首发于AI Insight
通过文字描述来生成二次元妹子!聊聊conditional GAN与txt2img模型

通过文字描述来生成二次元妹子!聊聊conditional GAN与txt2img模型

一、一个神奇的网站

前些日子在Qiita上看到了一篇神奇的帖子:Girl Friend Factory - 機械学習で彼女を創る - - Qiita。帖子里面提到利用GAN,通过文字描述来生成二次元图像。这篇文章的作者还把他的想法搭建成了一个网站(网站地址:Girl Friend Factory),大概长下面这样:

我之前写过一篇文章介绍了如何利用GAN生成简单的二次元人物头像,但那只是完全的随机生成,你无法控制生成出的人物的属性。而这篇Qiita的帖子不一样,我们可以指定生成人物的属性,如发色、眼睛的颜色、发型,甚至是服装、装饰物,从而生成具有指定属性的图像。

这个网站提供的属性非常多,我简单地把它们翻译了一下:

我会在后面详细地介绍它的实现原理,在那之前,我们先来试着玩一玩这个网站。

进入网站后,首先要等待模型加载(注意:这个网站国内可能出现连接不上的问题,需要自行解决。另外网站大概会下载70M左右的模型,需要耐心等待。)加载好后,点击上方的“無限ガチャ”(無限ガチャ实际上是“无限扭蛋器”的意思),就可以进行生成了。

先生成一个金发+碧眼,多次点击生成按钮可以生成多个,效果还可以:

再生成黑发+碧眼试试:

右击图像可以“注册为喜欢”,实际上就是一个收藏的功能。收藏之后可以"生成一覧"中找到。

另外,收藏图片后,点击上方的"属性モーフィング"还可以对属性做微调,如这里我可以更改发色:

点击上方的"合成"按钮,你甚至可以把两个人物合成同一个!如下图所示:

(注意:这个网站还不是很成熟,有时会出现生成的图片崩坏的情况)

二、基本原理

上面的网站的原理是什么呢?原作者也提到了,其实就源于Generative Adversarial Text to Image Synthesis这篇论文。接下来就一起看一下它是怎么做的。

我们的目标实际上是通过“文字”生成“图像”。为此我们需要解决以下两个问题:

  1. 如何把文字描述表示成合适的向量。
  2. 如何利用这个描述向量生成合适的图片。

其中,第一个问题是用了之前一篇论文中的技术(arxiv.org/abs/1605.0539),这里就不细讲了。这里就假设文字描述为t,我们可以通过一个函数\varphi将其转换为一个向量\varphi(t)

第二个问题,如何利用向量\varphi(t)生成合适的图像?这就是GAN的工作,文中GAN的结构如下图所示:

对比原始的GAN结构,这里对生成网络G和判别网络D的输入部分做了更改:

  1. 对于图像生成网站G,原来是接收一个无意义的噪声z,输出一个图像G(z)。而这里不仅接收噪声z,还接收文字描述向量\varphi(t),用这两部分共同生成一个图像G(z, \varphi(t))
  2. 对于判别网络D,原来是接收图像x, 输出打分D(x),现在不仅接收图像x,还接收文字描述\varphi(t)。最后输出打分D(x, \varphi(t))

这实际上就是一个条件GAN(conditional GAN)。对照原始的GAN,只有几个简单的修改。到了这里,就可以直接训练了,也可以完成我们文字 -> 图片的生成任务。但是直接训练的生成图片的质量不是很好,对此作者又提出了两点改进。

三、改进一:GAN-CLS(针对判别器D的改进)

为什么直接训练的效果不好?仔细想一下,我们会发现,在原始的GAN中,判别网络D只需要做一件事情,即判断生成的图片是否正常。但在这里,判别网络D需要做两件事情,一是和原来一样,判断图片是否正常,二是判断生成的图片是否符合文字描述。

因此,我们可以对原来的训练步骤做一些改进。不仅给D提供生成的图片和真实的图片两类样本,还给D提供真实图片 + 虚假描述的样本,强化D的训练效果,强迫D判断生成的图片是否真的符合文字描述。具体的训练步骤如下:

我们可以看到,D的梯度由三部分构成:s_r, s_w, s_fs_r是真实图片+正确文字。s_w是真实图片 + 错误描述。s_f是G生成的图片 + 正确描述。这样就可以加快D的训练进程,提高训练效率。

四、改进二:GAN-INT(针对G的改进)

要理解这部分改进,首先要明白,G的训练梯度只和s_f有关(见上面的图片)。s_f是什么呢?它只和G生成的图片和正确的文字描述两项有关系。注意到s_f是和真实图片无关的,只和文字描述有关。对于文字描述,我们可不可以用一种方法,增加它的样本数呢?

答案是可以,因为我们只用到了文字描述的嵌入\varphi(t),在嵌入空间中我们是可以做一些简单的加减运算来增加样本数的。

设一个文字描述是\varphi(t_1),另一个文字描述是\varphi(t_2),我们可以得到他们的一个内插值\beta\varphi(t_1) + (1-\beta)\varphi(t_1)。其中0<\beta<1。这样的内插实际上是得到了两个文字描述的某种“中间态”,为我们增加了样本数量。


我们知道,对于深度学习,样本数量越多,效果就会越好,所以这里的GAN-INT是对效果的提升有帮助的,实验中验证了这一点。

作者把上面的两种改进合在一起,就成了GAN-INT-CLS,也是这篇文章的最终方法。

放一张论文作者实验的图,他是做了花的生成,最上面一行是Ground Truth,下面依次是GAN,GAN-CLS,GAN-INT,GAN-INT-CLS:

五、参考资料

注:本文首发于雷锋网
编辑于 2017-03-08

文章被以下专栏收录