45

T2F:所述即所见,使用深度学习,文本一键生成人脸

 5 years ago
source link: https://www.leiphone.com/news/201807/lGpGQyWPzdJ0Q7Pj.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

雷锋网按:本文为雷锋字幕组编译的技术博客,原标题 T2F: Text to Face generation using Deep Learning,作者为 Animesh Karnewar。

翻译 | 赵朋飞    整理 |  凡江

2iAjuuq.jpg!web

由 T2F 基于相应的描述生成的示例图像

项目的代码可以在我的版本库获得: https://github.com/akanimax/T2F

简介

阅读小说时,我经常好奇小说中描述的角色在现实中会是怎样的。从整体想象任务角色是可行的,但要将描述变为更为深刻的细节是相当有挑战的,而且经常不同的人有不同的解释。很多时候,我只能想象到一个非常模糊的面孔,直到故事的结尾。只有书本被翻译成电影时,模糊的面孔才会被细节所填满。例如,我无法想象《列车上的女孩》中 Rachel 的具体长相。但当这部电影播出时,我可以将 Emily Blunt 的脸和 Rachel 联系起来。演员们肯定付出了很多努力才能从剧本中准确获得角色。

VbMf6vb.jpg!web

这个问题激发了我的灵感,激励我去寻找解决问题的办法。之后,我们开始通过研究深度学习文献寻找类似的东西。幸运的是,有大量的从文本中合成图像的研究可供参考。下面是我参考的一些资料。

  1. https://arxiv.org/abs/1605.05396 「Generative Adversarial Text to Image Synthesis」

  2. https://arxiv.org/abs/1612.03242 「StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks」

  3. https://arxiv.org/abs/1710.10916 「StackGAN++: Realistic Image Synthesis with Stacked Generative Adversarial Networks」

通过研究文献资料,我提出了一种比 StackGAN++更简单的架构,并且很容易解决问题。在随后的章节,我将解释所做的工作并分享到目前为止获得的初步结果。我也将提到一些代码和训练细节,这些花费了我很多时间才弄清楚。

数据分析

用于创建深度学习模型的数据毫无疑问是最原始的人工制品:正如吴恩达教授在他的 deeplearning.aicourses 上所说「在机器学习领域成功的人并不是哪些拥有优秀算法的人,而是拥有优秀数据的人」。因此,我开始寻找一组有漂亮、丰富和多样的文本描述的脸部数据集。我偶然发现了大量的数据集要么仅仅只有人脸,要么是人脸和 ID(用于识别),要么是含有其他信息的人脸数据,比如眼睛颜色:蓝,脸型:椭圆,头发:金色,等。但这都不是我所需要的。我最终的选择是使用一个早期的项目(从结构化数据中生成自然语言描述),在这个早期的项目中实现了从结构化数据生成自然语言摘要。但这会对已经充满噪声的数据集再增加噪声信息。

随着时间的流逝和研究的进展,提出了 Face2Text:收集一个带注释的图像描述语料库,用于生成丰富的面部描述:这就是我想要的。特别感谢 Albert Gattand Marc Tanti 提供了 Face2Text 数据集的 v1.0 版本。

Face2Text v1.0 版本数据集包含 400 个随机从 LFW(自然环境下已标记的人脸数据)选择的图像的自然语言描述。这些描述被清理干净,去除了那些对图片中人物的不相关的说明。其中一些描述不只描述了脸部特征,也提供了一些图片的隐藏信息。例如,其中一个脸部描述:「照片中的人可能是一个罪犯」。基于这些因素,以及数据集相对较小,我决定使用它证明我的架构。最终,我们可以扩展这个模型,并灌输更大、更多样的数据集。

架构

YnMfqmM.jpg!web

从文字描述中生成人脸的 T2F 架构

T2F 架构结合了 2 个 stackGAN 架构(之前已提到),使用条件增强的文本编码和 ProGAN(衍生自 GAN),用于合成面部图像。原始的 stackgan++ 架构在不同的空间分辨率下使用了多个 GAN,我发现对于任何给定的分布式匹配问题,都是有点过分了。而 ProGAN 仅使用一个 GAN,通过不断增加分辨率来逐步训练。所以我决定将这两部分结合起来。

