允中 发自 凹非寺 量子位编辑 | 公众号 QbitAI
前几天发布的一篇文章中我们曾提到国外的AI捏脸应用FaceApp引发大量关注。它能让人一键变成老人,一键返老还童,一键由男变女,一键破涕为笑,一键失去头发……

福布斯报道说,它在Google Play的下载量已经超过了1亿。
苹果用户也同样热情,App Annie数据显示,目前在121个国家的iOS商店排名第一。
看起来,这是一种神奇的黑科技,但是实际上,揭开神秘的面纱,技术本身并非遥不可及。从GAN的角度来探索解决这类问题,能做到什么样呢?
现在,飞桨核心框架Paddle Fluid v1.5宣布开源了 PaddleGAN图像生成库 ,为用户提供易上手的、一键式可运行的GAN模型。
飞桨(PaddlePaddle)致力于让深度学习技术的创新与应用更简单。生成式对抗网络(GAN)近年来被广泛应用于无监督学习任务以及生成任务中,通过让两个神经网络相互博弈的方法进行学习,常用于生成以假乱真的图片、影片、三维物体模型等。欢迎大家来体验~
下面送上真·干货(附代码)!
1.效果实测
以下效果均采用百度与哈工大联合开发的STGAN模型在飞桨开源的实现


看到标签是“Bald”的变脸照片,是不是很多读者感受到了一种来自骨髓的凉意,大家多保重!
2. PaddleGAN支持的模型与任务
PaddleGAN图像生成模型库覆盖当前主流的GAN算法,可简单上手各类GAN任务,也方便扩展自己的研究。
Pix2Pix和CycleGAN采用cityscapes数据集进行风格转换,StarGAN,AttGAN和STGAN采用celeba数据集对图片进行局部或者整体的属性修改。
STGAN 是由百度和哈工大联合研发的模型,提出STGAN方法用于图片/视频的端到端属性转换。对传统方法提出了两点改进,在celebA数据集上转换效果好于已有的方法:
- 在自编码网络结构中引入选择性属性编辑单元强化了属性编辑的效果。
- 提出了将基于属性标签替换为基于属性更改的训练机制。
3. 预训练模型
本次PaddleGAN总共开源5个预训练模型。安装好飞桨环境后,可以下载预训练模型快速验证推理效果。
每个GAN都给出了一份测试示例,放在scripts文件夹内,用户可以直接运行测试脚本得到测试结果。
执行以下命令得到CyleGAN的预测结果:
python infer.py \
--model_net=CycleGAN \
--init_model=$(path_to_init_model) \
--image_size=256 \
--dataset_dir=$(path_to_data) \
--input_style=$(A_or_B) \
--net_G=$(generator_network) \
--g_base_dims=$(base_dim_of_generator)
执行以下命令得到Pix2Pix的预测结果:
python infer.py \
--model_net=Pix2pix \
--init_model=$(path_to_init_model) \
--image_size=256 \
--dataset_dir=$(path_to_data) \
--net_G=$(generator_network)
执行以下命令得到StarGAN,AttGAN或者STGAN的预测结果:
python infer.py \
--model_net=$(StarGAN_or_AttGAN_or_STGAN) \
--init_model=$(path_to_init_model)\
--dataset_dir=$(path_to_data)


4. 一键式的训练和测试生成网络
数据准备
模型库中提供了download.py数据下载脚本,该脚本支持下载MNIST数据集(CGAN和DCGAN所需要的数据集)以及CycleGAN和Pix2Pix所需要的数据集,使用以下命令下载数据:python download.py —dataset=mnist 通过指定dataset参数来下载相应的数据集。
StarGAN, AttGAN和STGAN所需要的Celeba数据集需要用户自行下载。
自定义数据集:用户可以使用自定义的数据集,只要设置成所对应的生成模型所需要的数据格式即可。
注意 : pix2pix模型数据集准备中的list文件需要通过scripts文件夹里的make_pair_data.py来生成,可以使用以下命令来生成:python scripts/make_pair_data.py —direction=A2B,用户可以通过设置—direction参数生成list文件,从而确保图像风格转变的方向。
一键式启动
python train.py \
--model_net=$(name_of_model) \
--dataset=$(name_of_dataset) \
--data_dir=$(path_to_data) \