最近一部电视剧《隐秘的角落》在网上引起了众多讨论,要说这是2020年全网热度最高的电视剧也不为过。而剧中反派Boss张东升也是网友讨论的话题之一,特别是他的秃头特点,已经成为一个梗了。
看过这部剧后,我突然很想知道自己秃头是什么样子,于是查了一下飞桨官网,果然它有图片生成的模型库。那么,我们如何使用PaddlePaddle做出一个秃头生成器呢。
生成对抗网络介绍
说到图像生成,就必须说到GAN,它是一种非监督学习的方式,通过让两个神经网络相互博弈的方法进行学习,该方法由lan Goodfellow等人在2014年提出。生成对抗网络由一个生成网络和一个判别网络组成,生成网络从潜在的空间(latent space)中随机采样作为输入,其输出结果需要尽量模仿训练集中的真实样本。
判别网络的输入为真实样本或生成网络的输出,其目的是将生成网络的输出从真实样本中尽可能的分辨出来。而生成网络则尽可能的欺骗判别网络,两个网络相互对抗,不断调整参数。生成对抗网络常用于生成以假乱真的图片。此外,该方法还被用于生成影片,三维物体模型等。
飞桨的模型库里用于人脸属性转换的模型主要有三种:
普通的GAN模型对每一对图像风格域都需要独立地建立一个模型,相比之下,StarGAN就是个多面手了,即单个 StarGAN 模型就可以实现多个不同风格域的转换,它允许在一个网络中同时使用不同风格域的多个数据集进行训练。这导致 StarGAN 的转化图像质量优于现有模型,并且可以灵活地转换输入图像到任何想要的风格领域。
(a)为处理多个域,应该在每一对域都建立跨域模型。
(b)StarGAN用单个generator学习多域之间的映射。该图表示连接多个域的拓扑图。
AttGAN算法是基于encoder-decoder结构的,根据所需属性对给定人脸的潜在表征进行解码,实现人脸属性的编辑。现有些方法试图建立一个独立于属性的潜在表示,来编辑属性。然而,这种对潜在表征的属性无关约束过多,限制了潜在表征的能力,可能导致信息丢失,从而导致生成过于平滑和扭曲。
AttGAN没有对潜在表示施加约束,而是对生成的图像应用属性分类约束(attribute classification constraint),以保证所需属性的正确改变,即“改变你想要的”。同时,引入重构损失来保证只改变特定的属性。还可以直接应用于属性强度控制,并且可以自然地扩展到属性样式操作。
STGAN是在AttGAN的基础上做的改进。STGAN中生成网络在编码器和解码器之间加入Selective Transfer Units(STU),同时引入属性差异向量(只输入需要改变的属性),这样一来,网络变得更容易训练,相比于目标属性标签,属性差异标签可以提供更多有价值的信息,使属性生成精度明显提升。
STGAN的网络结构
STGAN差不多是AttGAN的升级版,Paddle的StarGAN不包含秃头属性,所以我们使用STGAN。STGAN效果预览如下所示:
STGAN的效果图
上图中每个头像图片对应的属性分别为:original image、Bald、Bangs、Black Hair、Blond Hair、Brown Hair、Bushy Eyebrows、Eyeglasses、Male、Mouth Slightly Open、Mustache、No Beard、Pale Skin、Young。
我们看到了什么?Bald!对,这正是我们想要的秃头属性!
AI Studio是百度飞桨提供的免费云算力平台,具有免费的GPU算力,notebook的UI风格,预装的PaddlePaddle,非常适合我这样的新手炼丹师去随意捣鼓。
下面我们在AI Studio上来开启 “秃头”之旅吧……
实验过程
本项目采用CelebA数据集,CelebA是CelebFaces Attribute的缩写,意即名人人脸属性数据集,其包含10177个名人身份的202599张人脸图片。关于CelebA数据集的具体介绍,请详见https://zhuanlan.zhihu.com/p/35975956。
# 解压数据集
unzip data/data21325/imgAlignCeleba.zip -d dataset/
cp data/data21325/*.txt -d dataset/
# 获取GAN模型
# paddlepaddle/models的仓库里含有其支持的所有gan模型
!git clone https://gitee.com/paddlepaddle/models.git -b release/1.8
!cp -r models/PaddleCV/gan/* ./work/
# 训练
%cd ~/dataset
!python ../work/train.py --model_net STGAN \ # 指定stgan模型网络
--data_dir ../dataset \ # 数据集目录
--dataset . \ # 数据集相对位置
--crop_size 170 \
--image_size 128 \
--train_list ../dataset/attr_celeba.txt \ # 训练集位置
--gan_mode wgan \
--batch_size 32 --print_freq 1 \
--num_discriminator_time 5 \
--epoch 50 \
--dis_norm instance_norm \
--output ~/output/stgan/
别着急!在“秃头”之前,我们需要先准备要输入的图片,我把他放在my_dataset里,修改dataset/test1.txt,把图片填进去,并且根据图片的特征输入特征 :
%cd ~
# 输入的参数可以看看infer_bald.py开头的解释哦,主要需要注意的是
# n_samples:它的个数决定了输出的结果图中含有几张图的结果,我设置为1,那么就会只有一张图的属性变换输出。
# crop_size、image_size最好不要修改,经过我测试会影响效果,因此最好把图片控制在178的宽度
!python ./work/infer_bald.py \
--model_net STGAN \
--init_model ./33/ \
--dataset_dir my_dataset \
--test_list dataset/test1.txt \
--use_gru True \
--output ./infer_result/stgan/ \
--n_samples 1 \
--selected_attrs "Bald,Bangs,Black_Hair,Blond_Hair,Brown_Hair,Bushy_Eyebrows,Eyeglasses,Male,Mouth_Slightly_Open,Mustache,No_Beard,Pale_Skin,Young" \
--c_dim 13 \
--crop_size 178 \
--image_size 128 \
--load_height 128 \
--load_width 128 \
--crop_height 128 \
--crop_width 128 \
演员秦昊(张东升饰演者)
就感觉很秃然的样子……
渐变的秃头程度
效果结论
使用PaddleHub
如果觉得上面的比较繁琐,infer里的代码复杂,那么有一条直接的捷径。Paddlehub里面已经有STGAN的预训练模型可以直接使用预训练模型。
# 安装Paddlehub和stgan_celeba预训练模型
!pip install paddlehub==1.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
!hub install stgan_celeba
import paddlehub as hub
stgan = hub.Module(name="stgan_celeba")
test_img_path = ["my_dataset/img_align_celeba/000003.jpg"]
# org_info是一个只有一个元素的列表 如:["Bald,Bangs"]
# org_info要尽可能详细的说明输入图片的特征情况,否则会影响输出效果:
# 必须填写性别( "Male" 或 "Female")可选值"Bald", "Bangs", "Black_Hair", #"Blond_Hair", "Brown_Hair", "Bushy_Eyebrows", "Eyeglasses", #"Mouth_Slightly_Open", "Mustache", "No_Beard", "Pale_Skin", "Aged"
org_info = ["Male"]
# 指定要变化的特征:秃头
trans_attr = ["Bald"]
# set input dict
input_dict = {"image": test_img_path, "style": trans_attr, "info": org_info}
# execute predict and print the result
results = stgan.generate(data=input_dict)
print(results)
预训练模型和我自己训练的模型对比:
我自己的
预训练模型
可以看出预训练模型的秃头程度比较固定,而我把秃头程度设置的比较小,看起来可能更逼真一点。
END
本文分享自 PaddlePaddle 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有