目录
(三)从对齐的人脸头像提取特征码并生成StyleGAN头像:
(四)用别人的特征码修饰你的照片特征码,并生成混合后的StyleGAN头像:
在github.com 上有若干开源项目提供了源代码,我选用的开源项目是:pbaylies/stylegan-encoder,对应的网址是:https://github.com/pbaylies/stylegan-encoder
他们把解决办法称之为“stochastic clipping”(随机剪裁),其基本原理大致是:
特征码(特征向量)中每个数值通常处于一个有限的空间内,论文指出通常分布在[-1.0, 1.0]这个变动区间内,因此可以从某个特征向量开始(甚至于从全零向量开始),
- 先把超出[-1.0, 1.0]范围的数值剪裁到[-1.0, 1.0]区间,
- 然后以这个特征向量为基准值(平均值),在[-1.0, 1.0]这个变动区间内,按正态分布的规律随机取得新向量,
- 计算新向量通过GAN生成的新图片与原图片之间的损失函数,然后用梯度下降的方法寻找使损失函数最小的最优解。
论文指出,他们可以使损失函数降低到0,这样就找到了真实人脸对应的“相当精确”的特征码。
在这个开源项目里,作者把变动区间调整为[-2.0, 2.0]。有读者指出更好的变动区间是 [-0.25, 1.5],在这个区间内能够取得更优的质量。
这个开源项目实现的效果如下图所示(左一为源图;中间是基于预训练ResNet从源图“反向”生成dlatents,然后再用这个dlatents生成的“假脸”图片;右一是经随机剪裁方法最终找到的人脸dlatens,并用这个人脸dlatents生成的极为接近源图的“假脸”)
下面介绍具体执行步骤:
在工作目录下,新建.\raw_images目录,并把需要提取特征码的真实人脸图片copy到这个目录下。
使用时,可以按一下步骤操作:
(一)从图片中抽取并对齐人脸:
python align_images.py raw_images/ aligned_images/
(二)生成对齐人脸图片的生成的图片和latent表达:
python encode_images.py aligned_images/ generated_images/ latent_representations/
(三)从对齐的人脸头像提取特征码并生成StyleGAN头像:
python encode_images.py aligned_images/ generated_images/ latent_representations/ --iterations 300 --use_mssim_loss 300
(四)用别人的特征码修饰你的照片特征码,并生成混合后的StyleGAN头像:
python mixed_image.py
注意:这里的mixed_image.py是https://blog.csdn.net/weixin_41943311/article/details/103348865下的复制的代码的我自己起的文件名
这个StyleGAN Encoder的核心代码结构如下图所示:
其中一些具体的修改步骤参考:https://blog.csdn.net/weixin_41943311/article/details/103030194
如果你有网关可以在goole等连接,那么上述步骤可以省略
备注:
(2.1)预训练的resnet50模型,用于从源图生成优化迭代的初始dlatents,
对应于karras2019stylegan-ffhq-1024x1024.pkl的反向模型finetuned_resnet.h5
(2.2)预训练的StyleGAN模型,用于从dlatents生成“假”的人脸图片
预训练的StyleGAN人脸生成模型karras2019stylegan-ffhq-1024x1024.pkl
(2.3)预训练的VGG16模型,用于从图片提取features
用于评估图片相似性的vgg16_zhang_perceptual.pkl
- Pre-trained VGG16 network is used for transforming a reference image and generated image into high-level features space
反算潜码并重生成人脸这步主要使用encode-image.py
流程大概是:
- 使用反投影模型(RestNet50)将原始图片反投影出一个初始latent_code.
- 用生成器模型(pkl文件)根据初始latent_code生成一张图片.
- 使用vgg16对比生成图和原图的差距作为loss,反向传播优化latent_code.
- 用生成器模型根据新的latent_code生成一张图片.
第3,4步默认迭代100次,可以用--iterations参数进行更改.
参考:https://blog.csdn.net/weixin_41943311
原文链接:https://blog.csdn.net/DLW__/article/details/104161387