目录
可随意转载!Update2022.08.07
前言
在DCGAN论文中已经提出来了latent space,证明了GAN网络确实能够抽取不同频率(层次)的图片特征信息,而SyleGAN进一步扩展了W空间,W+空间,进一步解偶了特征分布。本文进一步讨论如何去嵌入图片
论文:《Image2StyleGAN: How to Embed Images Into the StyleGAN Latent Space?》
续作:《Image2StyleGAN++: How to Edit the Embedded Images?》
第三方代码库:https://github.com/pacifinapacific/StyleGAN_LatentEditor
一、简介
作者发现算法在W+空间中嵌入比在Z空间更有效(也说明SytleGAN确实比早期GAN解偶能力更强)。作者提出三种操作向量的方式:线性插值,crossover, 向量加减法。论文的主要贡献是:
- 一个有效的把图片嵌入隐空间的算法
- 研究了多个嵌入方法
- 提出了三种基本嵌入操作,在morphing, style transfer, expression transfer三个应用上取得了好的效果
二、相关工作
2.1 一般嵌入方法:
- 训练一个Encoder,把图片编码后输入隐空间(例如VAE)
- 给latent code一个初始值输入G然后再用SDG优化去匹配原始图
第一种方法的问题是如果数据落在训练集外效果不好。本文使用的是第二种更通用、更稳定的方法。
2.2 Perceptual Loss
过去低频损失函数一般都是L1/L2,近年的研究表明VGG模型用来做perceptual loss非常高效。L1/L2 loss有什么问题呢?
如果把两张图片在行/列错位一个像素,人眼是没有感知的,但是在计算机中L1/L2 loss数值差别很大。因此科学家提出先用神经网络提取图片的高级特征再计算损失,这就叫perceptual loss。早期perceptual loss计算方法速度非常慢,直到下面这篇论文提出用pre-trained VGG网络 解决了它的效率问题(快1000倍)。
来自论文:《Perceptual losses for real-time style transfer and super-resolution》
论文《Arbitrary style transfer in real-time with adaptive instance normalization》解决了上一篇论文同一个网络迁移不同风格的问题。
三、嵌入实验
3.1 哪些图片可以被嵌入?
这不是一个简单的问题,因为作者实验过用其他GAN算法,一张人像图嵌入后输出完全是不同的人。
3.2 不同类型图片嵌入结果
在我们的算法中,用FFHQ人脸数据训练出来的模型,嵌入猫、狗、绘画、汽车也能得出相对比较好的输出。
3.3 我们的算法的鲁棒性来自哪里?
- 嵌入能力对仿射变换很敏感(实验得知GAN学到的表示依赖物体比例和位置)
- 嵌入有遮盖的图像,发现嵌入后遮盖部分不影响其他部分,嵌入图也不会补全
3.4 那么应该选择哪个latent space(Z, W, W+)?
结论是Z和W空间都不好嵌入。建议嵌入扩展空间W+。
四、实验意义
4.1 变形morphing
w = λw 1 + (1 − λ)w 2 , λ ∈ (0, 1)
4.2 风格转换
用crossover方法
4.2.1 风格转换进一步实验:
我们保留了目标图片的前9层latent code(对应StyleGAN中4×4 ~ 64×64)。目标图片后9层用style图的latent code覆盖(对应StyleGAN中64×64 ~ 1024×1024)。我们的方法成功传递了材质和颜色,没有成功保留非脸部图片结构。这揭示了StyleGAN的泛化和表示能力更多的是在高频空间中。如下图:
4.3 表情迁移和人脸重现
向量加减法:w = w 1 + λ(w 3 − w 2 )
其中w1是目标图片的latent code,w2是原图的,w3是另外一个人的笑脸图(假如任务是迁移笑脸)
五、算法
利用了论文《Inverting the generator of a generative adversarial network》中的方法 — G网络生成的图反向算出z分布。算法如下:
5.1参数初始化
5.2损失函数
六、论文续作
论文续作有四点改进:
- 前作把w输入G,然后用perceptual loss+ MSE loss优化,续作把noise也顺序做了优化以恢复高频特征。
- 解决了局部修改和局部近似嵌入问题
- 结合了嵌入和激活向量控制两个目的,提供了局部修改和全局语义修改能力。
- 可用来开发SOTA的编辑软件
七、StyleGAN_LatentEditor代码精读
这个代码库是一个日本科学家写的非官方代码,实现了四篇论文的算法。其中就包含了Image2StyleGAN和Image2StyleGAN++。
7.1 align_images.py / face_alignment.py
FFHQ数据集对齐工具,FFHQ提供已裁剪并对齐好的人脸数据,所以不是必要的。
7.2 encode_image.py
编码器生成图片的隐空间向量latent。
latent初始值为全0矩阵,尺寸(1,18,512);迭代优化perceptual loss和MSE loss,保存G生成的图和对应的latent(尺寸(1,18,512))。
7.3 facial_exchange.py
dlatent1=dlatent_a*alpha+dlatent_e*(1-alpha)
dlatent2=dlatent_a*(1-alpha)+dlatent_e*alpha
7.4 image_crossover.py
风格转换
7.5 image_morphing.py
# 加载两个.npy(或.npz)文件
latents_0=np.load(args.latent_file1)
latents_1=np.load(args.latent_file2)
# 取插值,其中alpha是权重
latents=alpha*latents_0+(1-alpha)*latents_1
7.6 landmarks_detector.py
使用dlib做面部68点检测。
7.7 make_morphinggif.py
生成动画
7.8 perceptual_model.py
上面几种图片变化需要用到的VGG16网络。
7.9 semantic_edit.py
boundary_name=["stylegan_ffhq_gender_w_boundary.npy","stylegan_ffhq_age_w_boundary.npy","stylegan_ffhq_pose_w_boundary.npy","stylegan_ffhq_eyeglasses_w_boundary.npy","stylegan_ffhq_smile_w_boundary.npy"]
semantic=["gender","age","pose","eye_glass","smile"]
从预先生成的几种latent语义(boundaries文件夹)生成动图
7.10 stylegan_layers.py
todo
7.11 weight_convert.py
因为stylegan2训练十分耗费资源。所以需要转换官方stylegan2的预训练模型参数,使得本项目的stylegan2可以做fine-tune。