Analyzing and Improving the Image Quality of StyleGAN

前言


本文围绕2019年上半年的工作 StyleGAN 存在的两个问题进行讨论:

  1. Blob Artifacts(液滴伪像);
  2. Shift Invariance(切变不变性)。

为了解决这两个问题作者提出了一系列的假设分析解决方法

明确 StyleGAN 的问题


首先我们需要明确上面提到的两个问题分别是什么?

Blob ArtifactsShift Invariance
blob artifacts sampleshift invariance sample
液滴伪像 即合成图像含有小范围内的像“水墨化开”的伪影,
作者说,仅有大约0.1%的生成图像不会出现这种伪像。
切变不变性 以“转脸”为例(具体如何定向编辑 stylegan 合成的图像
可以看后面解析),像牙齿眼睛这些高频区域(details),
倾向于不变

解决问题


1. Removing normalization artifacts

作者发现 StyleGAN 在训练过程中,从 64 × 64 64\times 64 64×64 之后,就会开始出现 blob artifacts resemble water droplets (水滴状💧的伪像),如下图:
在这里插入图片描述
尽管这些对于图像整体不明显,但确实是存在的。
并且越到高层,这种伪像越明显;这是很奇怪的,因为理论上它本应该倍 鉴别器 D D D 检测到。

** 上图每一对图像右边是 visualization of feature maps,具体操作用伪代码解释如下:

'''
## we use pytorch
F is the feature_map # (C, H, W)
mu = torch.mean(F, dim=0).unsqueeze(-1).unsqueeze(-1) # (C, 1, 1)
sigma = torch.var(F, dim=0).unsqueeze(-1).unsqueeze(-1) # (C, 1, 1)
F_normed = (F - mu) / sigma

map = torch.sum(F_normed, dim=0)
'''
首先我们要明确 blob artifacts 并不是不好。
液滴伪像对于 StyleGAN 为什么是必须的?

具体地说,作者假设,液滴伪像是生成器 G G G 故意将信号强度信息头痛图经过 Instance Normalization 的结果——因为通过创建一个局部强信号可以很实现对特征指定通道的统计特征,从而实现对数据流的“支配(dominates)”。
因为 G G G 只需要生成统计特征上可以骗过 D D D 的数据即可。
想象一下,一个2维 feature map channel 原本是一个平坦的均匀分布;在添加了局部的峰后,其均值马上像均值所在位置靠拢,方差马上从 0 开始增大。

从这个意义上,我们可以理解“the blob artifacts guide the generation”这句话,换句话说,因为有这样的伪像存在, G G G 才能够对输出的数据流进行有效的控制,从而合成能够欺骗过 D D D 的图像。假如那0.1%的生成图像在生成过程中的 feature 中没有产生 这样的伪像,就极有可能生成质量差的图像。
为此作者举了下面一个例子
在这里插入图片描述
我们看到两个图像合成过程中,

  • 6 4 2 64^2 642 这层是差不多的;
  • 但是到了 12 8 2 128^2 1282 这一层,上面一行在右下角突然出现了 伪像(极大或极小),而下面一行没有,所以相对的,五官、头发这些细节(高频区域)更加明显;
  • 等到 25 6 2 256^2 2562 这一层,上面一行因为有伪像的压制,其他区域相对平滑,但下面一行就对细节处产生了更多的大块的伪像( G G G 为了控制输出的数据流的统计特性);
  • 到了 51 2 2 512^2 5122 这一层,上面一行只有极小块的液滴伪像,下面一行则多处出现;
  • 最后生成的图像效果可想而知。
    因此,我们总结,StyleGAN 的合成图像依赖于这些液滴伪像。
但是,存在 artifacts 终究还是不够完美…

作者指出,这是由于引入了 AdaIN 导致的。
因为作者做了一个实验:

通过将 AdaIN 中 调制(modulation) 之前的 正则化(normalization) 去掉,这个伪像就彻底消失了。

AdaIN 对 feature map 的每一个 channel 分别做正则化(mean 和 variance),这可能破坏了特征相邻通道之间的本身存在的大小关系(magnitudes)。 (——原文的翻译:… We pinpoint the problem to the AdaIN operation that normalizes the mean and variance of each feature map separately, thereby potentially destroying any information found in the magnitudes of the features relative to each other… )
但 UP 主拙见,是因为对每个通道单独做 normalization,然后再统一预测每个通道的均值方差,可能直接导致了每个通道的数据分布被修改。

但是,我们又不希望这些液滴伪像出现在图像上(即 G G G 的输出数据流中),但又不能消除它,因为 G G G 的生成依赖于液滴伪像的引导。
该怎么做?

我们知道,整个 StyleGAN 每一层可以简单地看作是 out_feature = non_linear_activation(W * in_feature + bias),其中的 ∗ * conv
因此,输出的数据流是由输入数据流(from latent vector to space)和卷积参数(weights)共同决定的,,我们可以把液滴伪像的作用从从数据流迁移到卷积参数中去,而并直接不作用到待合成图像的数据流上?


作者就是这么做的!

Generator architecture revisited

为此,我们需要首先回顾一下 StyleGAN 的结构。

-我们可以发现,
卷积的偏差b 与噪声B是在 StyleBlock 中执行的,
即在 normalization 之前加入的,这使得 bias 和 noise
的作用与 style 是相反的;因为假如 bias/noise
导致了 feature map 的值偏大,style 学习到的参数 γ \gamma γ β \beta β 就去缩小它。

因此,我们不妨把 bias 和 noise 的步骤从 style block 中拿出来,即把在这里插入图片描述在这里插入图片描述调换一下,得到在这里插入图片描述,与原来的比较:在这里插入图片描述
这样做的另一个好处是:既然现在 bias 和 nosie 于 style 的作用是一样的,那么意味着:style 产生 β \beta β 就可以省略了,直接让卷积的参数 .bias 去学即可。因此,现在我们只需要: γ = = F C ( s t y l e ) \gamma==FC(style) γ==FC(style)
(作者实验也发现,将预测 β \beta β 的部分去掉,在我们将 bias 和 nosie 拿到外面后是更有帮助的)

Instance normalization revisted

然后我们还要看一下 IN 的原理——
(1)normalization(正则化)

o c , h , w ′ = o c , h , w − μ c σ c o'_{c,h,w}={{o_{c,h,w}-\mu_c}\over{\sigma_c}} oc,h,w=σcoc,h,wμc
其中, μ c = 1 C H W × ∑ h H ∑ w W o c , h , w \mu_c={{1}\over{CHW}}\times{\sum_{h}^{H}\sum_w^Wo_{c,h,w}} μc=CHW1×hHwWoc,h,w,且 σ c = 1 C H W × ∑ h H ∑ w W ( o c , h , w − μ c ) 2 \sigma_c={{1}\over{CHW}}\times{\sum_{h}^{H}\sum_w^W(o_{c,h,w}-\mu_c)^2} σc=CHW1×hHwW(oc,h,wμc)2.

(2)modulation(调制)

o c , h , w ′ ′ = γ c × o x , h , w ′ + β c o''_{c,h,w}=\gamma_c\times o'_{x,h,w}+\beta_c oc,h,w=γc×ox,h,w+βc

下面作者准备出招了!
(1)作者认为,可以将正则化去掉,于是:style 的效果和作用就变成了逐层累加的(cumulative)而不是指定大小的(scale specific),因为每次正则化会把每个通道之间的大小关系消除,也就是把 style 产生的 γ \gamma γ β \beta β 的作用消除。(这是思想的升华!)
于是我们可以得到:在这里插入图片描述这样简单的形式。这样可以减小 FID 分数。
但是这样作者发现会丢失了 StyleGAN 原本的控制性。因此,还是加上为好
(2)还记得前面我们说现在 style 不需要预测 β \beta β 了吗?
因此,style 预测得到的 γ \gamma γ 作用在 feature map 上可以等效于先做用在各个卷积核上,然后再作用在 feature map上!
即,我们考虑到下图的操作是等效的:
在这里插入图片描述
用数学公式描述为:
w i j k ′ = γ i × w i j k w'_{ijk}=\gamma_i \times w_{ijk} wijk=γi×wijk
这就把调制 modulation 作用到卷积核上。其中, i i i 表示卷积核的第 i i i 个通道;j 表示第 j j j 个卷积核; k k k 表示卷积核的所有窗口元素。

如果我们假设输入的 feature map 是 i.i.d. 的随机变量,那么,输出的被 feature map 的第 j j j 个通道 的标准差等于:
σ j = ∑ i , k w ′ i j k 2 \sigma_j=\sqrt{\sum_{i,k}{w'}_{ijk}^2} σj=i,kwijk2

调制完成后,本来应该是需要进行 normalization 的,但前面我们说 β \beta β 是不必要的,因此,我们采取 解调制(demodulation)
具体地,我们仅对每个元素除以这个通道所有元素组成的数据分布的标准差!而不先减去其均值。
在上面的 i.i.d. 的假设中,我们知道了输出也一定是 i.i.d. 的随机变量,因此对 output feature 除以标准差也可以放到卷积核的参数上完成。
即:

1 σ j × o u t _ f e a t u r e j = c o n v ( o u t f e a t u r e ∣ d e m o d u l a t e ( w j ′ ) ) {{1}\over{\sigma_j}}\times out\_feature_j=conv(out_feature|demodulate(w'_j)) σj1×out_featurej=conv(outfeaturedemodulate(wj))
其中:
w j ′ ′ = w j ′ ∑ i , k w i j k ′ + ϵ w''_j={{w'_j}\over{\sqrt{\sum_{i,k}w'_{ijk}+\epsilon}}} wj=i,kwijk+ϵ wj.

至此,我们将一整个 Style Block 压缩成一个简单的 conv 操作!大道至简!
上述的将**解调制(demodulation)**与调制(modulation)转移到卷积权重的这个新的技术,我们称之为

Weight Deulation

,这是文章第一个创新,是为了去除 IN 引入的&&液滴伪像。
在这里插入图片描述
上图说明,现在特征图可视化后中间是没有出现局部最小或最大的伪像的,所以特征图谱表现出来的是全局语义区域普遍更加明显。

2. Image Quality and Generator Smoothness

首先作者发现依靠 FIDP&R 这两项指标去判断生成模型性能是不够充分的,这两项指标无法直接正确反映生成图像对人类的视觉效果。有下面的对比图:
在这里插入图片描述
我们发现,尽管对比图中 FIDP&R 非常相近,但合成图像质量却有明显差别。

作者在论文里解释了,为什么 FIDP&R 无发胜任评判工作的原因:
因为这两项度量方式依靠的是在 ImageNet 上预训练分类器(如 Inception-v3 或者 VGG-16),其 feature extractor 映射的特征空间(feature space)具有这么一个特点:

make a decision based much more on texture than shape,
while humans strongly focus on shape.

但有一个指标是明显不同的,就是本文提出的:PPL(Perceptual Path Length).

PPL

用途方法
用来度量一个从 latent space 到 image 的 mapping的平滑度(可以看做是隐空间流形的平滑度)计算对隐空间的隐向量 w w w 施加轻微的干扰 得到 Δ w + w \Delta w+w Δw+w,我们计算生成的两张图像 I I I I ′ I' I 之间的 L P I P S LPIPS LPIPS 距离

首先我们要明确,在生成模型相关的工作中,Interpolation of latent vectors 的实验是必不可少的,这被用来反映生成模型性能的高低。因为只有当 G G G 能够对 latent space 构造了一个好的映射,这个映射下,如果将 image space 铺平的话,latent space 则是被扭曲成为一个流形,一般的我们希望这个流形越平滑越好,即:流形上相近的两个隐向量对应到图像空间的两个图像之间应该是及其相似的。
因此,PPL 越低, G G G 性能越好!
作者在原文是这么说的:

low PPL scores are indeed indictive of high-quality images, and vice versa.
## the overall PPL for a model is simply the expected value of the per-image PPL scores.

为什么 PPL 与图像视觉质量是负相关的呢?即:为什么模型越平滑,其合成图像的视觉效果越好呢?

作者猜测是:
D D D 为惩罚 G G G 生成的 broken images,那么对 G G G 而言一个直接的方式来提高自身性能是:
有效地扩展 latent space 上那些能生成较好质量图像的区域,于是就会把那些暂时没能找到好的映射方式的向量聚集在一个小的区域。
那么这个小的区域必然是落差很大的。但是由于这个区域很小,在等概率随机采样用于生成图像,进而计算 PPL 的时候,总体上采样到的还是平滑区域的隐向量,因此总体 PPL 越低。
在这里插入图片描述

好,那我们要怎样提高模型映射的平滑度?
与降低模型复杂度引入相关的正则项一样,作者设计了两个正则项。

Lazy Regularization

一般的,生成对抗网络用于生成实验中,目标函数有两部分构成:1)the main loss function(e.g. logistic loss);2)regularization terms(e.g. R 1 R_1 R1)。
一般这两个部分是加在一起,共同训练的。
但是作者又发现,事实上正则项没有必要计算的那么频繁,这样可以减少计算代价和内存占用。
具体实现方式如下:

  • 对生成器只使用一个 Adam 优化器;
  • k k k 次迭代计算一次正则项。
  • 前面 k k k 次只计算 main loss function 的值用于反传求梯度。
  • 到了第 k + 1 k+1 k+1 次,计算得到正则项的值再 × k \times k ×k;反传求梯度。
  • 我们让 c = k / ( k + 1 ) c=k/(k+1) c=k/(k+1),然后设置优化器的参数为: λ ′ = c λ \lambda'=c\lambda λ=cλ β 1 ′ = ( β 1 ) c \beta_1'=(\beta_1)^c β1=(β1)c β 2 ′ = ( β 2 ) c \beta_2'=(\beta_2)^c β2=(β2)c;梯度下降。

** 对 G G G 使用 k = 16 k=16 k=16;对 D D D 使用 k = 8 k=8 k=8

这是文章的第二个技术创新:

Lazy Regularization

Path Length Regularization

与18年的一篇文一致,作者认为:如何判断一个生成器是否受 latent space 的隐向量控制,在于:对隐空间的每一个点作微小的位移,会在对应的图像空间产生相同大小(方向不一定相同)的变化。


数学定义:

对于隐空间 W {\boldsymbol{W}} W 的每一个点 w w w,我们记这个映射为: g ( w ) : W ⟼ Y g(w):W\longmapsto Y g(w):WY ,则对应 w w w 的变化 ∂ w \partial w w 和图像的变化 ∂ g ( w ) \partial g(w) g(w) ,我们用雅可比矩阵 J w = ∂ g ( w ) ∂ w \Bbb J_w={{\partial g(w)}\over{\partial w}} Jw=wg(w) 来衡量这个映射的缩放属性(scaling properties)。
于是作者定义了正则项为:
E w , y ∈ N ( 0 , I ) ( ∣ ∣ J w T y ∣ ∣ 2 − a ) 2 \Bbb E_{w,y\in N(0,I)}(||\Bbb J_w^Ty||_2-a)^2 Ew,yN(0,I)(JwTy2a)2
其中, y y y 是随机的图像,其像素强度符合正态分布(这里UP主还不明白是什么意思?什么样的图像满足这一属性,swtcl);常数 a a a 在训练过程中是动态的。
为了方便计算,使用: J w T y = ∇ w ( g ( w ) × y ) \Bbb J_w^Ty=\nabla _w(g(w)\times y) JwTy=w(g(w)×y) 来计算。

细节
a a a 如何动态设置?

笔者阅读论文后的理解是:
首先初始化 a = 0 a=0 a=0
然后我们记录 ∣ ∣ J w T ∣ ∣ 2 ||\Bbb J_w^T||_2 JwT2 的均值,让 a a a e x p exp exp 指数方式向这个均值靠近。

该正则项的系数/权重?

γ p l = ln ⁡ 2 r 2 ( ln ⁡ r − ln ⁡ 2 ) \gamma_{pl}={{\ln 2}\over{r^2(\ln r-\ln 2)}} γpl=r2(lnrln2)ln2
其中 r r r 是当前的输出分辨率

** 完了后还有更细节的理解UP主暂时看不懂了,,,

实际应用后,作者发现这一正则项可以产生更加可靠的模型
在这里插入图片描述
上图展示了原本的 StyleGAN 与 加了 Path Length Regularization 后的 StyleGANPPL 分布,发现整体 PPL 降低了。
这是作者的第三个技术创新点:

Path Length Regularization

3. Progressive Growing Revisited

尽管渐进式的图像生成对于合成高分辨率图像具有优势,但是它产生了特别的 artifacts!
其中最关键的是:

the progressively grown G appears to have a strong location preference for details

会偏向于钟爱局部的细节,即对不同的图像共享同样的细节模式(e.g. eyes, teeth, etc.)
这就直接导致了上面的动图反映的第二个问题。作者认为这是因为:

在 progressively 的训练中,每一个 resolution 下的输出都临时充当了最终输出,这就要求每一层都尽可能产生足够多的细节,从而中间层具有很高的频率,(但因为在较低层的时候模型本身(capacity)不够大,无法兼顾细节与多样性;最终妥协)导致了 shift invariance.

为了消除这种 artifacts,我们需要采用更加强大的生成器和鉴别器的结构取消渐进式的训练策略

  • Skip Connections
  • Residual Networks
  • Hierarchical Methods
    作者给了一些优秀的网络结构的例子,如下图:
    在这里插入图片描述
    其中,上面是 G G G,下面是 D D D
    总共就有 3 × 3 = 9 3\times 3=9 3×3=9 种搭配,作者分别做了实验:
    在这里插入图片描述

最后得到的搭配是: G G G --Skip Connections; D D D --Residual Blocks。(如上图的两个绿色的网络结构所示)
这里是本文的第四个创新点:

No Progressive,New Artich.


也确实解决了 shift invariance 的问题。
在这里插入图片描述

针对选择的生成器,作者还做了进一步的可视化。
11
下一层的图像输出是前面所有层图像上采样后累次加和得到的。
随着训练的进行,作者计算了每一层的输出的 rgb 图像的像素值的标准差,归一化后画图,得到:
在这里插入图片描述
我们先看左图,发现随着训练的进行,最终图像的生成越来越依赖于更高分辨率层的合成图像。


但是,到最后 5125 × 512 5125\times 512 5125×512 这一层的贡献大于 1024 × 1024 1024\times 1024 1024×1024 这一层,这是不合理的,我们猜测这是因为:超出了模型本身的能力(capacity)。
于是,作者做了新的实验,将模型从 6 4 2 64^2 642 102 4 2 1024^2 10242 的层的输出通道数翻倍,再画一次图,发现现在到最后是 102 4 2 1024^2 10242 层发挥主要作用。
这是本文的第5个技术创新:

Large Networks

4. Projection of Images to Latent Spaces

-原来的 StyleGAN 对合成的图像重新投影回到隐空间得到 style + noises 后再映射回图像域,前后结果差别很大,如背景!
-改进的 StyleGAN 对合成的图像重新投影回到隐空间得到 style + noises 后再映射回图像域的结果,几乎没有差别。
-改进的 StyleGAN 对真实的图像投影到隐空间得到 style + noises 后再映射回图像域的结果,差别不大。

这说明本文的方法提高了模型的平滑度(Smoothness)。

结果


可视化结果
在这里插入图片描述
小女孩坐镇本文!
量化结果
在这里插入图片描述
不说明了,就是各种优秀,各种吊打 StyleGAN,尽管作者和团队是同一批人,大佬的最高境界是,没有对手,只能双手互博!

其他技术原理


Inverse StyleGAN

作者在本文提出了新的 projection 的方法,承蒙UP太蠢,有些看不懂,需要等待源代码,届时补上,这里只写了一个基本的原理。

目的描述
给定一张真实的图像 I I I,我们希望得到它在 StyleGAN G G G 的源域 latent space 中的位置,即希望得到 w ∗ ∈ W w^*\in W wW 使得
G ( w ∗ ) = I G(w^*)=I G(w)=I 成立。
Algorithm
Algorithm 1
原理就是迭代优化

'''
1. 随机初始化 w
2. 直到收敛(loss 变化小于给定阈值)或者超过指定的最大迭代次数,
    2.1 计算 G(w) 与目标 I 的 difference(上面的公式说明,该 diff 由 perceptual loss 和 pixel-wise 的 L2 正则 组成)
    2.2 反向传播计算关于 w 的梯度
    2.3 更新 w
'''

具体参考文章:Image2StyleGAN: How to Embed Images Into the StyleGAN Latent Space?

Directional Generation

对于 controlable generation 的最直接的表现是:我们对 latent space 中选择一个 vec w w w 经过 G G G 后得到一张图像 I I I
然后我们改变对 w w w 的某几个元素做线性/非线性的增幅,我们可以预料到图像 I I I 的某些属性将怎样变化,如我们现在要让合成的 A 笑起来!

假如我们把不同表情下的人看作是不同的域,那么我们可以从分类的角度去看。

-一维-二分类
改变一个样本的分类,需要对样本在第一维度上偏移; + / − Δ x +/-\Delta x +/Δx
-二维-二分类
改变一个样本的分类,需要对样本在两个维度上偏移; + / − ( Δ x , Δ y ) +/-(\Delta x,\Delta y) +/(Δx,Δy)
在这里插入图片描述高维-二分类
其中,蓝色部分是一个已训练好的多分类器。
假如我们现在有10张生成的人脸图像,我们记录下它们的10个 512-dim 的 latent code,在多分类器前面加一层FC,让着10个 latent code 一行一行排成一个 10 × 10 10\times 10 10×10 的矩阵作为权重 W 0 W_0 W0
输出是一个向量,
但计算分类 loss 的时候只对目标类别计算 loss 并作梯度反传;
输入 1 × 10 1\times 10 1×10all-ones 向量。

现在我们可以理解,经过黄色到蓝色的第一层隐藏层,输出的值还是权重本身;
我们希望通过梯度反传的方法来实现对 latent code 的自动偏移( + ( a 0 w 0 + a 1 w 1 + . . . + a 511 w 511 ) +(a_0w_0+a_1w_1+...+a_{511}w_{511}) +(a0w0+a1w1+...+a511w511),其中 a i , i = 0 , 1 , . . . , 511 a_i, i=0,1,...,511 ai,i=0,1,...,511之间是复杂的非线性关系),
从而得到使得合成的图像变成目标的属性的 latent code。

实际应用的时候,我们只需要我们只需要在两个 latent code 之间线性插值即可。

写在后面


文章比较复杂,UP主写本文也比较赶,UP主也比较蠢,如果有哪些说的不对,还请各位大哥们不吝指出,诚挚感谢✌
原文TensorFlow 代码

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值