不用P图软件,TensorFlow pix2pix也能帮你打造出六块腹肌!

可视化结果是十分强大的。然而,在健身领域,要想清楚地看到未来的锻炼结果往往是很困难的。我们是否可以利用深度学习让人们更接近他们的个人健康目标,从而帮助他们设想未来的结果?

我们的想法是:采用有条件的生成对抗网络(GANs),虚构出一张一个人在经过健康饮食和锻炼的情况下未来的身材变化的图片。结果如下:

在这篇文章中,我将简要地介绍一下生成对抗网络。然后,我会提供一些指导,用于训练一个TensorFlow实现的模型,该模型使用GPU训练和部署平台FloydHub。

生成对抗的网络 2014年,Ian Goodfellow和其他一些人在蒙特利尔实验室首次提出了生成对抗网络(Generative Adversarial Networks),从那时起,他们就受到了很大的关注,因为他们说:

…在过去的10年里,最有趣的想法是进行机器学习。

生成模型是一种无监督的学习技能,它试图学习一些数据的分布(如语料库中的文字或在一张图片中物体的像素大小)。

生成对抗网络包含两个有相反目标的网络,以某种游戏的形式在它们之中寻求平衡。“生成器(Generator)”将一些采样于所谓的“潜在的空间(latent space)”的输入转换。“鉴别器(Discriminator)”只是一个分类器,它接收来自生成器和真实对象的输出,然后接受训练,以确定它所观察的输入是生成的还是真实的。

其基本思想是,当两个网络的性能都达到最佳时,生成器就会创建在各自的输出空间内分布的图像,就像鉴别器的实际输入一样。

一些流行的对抗网络架构是:

  • 深度卷积生成对抗网络(Deep Convolutional GANs),用来生成真实的图像。
  • 有条件的生成对抗网络(Conditional GANs),它学习了输出图像的分布,给出了对应用程序的成对输入,例如,图像与图像之间的转换。
  • 循环一致的生成对抗网络(Cycle-Consistent GANs),它可以在不需要成对输入的情况下学习图像与图像之间的映射。

生成对抗网络的一套全面的资源:https://github.com/nightrome/really-awesome-gan

这里有一个关于鉴别器的图表概述:

生成器的图表概述:

我们的实现

我们选择用一个有条件的生成对抗网络,学习成人男性在身材转换之间的映射。然后,我选择使用FloydHub而不是AWS EC2或谷歌云来计算和存储我的网络的调整权重,原因有很多:

  • 只需少数的几个简单的shell命令,在无需处理FTP的情况下,装载数据(mount data)的处理在FloydHub上是非常简单的。
  • 在无需请求或下载这些日志的情况下,日志与floyd-clicommand-line工具或者FloydHub网络仪表盘可以随时使用,并且操作十分容易。
  • 定价有竞争力。

装载数据:https://docs.floydhub.com/guides/data/mounting_data/

在FloydHub里运行着pix2pix的Tensorflow实现,需要对代码进行一些细微的调整,我将在这里详细说明,希望将来任何尝试类似项目的人都可以节省一些时间。

一个典型的训练命令,可以spin up一个FloydHub的云GPU训练服务器,看起来像下面这样:

floyd run --gpu --data rayheberer/datasets/dreamfit/4:/dreamfit_data 'python pix2pix.py --mode 
train --output_dir /output --max_epochs 200 --input_dir /dreamfit_data --which_direction AtoB
  • –data path:/dir装载了一个FloydHub数据集,并且使它在/dir上是可用的。
  • 保存输出,例如模型检查点(checkpoint),必须总是被储存到/output(这是一个重要的细节)。

Christopher Hesse的pix2pix实现是在Tensorflow 1.0.0中进行的,这意味着现在已经有的save_relative_pathsoption对tf.train.saver还没有实现。

此外,你应该意识到这一点,而不是从单一的.ckptfile中恢复。该模型将许多文件保存在训练期间指定的输出目录中,然后在测试或导出过程中选择作为检查点目录。

为什么这会成为一个问题? 因为在pix2pix.py中的第625行和725行中,使用tf.train.latest_checkpoint(a.checkpoint)来恢复对saver的参数,这将产生一个在FloydHub上的/output绝对路径。

因为在接下来在FloudHub工作中,检查点目录在后面的工作中不能被装载到/output中,该目录将被保留,当试图恢复模型时,会产生一个错误。

