你看我还有机会吗?这么GAN让我秃然荒了!
Github: https://github.com/Azmarie/Hairstyle-Transfer
Blog: https://medium.com/swlh/hairstyle-transfer-semantic-editing-gan-latent-code-b3a6ccf91e82
Papers:A Style-Based Generator Architecture for Generative Adversarial Networks
Interpreting the Latent Space of GANs for Semantic Face Editing
首先说说什么是语义编辑,所谓语义编辑是指在保留所有其他信息的同时编辑图像中的目标属性,在这里我们的目标属性就是头发。通过语义编辑改变目标属性的各种属性值:比如:发型、颜色、发际线高低、面部毛发等。下面为具体的语义编辑步骤:
隐式向量必须能够很好的表示输入图像,一种方式就是优化特征空间对图像高级语义信息的表达能力。
将预训练残差网络的输出初始化StyleGAN的隐式向量,通过生成器生成图像(initial guess),将输入图像和生成图像分别经过预训练模型提取的特征做 损失,通过梯度下降,将特征向量间 损失最小化并更新隐式向量(红色箭头)
这样,利用StyleGAN_Encoder便生成了输入图像的隐式向量,同时,生成器可以生成一个StyleGAN版本的逼真人脸图像。
在编辑属性之前,需要在潜在隐式向量空间中找到能够区分二进制属性的特定边界,其中每一个属性都会对应一个分割边界。那么,如何能够在StyleGAN生成的多维潜在空间中找到一个属性分割边界呢?
传统线性分类器就可以通过超平面将二值属性值进行划分,通过对每个属性训练独立的线性SVM,使来自同一侧的所有样本都具有相同的属性。那么,要在潜在空间中找到秃头的边界,只需要以StyleGAN生成的隐式向量作为输入,隐式向量生成的图片是否秃顶作为输出,训练训练一个SVM二分类器。
因此,对于每个输入图像,首先在StyleGAN潜在空间中特定属性的分割超平面,然后沿着特定方向移动,便可以对该属性进行语义编辑。
-
数据集
CelebA:名人数据集,共10,177个名人身份的202,599张人脸图片,每张图片都做好了特征标记,包含人脸bbox标注框、5个人脸特征点坐标以及40个属性标记,CelebA由香港中文大学开放提供,广泛用于人脸相关的计算机视觉训练任务,可用于人脸属性标识训练、人脸检测训练以及landmark标记等。
FFHQ数据集:由NVIDIA最初作为生成对抗网络(GAN)的基准创建的高质量的人脸图像数据集。
-
下载Hairstyle-Transfer
https://github.com/Azmarie/Hairstyle-Transfer
-
下载stylegan-encoder
git clone https://github.com/Azmarie/stylegan-encoder.git
cd stylegan-encoder
mkdir aligned_images raw_images
-
下载resnet预训练模型
https://drive.google.com/uc?id=1aT59NFy9-bNyXjDuZOTMl0qX0jmZc6Zb
-
下载VGG预训练模型
https://drive.google.com/uc?id=15IYd9qY9wNd1SSeI4LxPjRBBJxiOzvhW
-
styleGAN人脸生成模型提前下载
CelebCA数据训练针对黄种人较少
代码里指定的Google网盘
https://drive.google.com/uc?id=1opTWG1jYlyS9TXAuqVyVR68kQWhOhA99
百度网盘:https://pan.baidu.com/s/1ujItgpnHSw14Fw8I3Ai7Jw
提取码:ossw
有人用FFHQ人脸数据筛选了一些黄种人脸进行训练的人脸模型(1024x1204)
百度网盘:https://pan.baidu.com/s/18cpaM6wJg4ozmwlFNY21kw
提取码:fx23
生成隐式向量
-
notebook:StyleGAN_Encoder.ipynb -
准备人脸数据 -
使用dlib人脸检测和对齐
python align_images.py raw_images/ aligned_images/ --output_size=1024
-
编码人脸到StyleGAN隐式空间
python encode_images.py --optimizer=lbfgs --face_mask=False --iterations=50 --use_lpips_loss=0 --use_discriminator_loss=0 --output_video=True aligned_images/ generated_images/ latent_representations/
-
保存隐式向量为output_vectors.npy
构造属性分类数据
-
notebook:Get_attribute_score_pairs.ipynb -
生成隐式向量和属性分数,为训练SVM构造训练数据stylegan-dlatents.npy 和 9_score.npy 文件
python run_metrics.py
注意将代码中的模型路径修改为本地模型地址。
属性边界与编辑
-
Train_Boundaries_+_Face_Editing_with_Interface_GAN.ipynb -
下载interfacegan并将模型karras2019stylegan-ffhq-1024x1024.pkl放到models/pretrain
git clone https://github.com/genforce/interfacegan.git
-
训练发际线属性边界(classifier对应索引为9)获得boundary.npy -
编辑发际线bangs的属性
latent_direction = 'bangs' #### Pick one of ['age', 'eyeglasses', 'gender', 'pose', 'smile']
morph_strength = 3 # Controls how strongly we push the face into a certain latent direction (try 1-5)
nr_interpolation_steps = 48 # The amount of intermediate steps/frames to render along the interpolation path
!rm -r results/bangs
!python edit.py \
-m stylegan_ffhq \
-b boundaries/stylegan_ffhq_bangs_boundary.npy \
-s Wp \
-i '/content/output_vectors.npy' \
-o results/bangs \
--start_distance -3.0 \
--end_distance 3.0 \
--steps=48
效果一览
年轻的小李子也禁不住发际线的上扬
有魅力的诺叔😂
发际线一长,气质就上来了,有木有😃
-
项目的一些其他属性编辑效果
姿势变换
性别变换
带上眼镜
InterFaceGAN演示视频
最后,再推荐一个有意思的人脸生成网站:http://www.seeprettyface.com
》》python
》》论文
本文分享自微信公众号 - AI搞事情(AI_gsq)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。







