可随意转载!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)

左w1; 右w2,中间是线性插值(λ不同)下的结果

4.2 风格转换

用crossover方法

上是style图;左是目标原图,第二列是用了style loss of VGG, 三到六列用style图替换了目标图最后9层的latent code

4.2.1 风格转换进一步实验:

我们保留了目标图片的前9层latent code(对应StyleGAN中4×4 ~ 64×64)。目标图片后9层用style图的latent code覆盖(对应StyleGAN中64×64 ~ 1024×1024)。我们的方法成功传递了材质和颜色,没有成功保留非脸部图片结构。这揭示了StyleGAN的泛化和表示能力更多的是在高频空间中。如下图:

第一行是嵌入的style图,第一列是目标图片

4.3 表情迁移和人脸重现

向量加减法:w = w 1 + λ(w 3 − w 2 )

其中w1是目标图片的latent code,w2是原图的,w3是另外一个人的笑脸图(假如任务是迁移笑脸)

五、算法

利用了论文《Inverting the generator of a generative adversarial network》中的方法 — G网络生成的图反向算出z分布。算法如下:

初始化w输入G,迭代最小化perceptual loss + MSE loss

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。