解决方法非常简单。对于一个更复杂的项目,我建议添加一个可以在命令中设置的附加参数,你可以简单地改变pix2pix.py中的第625行和725行:

例如,如果我要测试或导出一个名为model-99200的模型,只需将checkpoint = tf.train.latest_checkpoint(a.checkpoint)与checkpoint = r’/model/model-99200’替换,然后确保将数据装载在FloydHub上。

现在你应该能够测试训练过的模型了:

floyd run --gpu --data rayheberer/projects/burda-gan/6/output:/model 'python pix2pix.py --mode 
test --output_dir /output --input_dir test --checkpoint /model'

请注意值传递到–data和–checkpoint参数。另一个无需修改代码的快速解决方案是在运行推断之前预先填充输出目录,并使用预先训练过的检查点。

floyd run --gpu --data rayheberer/projects/burda-gan/6/output:/model 'cp /model/* /output; 
python pix2pix.py --mode test --output_dir /output --input_dir test --checkpoint /model'

结果可视化 成年男性的身材前后转换图像的映射有多成功呢? 看下图:

呵,不完全逼真的效果。但是考虑到我们只有不到150张训练图片,这些结果可能并不是那么糟糕!我使用了两种标准的数据扩充:随机剪裁和水平反射。我们也将之前的图像与未反射的之后的图像进行了配对,反之亦然,但是我们没有时间来测试这一改进的泛化是否仅仅是在反射和非反射图像之中相互配对的。这对于未来的项目来说是很有帮助的。

数据增强显然改善了我们的结果——下面是一些使用增强数据(下行)训练的模型,和没有使用增强数据的模型(上行):

训练这些模型可能还不够让它们完全收敛,但结果却很吸引人。我认为这些低保真生成的图像是一个像样的概念验证,生成对抗网络可以使用更大的数据集来进行商业应用。

原文发布于微信公众号 - ATYUN订阅号(atyun_com)

原文发表时间:2017-10-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张俊红

数学之美(二)

总第75篇 本篇为数学之美连载篇二,你还可以看:数学之美(一) 11|矩阵运算与文本处理: 无论是词汇的聚类还是文本的分类,都可以通过线性代数中的奇异值分解来进...

3135
来自专栏量子位

MobileNet教程:用TensorFlow搭建在手机上运行的图像分类器

王瀚宸 编译自 Hackernoon 量子位 报道 | 公众号 QbitAI 在移动端本地运行神经网络成了明显的趋势,Google还为此推出了MobileNet...

4327
来自专栏程序员宝库

AI 玩微信小游戏跳一跳的正确姿势,Auto-Jump 算法详解

来源:肖泰洪 + 安捷 链接:zhuanlan.zhihu.com/p/32636329 ? 最近,微信小游戏跳一跳可以说是火遍了全国,从小孩子到大孩子仿佛每...

3295
来自专栏PPV课数据科学社区

用TensorFlow实现神经网络很难吗?看完这篇详解,「小白」也可秒懂!

图:pixabay 作者:Faizan Shaikh 「机器人圈」编译:嗯~阿童木呀、多啦A亮 本文经公众号「雷克世界」授权转载(微信号:ROBO_AI) 如果...

3445
来自专栏机器之心

教程 | AI玩微信跳一跳的正确姿势:跳一跳Auto-Jump算法详解

37011
来自专栏新智元

【AI可能真的要代替插画师了】复旦同济用cGAN生成动画人物

【新智元导读】复旦大学、同济、CMU等的研究者使用cGAN生成各种属性的二次元人物头像,效果非常令人印象深刻。生成的图片质量非常之高,本文作者认为这项工作如果加...

2915
来自专栏人工智能头条

AI 可能真的要代替插画师了……

1253
来自专栏大数据文摘

数据挖掘比赛通用框架

2048
来自专栏机器之心

斯坦福提出机器学习开发新思路:无Bug的随机计算图Certigrad(已开源)

选自Github 机器之心编译 参与:李泽南、蒋思源 在实践中,机器学习算法经常会出现各种错误,而造成错误的原因也经常难以找到。近日,斯坦福大学的研究者提出了...

2607
来自专栏机器学习算法与Python学习

超参数优化,这些策略了解一下!

当然,并非所有变量对模型的学习过程都一样重要,但是,鉴于这种额外的复杂性,在这样一个高维空间中找到这些变量的最佳配置显然是一个不小的挑战。

883

扫码关注云+社区