前几天量子位发布的一篇文章中曾提到国外的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) \
--train_list=$(path_to_train_data_list) \
--test_list=$(path_to_test_data_list) \
--batch_size=$(batch_size)
可选参数见python train.py —help
—model_net参数来选择想要训练的模型
—dataset参数来选择训练所需要的数据集
每个GAN都给出了一份运行示例,放在scripts文件夹内,用户可以直接运行训练脚本快速开始训练。
在快读实现之余,对于目前主流的GAN的开源模型,我们也需要一起了解一下。
5. 主流开源模型简介
STGAN
由百度和哈工大联合研发,在原有的ATTGAN基础上,引入GRU结构,更好的选择变化的属性,可用于人脸特定属性转换。
STGAN中生成网络在编码器和解码器之间加入Selective Transfer Units(STU),有选择的转换编码网络,从而更好的适配解码网络。
生成网络中的编码网络主要由convolution-instance norm-ReLU组成,解码网络主要由transpose convolution-norm-leaky_ReLU组成,判别网络主要由convolution-leaky_ReLU组成,详细网络结构可以查看network/STGAN_network.py文件。
生成网络的损失函数是由WGAN的损失函数,重构损失和分类损失组成,判别网络的损失函数由预测损失,分类损失和梯度惩罚损失组成。飞桨核心框架Paddle Fluid v1.5中,新增了梯度惩罚的OP,进而支持了WGAN-GP的算法。在本次对外开放的模型中,WGAN均是使用了WGAN-GP算法。
条件生成对抗网络,一种带条件约束的GAN,使用额外信息对模型增加条件,可以指导数据生成过程。
深度卷积生成对抗网络,将GAN和卷积网络结合起来,利用卷积神经网络作为网络结构进行图像生成,可以得到更加丰富的层次表达。为了提高生成样本的质量和网络的收敛速度,在网络结构上进行了一些改进:取消 pooling 层、加入 batch normalization、使用全卷积网络、在生成器(G)中,最后一层使用Tanh函数,其余层采用 ReLu 函数 ; 判别器(D)中都采用LeakyReLu。
Pix2Pix
利用成对的图片进行图像翻译,即输入为同一张图片的两种不同风格,可用于进行风格迁移。
Pix2Pix由一个生成网络和一个判别网络组成。生成网络中编码部分的网络结构都是采用convolution-batch norm-ReLU作为基础结构,解码部分的网络结构由transpose convolution-batch norm-ReLU组成,判别网络基本是由convolution-norm-leaky_ReLU作为基础结构,详细的网络结构可以查看network/Pix2pix_network.py文件。
生成网络提供两种可选的网络结构:Unet网络结构和普通的encoder-decoder网络结构。网络利用损失函数学习从输入图像到输出图像的映射,生成网络损失函数由GAN的损失函数和L1损失函数组成,判别网络损失函数由GAN的损失函数组成。生成器的网络结构如下图所示。
CycleGAN
可以利用非成对的图片进行图像翻译,即输入为两种不同风格的不同图片,自动进行风格转换。
CycleGAN由两个生成网络和两个判别网络组成,生成网络A是输入A类风格的图片输出B类风格的图片,生成网络B是输入B类风格的图片输出A类风格的图片。
生成网络中编码部分的网络结构都是采用convolution-norm-ReLU作为基础结构,解码部分的网络结构由transpose convolution-norm-ReLU组成,判别网络基本是由convolution-norm-leaky_ReLU作为基础结构,详细的网络结构可以查看network/CycleGAN_network.py文件。
生成网络提供两种可选的网络结构:Unet网络结构和普通的encoder-decoder网络结构。生成网络损失函数由LSGAN的损失函数,重构损失和自身损失组成,判别网络的损失函数由LSGAN的损失函数组成。
StarGAN
多领域属性迁移,引入辅助分类帮助单个判别器判断多个属性,可用于人脸属性转换。
StarGAN中生成网络的编码部分主要由convolution-instance norm-ReLU组成,解码部分主要由transpose convolution-norm-ReLU组成,判别网络主要由convolution-leaky_ReLU组成,详细网络结构可以查看network/StarGAN_network.py文件。
生成网络的损失函数是由WGAN的损失函数,重构损失和分类损失组成,判别网络的损失函数由预测损失,分类损失和梯度惩罚损失组成。
图:starGAN流程图
图:StarGAN的生成网络结构[左]和判别网络结构[右]
AttGAN
利用分类损失和重构损失来保证改变特定的属性,可用于人脸特定属性转换。
AttGAN中生成网络的编码部分主要由convolution-instance norm-ReLU组成,解码部分由transpose convolution-norm-ReLU组成,判别网络主要由convolution-leaky_ReLU组成,详细网络结构可以查看network/AttGAN_network.py文件。
生成网络的损失函数是由WGAN的损失函数,重构损失和分类损失组成,判别网络的损失函数由预测损失,分类损失和梯度惩罚损失组成。
图:AttGAN网络流程图
图:AttGAN的网络结构
如果您想详细了解更多飞桨的相关内容,请参阅以下
文档
。