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

2018-07-13    来源:raincent

容器云强势上线!快速搭建集群,上万Linux镜像随意使用
原标题 T2F: Text to Face generation using Deep Learning,作者为 Animesh Karnewar。

 

 

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

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

简介

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

 

 

图片来源:http://www.finalreel.co.uk/the-girl-on-the-train-release-date-2016/

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

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

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

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

架构

 

 

从文字描述中生成人脸的 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 都可以逐步接受训练。

训练细节

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

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

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

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

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

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

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

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

 

 

T2F 训练时间延迟

结论

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

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

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

标签: 代码 数据分析 网络

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:说说大数据智能

下一篇:人工智能产品越来越多,但当中有些是找人类假扮的