《Editing Out-of-domain GAN Inversion via Differential Activations》
论文:https://arxiv.org/abs/2207.08134
项目:https://github.com/HaoruiSong622/Editing-Out-of-Domain
BV1Wt4y1g7Si
有时候真实图像没法很好的反演,这样就没法很好地编辑
本文设计了一个模型,将编辑后发生变化的部分应用回原图,实现域外编辑。
这样应该有一个前提,就是要编辑的部分的反演结果要比较好。如果要编辑的部分也反演得不好,很可能就会有问题。
总的看完,这个方法感觉不够鲁棒。
给定输入图片 I I I 和 编辑属性使用的向量 α n \alpha_n αn
先反演出 I I I 的隐编码 w w w 。
把 w w w 直接输入生成器,重建出反演的图像 I ′ I' I′ 。
对 w w w 做编辑后输入生成器,生成反演并编辑后的图像 T T T 。
用 一个模型(称为 可微分激励模型) 计算 I ′ I' I′ 与 T T T 在哪些地方有差别,得到一个 权重 mask M M M 。
用权重 mask 指导,做 I I I 和 T T T 的加权和,得到一个粗略的编辑后图像 F fused F_{\text{fused}} Ffused 。
用一个图像翻译模型(称为 去鬼影网络),输入 F fused F_{\text{fused}} Ffused ,输出完善的编辑后的图像。
用于计算 I ′ \boldsymbol{I}^{\prime} I′ 与 T \boldsymbol{T} T 在哪些地方有差别,得到一个 权重 mask M M M 。
先准备一个可训练的编码器 E trainable ( ⋅ ) E_{\text{trainable}}(\cdot) Etrainable(⋅)
计算 I ′ I' I′ 和 T T T 的编码之差 Δ = E trainable ( I ′ ) − E trainable ( T ) \boldsymbol{\Delta}=E_{\text {trainable }}\left(\boldsymbol{I}^{\prime}\right)-E_{\text {trainable }}(\boldsymbol{T}) Δ=Etrainable (I′)−Etrainable (T)
用一个轻量级的卷积分类器,分析出有哪些属性被编辑过,使用softmax交叉熵损失。
然后我们对这个卷积分类器做 CAM ,得到其注意力分布图,作为权重mask。
CAM的步骤
∂ s c ∂ H i j k \frac{\partial s_{c}}{\partial \boldsymbol{H}_{i j}^{k}} ∂Hijk∂sc 表示中间层特征 H H H 在第 k k k 个通道,像素坐标 ( i , j ) (i,j) (i,j) 处,关于类别 c c c 的梯度。其中 s s s 表示分类器最后一层的输出,但是不经过sofmax 。
于是我们计算每个通道与类别相关的权重 β c k \beta_{c}^{k} βck :
β c k = 1 Z ∑ i ∑ j ⏞ global average pooling ∂ s c ∂ H i j k \beta_{c}^{k}=\overbrace{\frac{1}{Z} \sum_{i} \sum_{j}}^{\text {global average pooling }} \frac{\partial s_{c}}{\partial \boldsymbol{H}_{i j}^{k}} βck=Z1i∑j∑ global average pooling ∂Hijk∂sc
其实就是通道上梯度的平均值,梯度越大说明权重越高。
然后我们计算 CAM 图:
M D i f f − C A M = ReLU ( ∑ k β c k H k ) \boldsymbol{M}_{\mathrm{Diff-CAM}}=\operatorname{ReLU}\left(\sum_{k} \beta_{c}^{k} \boldsymbol{H}^{k}\right) MDiff−CAM=ReLU(k∑βckHk)
其实就是把 H H H 的各个通道做了加权和。
然后把 M D i f f − C A M \boldsymbol{M}_{\mathrm{Diff-CAM}} MDiff−CAM 标准化到 [0,1] 之间,就得到 权重mask 了。
一个全卷积网络,由 编码器、解码器、预训练的 StyleGAN2 生成器 这几部分组成。
我们的目的是利用预训练的GAN里的人脸先验来生成无伪影的图像。
我们把 F fused F_{\text{fused}} Ffused 输入全卷积的 编码器-解码器 网络,编码器会得到 F fused F_{\text{fused}} Ffused 的隐编码(相当于反演?那你为啥要用全卷积结构啊?输出尺寸不该是固定的吗?),解码器会得到无伪影的图像, StyleGAN也会得到无伪影的图像。我们把两个生成器和解码器的对应层特征合并,得到最终结果。(哇,效果真的差呀,还要靠特征合并才行,这不是说明训练方向都有偏差吗……是因为合成的训练数据不能满足需要吧……)
为了训练去鬼影网络,我们合成了一系列图片对 { F train , I } \left\{\boldsymbol{F}_{\text {train }}, \boldsymbol{I}\right\} {Ftrain ,I} 。
F train \boldsymbol{F}_{\text {train }} Ftrain 的合成方式如下:
F train = T ⊙ M train + I ⊙ ( 1 − M train ) \boldsymbol{F}_{\text {train }}=\boldsymbol{T} \odot \boldsymbol{M}_{\text {train }}+\boldsymbol{I} \odot\left(1-\boldsymbol{M}_{\text {train }}\right) Ftrain =T⊙Mtrain +I⊙(1−Mtrain )
其中, M t r a i n \boldsymbol{M}_{\mathrm{train}} Mtrain 的合成方式如下:
M t r a i n ( i , j ) = { M Diff-CAM ( i , j ) , if M Diff-CAM ( i , j ) ≤ 0.5 1 − M Diff-CAM ( i , j ) , if M Diff-CAM ( i , j ) > 0.5 \boldsymbol{M}_{\mathrm{train}}(i, j)= \left\{\begin{array}{ccc} \boldsymbol{M}_{\text {Diff-CAM }}(i, j), & \text { if } \quad \boldsymbol{M}_{\text {Diff-CAM }}(i, j) \leq 0.5 \\ 1-\boldsymbol{M}_{\text {Diff-CAM }}(i, j),& \text { if } \quad \boldsymbol{M}_{\text {Diff-CAM }}(i, j)>0.5 \end{array}\right. Mtrain(i,j)={MDiff-CAM (i,j),1−MDiff-CAM (i,j), if MDiff-CAM (i,j)≤0.5 if MDiff-CAM (i,j)>0.5
T \boldsymbol{T} T 是随机选择的,根据选择的 T \boldsymbol{T} T ,可以得到对应的 M Diff-CAM \boldsymbol{M}_{\text {Diff-CAM }} MDiff-CAM
这个式子把 M t r a i n \boldsymbol{M}_{\mathrm{train}} Mtrain 中所有的值都压到 [0,0.5] 之间,这样可以人为制造伪影,但是又不至于太过,这样我们就可以把 I \boldsymbol{I} I 作为 ground truth 。
用了三个损失,L2像素级重建损失、VGG16 L2感知损失、对抗损失。