ReStyle 水记(GAN反演,基于迭代细化的编码器)
《ReStyle: A Residual-Based StyleGAN Encoder via Iterative Refinement》
《ReStyle:一种基于残差的迭代细化StyleGAN编码器》
主页:https://yuval-alaluf.github.io/restyle-encoder/
论文:https://arxiv.org/abs/2104.02699
项目:https://github.com/yuval-alaluf/restyle-encoder
演示: BV1hv411J7mq ReStyle:人工智能“艺术家”生成近乎完美的卡通形象!万物皆可卡通化!
-
一些截图
注意到,本方法在卡通化中成功保留了胡子
可以在卡通化的情况下进行插值
属性编辑
人脸插值
不仅可以在人脸上插值,还可以用于汽车、动物、建筑物
GAN 反演
想法很简单,不是直接预测正确编码,而是预测当前编码与正确编码的差(或者说,预测 当前重建结果 与 目标图像 之间的,在 隐空间 中的差),然后循环几次,这样就实现了迭代细化。
一般的编码器输入 target 图片,输出 隐编码
本方法:
- 初始化:使用 平均隐编码 作为初始的 隐编码 w 0 \mathbf{w}_0 w0
- 用 生成器 G G G 根据 当前隐编码 w t \mathbf{w}_t wt 重建出图片 y ^ t \mathbf{\hat y}_t y^t
- 用 编码器 E E E 输入 x \mathbf{x} x 和 y ^ t \mathbf{\hat y}_t y^t ,输出两张图片隐编码之差 Δ t \Delta_{t} Δt
- 得到新的隐编码 w t + 1 ← w t + Δ t \mathbf{w}_{t+1} \leftarrow \mathbf{w}_{t}+\Delta_{t} wt+1←wt+Δt
不断循环234,直到收敛(循环次数不多,一般小于10次)
在训练时,每次前向传播都会计算 loss (应该就是弄很多图片建立训练集,专门训练这个对两个图片做差的编码器)
注意,训练时每个 batch 都会执行 N 次迭代
相关工作
迭代细化并不是一个新点子。[8] 为 人体姿态估计 引入了 迭代反馈机制。一些工作将迭代细化引入了 光流 [22]、物体姿态估计 [45,20] 、物体检测 [36] 、语义分割 [50] 。
据我们所知,我们是第一个把迭代细化用在 GAN 反演上的。
GAN反演
GAN反演任务首先由 [53] 引入。
一些方法 [53, 30, 12, 3, 4, 27, 41] 通过直接优化 latent ,最小化重建误差来解决该问题。
另一些方法 [53, 34, 52, 17, 37, 42] 设计了一个编码器,直接把图片映射到对应的 latent 。这些方法比纯优化方法速度更快,但是重建质量更差。
为了在两种类型之间寻求平衡,一些工作提出混合两种方案,以编码器来初始化优化过程 [53, 7, 17, 52] 。
我们建议读者看看 [46] ,这是一篇 GAN 反演 的综述。
基于可学习编码器的隐空间嵌入
最近的工作 [32, 37, 6, 9] 提出了一种端到端的方法,利用 GAN 生成的高质量图像实现多种图像翻译以及图像编辑。在这些工作中,图像被直接编码为 变换后的 latent,然后喂给生成器得到变换后的图像。通过训练一个带有额外约束的编码器,这些工作可以在不用提前反演图像的情况下,直接地解决多种任务。
另外的工作 [47] 研究了利用一个 训练好的StyleGAN编码器 产生的 隐编码 去解决下游任务,比如人脸识别和布局预测。这些工作进一步强调了训练一个强大的编码器,将预训练的不可控的GAN映射到隐空间,的优势。
隐空间操纵
有很多工作 [14,15,38] 使用 完全有监督 的方法,找到隐空间中与属性相关的方向,比如年龄、性别、表情。
有一些工作 [18,43,44] 使用 完全无监督 的方法,来找到方向。
另外一些工作研究比线性遍历更复杂的技术。
[40] 采用了一个预训练的 3DMM 来学习语义人脸编辑。
[39] 通过对 生成器权重 做 特征向量分解 学习到 多功能的编辑方向。
[5] 通过 受 target 属性控制的 normalizing flows 学习到 非线性的路径。
[33] 利用输入的 text-prompt 和 CLIP 来操作图像。
只要设计一个高效且精准的反演方法,我们就可以利用以上技术来操作真实图像。
方法
给定一个图像 x \mathbf{x} x ,ReStyle 执行 N>1 个 step 来得到反演结果 w = E ( x ) \mathbf{w}=E(\mathbf{x}) w=E(x) ,以及对应的重建结果 y ^ \hat y y^ 。我们将一个 step 定义为一次从 E E E 到 G G G 的前向过程。如果只做一个 step,那么这就是一个传统的编码器反演方法。
对于训练编码器 E E E ,我们定义一次迭代为一个 batch 上的 N 个 step。训练时只训练编码器,生成器保持固定。
在推理时,我们使用同样的 多 step 过程做图像反演和重建(不计算loss)。我们注意到,给定一个 batch 的图像,只需要较少的 step (N<10)就可以收敛,而且推理时速度也会更快。
下面我们形式化的描述本方法
首先构造 ReStyle 的输入,我们将输入图像 x \mathbf{x} x 与当前重建出的图像 y ^ t \mathbf{\hat y}_t y^t 连接起来,得到一个6通道的 x t \mathbf{x}_{t} xt :
x t : = x ∥ y ^ t \mathbf{x}_{t}:=\mathbf{x} \| \hat{\mathbf{y}}_{t} xt:=x∥y^t
然后我们将 x t \mathbf{x}_{t} xt 输入编码器得到 残差编码:
Δ t : = E ( x t ) \Delta_{t}:=E\left(\mathbf{x}_{t}\right) Δt:=E(xt)
于是我们得到新的隐编码 w t + 1 \mathbf{w}_{t+1} wt+1 :
w t + 1 ← Δ t + w t \mathbf{w}_{t+1} \leftarrow \Delta_{t}+\mathbf{w}_{t} wt+1←Δt+wt
我们用新的隐编码计算出新的重建出的图像 y ^ t + 1 \mathbf{\hat y}_{t+1} y^t+1 :
y ^ t + 1 : = G ( w t + 1 ) \hat{\mathbf{y}}_{t+1}:=G\left(\mathbf{w}_{t+1}\right) y^t+1:=G(wt+1)
然后我们再把 y ^ t + 1 \mathbf{\hat y}_{t+1} y^t+1 与 x \mathbf{x} x 连接,进行新一轮的迭代。
我们用 平均编码 作为 w 0 \mathbf{w}_0 w0 。
编码器结构
我们采用了当前 SOTA 的 编码器架构,[37] (pSp) 和 [42] (e4e) 。这两个编码器在 ResNet 骨架中引入了 特征金字塔网络 [29] ,并且从三个中间层提取特征。
我们发现 ReStyle 的多step流程 减轻了对 结构复杂的编码器 的需求。
于是我们选择设计一个 pSp 和 e4e 编码器 的简化的变体。只从最后一层提取特征。