【飞桨开发者说】刘炫,就任于福建贞仕信息。Python 开发工程师 2 年退职工程师。
最近一部电视剧《隐秘的角落》在网上引起了泛滥探讨,要说这是 2020 年全网热度最高的电视剧也不为过。而剧中反派 Boss 张东升也是网友探讨的话题之一,特地是他的秃头特点,曾经成为一个梗了。
看过这部剧后,我忽然很想晓得本人秃头是什么样子,于是查了一下飞桨官网,果然它有图片生成的模型库。那么,咱们如何应用 PaddlePaddle 做出一个秃头生成器呢。
**!
生成反抗网络介绍
说到图像生成,就必须说到 GAN,它是一种非监督学习的形式,通过让两个神经网络互相博弈的办法进行学习,该办法由 lan Goodfellow 等人在 2014 年提出。生成反抗网络由一个生成网络和一个判断网络组成,生成网络从潜在的空间 (latent space) 中随机采样作为输出,其输入后果须要尽量模拟训练集中的实在样本。
判断网络的输出为实在样本或生成网络的输入,其目标是将生成网络的输入从实在样本中尽可能的分辨进去。而生成网络则尽可能的坑骗判断网络,两个网络互相反抗,一直调整参数。生成反抗网络罕用于生成以假乱真的图片。此外,该办法还被用于生成影片,三维物体模型等。
飞桨的模型库里用于人脸属性转换的模型次要有三种:
- StarGAN 多畛域属性迁徙
一般的 GAN 模型对每一对图像格调域都须要独立地建设一个模型,相比之下,StarGAN 就是个多面手了,即单个 StarGAN 模型就能够实现多个不同格调域的转换,它容许在一个网络中同时应用不同格调域的多个数据集进行训练。这导致 StarGAN 的转化图像品质优于现有模型,并且能够灵便地转换输出图像到任何想要的格调畛域。
(a)为解决多个域,应该在每一对域都建设跨域模型。
(b)StarGAN 用单个 generator 学习多域之间的映射。该图示意连贯多个域的拓扑图。
- AttGAN 利用分类损失和重构损失来保障扭转特定的属性
AttGAN 算法是基于 encoder-decoder 构造的,依据所需属性对给定人脸的潜在表征进行解码,实现人脸属性的编辑。现有些办法试图建设一个独立于属性的潜在示意,来编辑属性。然而,这种对潜在表征的属性无关束缚过多,限度了潜在表征的能力,可能导致信息失落,从而导致生成过于平滑和扭曲。
AttGAN 没有对潜在示意施加束缚,而是对生成的图像利用属性分类束缚(attribute classification constraint),以保障所需属性的正确扭转,即“扭转你想要的”。同时,引入重构损失来保障只扭转特定的属性。还能够间接利用于属性强度管制,并且能够天然地扩大到属性款式操作。
- STGAN 只输出有变动的标签,引入 GRU 构造,更好的抉择变动的属性
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 上来开启“秃头”之旅吧……
试验过程
1. 筹备数据集
本我的项目采纳 CelebA 数据集,CelebA 是 CelebFaces Attribute 的缩写,意即名人人脸属性数据集,其蕴含 10177 个名人身份的 202599 张人脸图片。对于 CelebA 数据集的具体介绍,请详见 https://zhuanlan.zhihu.com/p/…。
# 解压数据集
unzip data/data21325/imgAlignCeleba.zip -d dataset/
cp data/data21325/*.txt -d dataset/
2. 获取模型
# 获取 GAN 模型
# paddlepaddle/models 的仓库里含有其反对的所有 gan 模型
!git clone https://gitee.com/paddlepaddle/models.git -b release/1.8
!cp -r models/PaddleCV/gan/* ./work/
3. 开始训练
# 训练
%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/
4. 开始推理
别着急!在“秃头”之前,咱们须要先筹备要输出的图片,我把他放在 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 \
5. 秃头成果展现
演员秦昊(张东升饰演者)
就感觉很秃然的样子……
突变的秃头水平
成果论断
- 因为 stgan 只用输出变动的属性,原 infer 会循环变动每个一个格调属性(Bald,Bangs 等),我把切换格调属性的循环,批改成了只输出秃头属性,而后循环逐步扭转变动水平,使其后果产生突变成果
- 这里我发现男性中头发是短发的秃头化成果,显著比长发男性好,头发蓬松就会影响秃头成果,因为蓬松的头发遮蔽了脑袋的形态,也有可能是训练集短少这类男性图片的起因。第一张图是最天然的,看起来也最真,应该是寸头短发的因素。
-
输出图片的大小靠近 128×128,或者 178×178,成果会比拟好,起因可能是训练集的大小都是 128×128。官网这里也阐明:(http://https//www.paddlepaddl…_celeba&en_category=GANs)
- 待处理图片尽量只露脸,当五官是朝向正前方且露出五官时,成果会比拟好。
- 待处理图片的尺寸靠近 128 * 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)
预训练模型和我本人训练的模型比照:
我本人的
预训练模型
能够看出预训练模型的秃头水平比拟固定,而我把秃头水平设置的比拟小,看起来可能更真切一点。
感激
最初感激飞桨平台,让我这个初学者就能做一些乏味的试验。
还有我对 stylegan 挺感兴趣的,心愿之后能够反对到哈。
如在应用过程中有问题,可退出飞桨官网 QQ 群进行交换:1108045677。
如果您想具体理解更多飞桨的相干内容,请参阅以下文档。
飞桨生成反抗网络我的项目地址:
GitHub:
https://github.com/PaddlePadd…
Gitee:
https://gitee.com/paddlepaddl…
官网地址:
https://www.paddlepaddle.org.cn
飞桨开源框架我的项目地址:
GitHub:
https://github.com/PaddlePadd…
Gitee:
https://gitee.com/paddlepaddl…
END