为了更好解释网络中的数据流,这里有一些要点:通过 LSTM 网络嵌入(psy_t)将文本描述编码成摘要向量,如框图所示。嵌入被传入条件增强模块(单独线性层)以获取隐向量的文本部分(使用类似于重新参数化技术的 VAE)作为 GAN 输入。隐向量的第二部分是随机高斯噪声。隐向量输入 GAN 的生成模块,而嵌入被输入到鉴别器最后一层用于条件增强匹配。对 GAN 的训练正如 ProGAN 论文中提到的一样;即一层一层地增加空间分辨率。新层是使用 fade-in 技术引入的,以避免破坏以前的学习。

实现和其他细节

该架构是使用 PyTorch 框架在 python 中实现的。我之前使用 tensorflow 和 keras,所以这次我想尝试一下 PyTorch。我非常喜欢使用 python 本地调试器来调试网络架构;这是 eager execution 策略的优势。TensorFlow 目前也包含一个 eager execution 模式。不管怎样,这不是一个关于哪个框架更好的辩论,我只是想强调一下这个体系结构的代码是用 PyTorch 写的。你可以在我的 github repo 上找到代码实现和如何执行的笔记, https://github.com/akanimax/T2F

我发现这个架构的很多部分是可以重用的。特别是 ProGAN(有条件或无条件的)。因此,我将他们作为 PyTorch 模块扩展单独编写,也可以用于其他数据集。您只需要指定 GAN 的深度和最新/特性大小,模型就会产生适当的架构。对于任何您可能想要的数据集,GAN 都可以逐步接受训练。

训练细节

我使用不同的超参数训练了相当多的版本。如前一节所述,与训练有关的细节如下:

  1. 因为,在鉴别器中没有 batch-norm 或 layer-norm 操作,WGAN-GP 损失(用于训练)可能会激增。为此,我使用了 lamda=0.001 的漂移惩罚。

  2. 为了控制从编码文本中产生的潜在的流形,我们需要使用 KL 散度(在 CA 的输出和标准正态分布之间)在生成器的损失中。

  3. 为了使生成的图像更好地符合输入文本的分布,使用匹配鉴别器的 WGAN 变体是有帮助的。

  4. 对于较低层次的层,需要的 fade-in 时间比在底层的时间要多。为了解决这个问题,我使用了一个百分比(确切地说,是 85%),在训练的时候,它会在新层上增加。

  5. 我发现,与较低分辨率的样本相比,更高分辨率(32 x 32 和 64 x 64)生成的样本具有更多的背景噪声。我认为这是由于数据量不足导致(只有 400 张图片)。

  6. 对于渐进训练,在较低的分辨率下花费更多的时间(更多的时间),并为更高的分辨率减少适当的时间。

下面的gif显示了生成器的训练时间延迟。该gif是使用 GAN 在不同空间分辨率下训练过程中产生的图像创建的。

7RZF3qY.gif

T2F 训练时间延迟

结论

从初步结果中,我可以断言 T2F 是一个可行的项目,有一些非常有趣的应用。例如,T2F 可以帮助从描述中识别出罪犯/受害者。基本上,我们需要一些领先的方面来激发想象力的应用。我将致力于扩展这个项目,并在 Flicker8K 数据集、Coco 标题数据集等方面对其进行基准测试。欢迎提出建议。

GAN 的逐步增长是一种非凡的技术,可以更快、更稳定地训练 GAN。这可以与其他论文的新颖的贡献相结合。应用约束 GAN 训练的技巧,我们还可以在许多领域使用 GAN。

原文链接: https://medium.com/@animeshsk3/t2f-text-to-face-generation-using-deep-learning-b3b6ba5a5a93

36neMbE.jpg!web

雷锋网雷锋网 (公众号:雷锋网)

雷锋网原创文章,未经授权禁止转载。详情见 转载须知


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK