前言
Style-GAN 由 Nvidia 的团队出品,一作 Karras 同时也是 PG-GAN 的一作,姑且看成 PG-GAN 的进化版吧,而且也是针对高质量的人脸的生成问题,代码参见 https://github.com/NVlabs/stylegan。
Style-GAN 的贡献主要有:
- style-based 的生成器结构。
- 两种衡量 GAN 的 disentanglement 程度的方法:Perceptual Path Length 和 Linear separability。

Style-Based 生成器

主要有三点特别的地方:
- 正态分布的噪声
首先通过一个八层的MLP得到
,再每层的 Conv 之后,
通过一个仿射变换
得到 style,style 作用在 AdaIN 之中。
- 在每个 Conv 之后,激活之前,图像要加入高斯噪声。
- 使用固定的可学习的数据开始生成,即图中的
Const 4x4x512。
- Style-Based
Style-Based Generator 的结构主要受到 Style-Transfer 之类的模型的启发,使用隐变量生成的 style 替代了 Style-Transfer 之类模型中注入的风格图像的特征(Style-Transfer 类的模型需要风格图像的特征作为监督信息)。
虽然除了[2]没怎么看过 Style-Transfer 方面的文章,但是还是有类似的地方,架构如下图,[2] 中虽然没有将风格图片的特征注入到生成器中,但是使用了风格图像的特征设计了 loss 。Style-GAN 提到之前的工作有 [3][4][5],AdaIN 的设计来源于[3]。

具体的操作如下:
- 将隐变量(噪声)
通过非线性映射到
,
,
由八层的MLP组成。
-
通过可学习的仿射变换
转化成
,由
控制 Conv 输出图片的AdaIN操作(Adaptive Instance Normalization),AdaIN操作如下:
其实就是先对图像进行Instance Normalization,然后控制图像恢复。Instance Normalization 是对每个图片的每个feature map进行归一化,
就代表 feature map,每个 feature map 需要
中的一个标量控制,所以
的大小都等于通道数。
def AdaIN(images, ys, yb):
""" 简单的 AdaIN 的计算过程的表示
"""
batch_size, C, H, W = images.size()
x = images.view(batch_size, C, -1)
std, mean = torch.std_mean(x, dim = 2)
std.unsqueeze_(dim = 2)
mean.unsqueeze_(dim = 2)
ysx = ys.expand((batch_size, C)).unsqueeze_(dim = 2)
ybx = yb.expand((batch_size, C)).unsqueeze_(dim = 2)
x = ysx * ( (images - mean) / std ) + ybx
return x.view_as(images)
这么做的 idea 是:用 和仿射变换
学习将
映射成系列的style ( from section 3),AdaIN 的作用是:改变原有图像的通道(feature map)的重要性 ( from section 3)。
- 高斯噪声
在每一个Conv 输出之后,加入随机的高斯噪声,首先噪声是单通道的,和图像同大小,通过一个 per-channel scaling factor (图中的B),也就是将噪声乘以不同的系数广播成和图像相同的通道数,然后和输出相加。
idea 是:以往的端到端的训练,如果模型在某一层要富于变化,它必须自己根据最开始输入传递过来的噪声的激活中得到随机的一些银子,所以会降低模型容量。而直接输入噪声就可以避免这个问题。(from section 3.2)
- 固定噪声
两种衡量 GAN 的 disentanglement 的方法
Disentanglement (解开纠结)就是希望得到包含若干线性子空间的隐变量的空间,通过控制隐变量,我们可以控制 GAN 生成不同属性的图片。衡量 disentanglement 本质是衡量隐空间对属性的生成是否线性。(当然对这里的理解我还需要阅读更多的文献)。
等到有时间再写吧。。。这里
其他
truncated trick
在图片生成时还使用到了 truncated trick,这个在BigGAN[6]中也有应用( from section, Appendix B ):
在图像生成的时候,限制采样的噪声 z 的大小,如果 z 太大(大于给定值),就重新采样,这样避免使用了比较极端的噪声生成,可以提高图片质量(当然在BigGAN中也提到会减少图片的多样性)。
Style-GAN 稍有不同的地方在于:
- 对于
的 truncate,作者也是提出了在均值左右 truncate,方法类似。
- 仅对 low-resolution 的
进行 truncate。
mix style
这里是比较有趣的地方,使用两组噪声,可以分别得到两张脸,但是从某一层级开始,以下的 style 使用
生成的 style,以上的 style 使用
生成的,可以生成不同尺度的特征融合的人脸。 层级越靠近输出层,使用
的 style 改变的特征尺度越小。( from section 3.1 )
效果也是比较惊人的,这里就不放图了。
启发:
noise 后接 非线性 MLP 再进行生成, MLP 变换后的噪声的 latent space 也许有更好的线性结构,更好控制不同属性图像的生成。(如文中使用两种方法对
和
两个 latent space 的线性进行衡量的结果所示)。
style-based 的结构,尤其是 AdaIN 的结构,隐约记得好像还有扩展成 AdaBIN 的,不记得在哪看的了。。
一点闲言碎语
还没试验过 Style-GAN,还不好对文中的几个 trick 效果下定论,而且感觉 trick 的先验不是很有说服力。
Reference
- A Style-Based Generator Architecture for Generative Adversarial Networks.
- Perceptual Losses for Real-Time Style Transfer and Super-Resolution.
- Arbitrary style transfer in real-time with adaptive instance normalization.
- Multimodal unsupervised image-to-image translation
- Learning concepts from different domains for mixture generation.
- Large scale GAN training for high fidelity natural image synthesis.
后言
文章是为了方便自己理解而写,所以难免有不清楚或错误之处、或者自创的方便理解的术语,如有错误,欢迎指正。