GauGAN (SPADE) 水记 (seg2img)
根据语义mask生成图像
论文:
Semantic Image Synthesis with Spatially-Adaptive Normalization
https://arxiv.org/pdf/1903.07291.pdf
https://github.com/NVlabs/SPADE
https://github.com/NVlabs/SPADE
网络结构解析:
论文逐段详解:
CVPR 2019 | SPADE 阅读笔记(翻译)_ybacm的博客-CSDN博客_spade模型
模型架构
论文中的模型架构如下:
模型由三部分组成:Encoder,Generator,Discriminator。
Encoder用于从真实图像中获取与其分布有关均值mu和方差var,然后用得到的均值,方差和高斯分布产生的向量x做反归一化操作,最终得到一个包含真实图像信息的随机向量z。
Generator接收上一步产生的随机向量z,产生一个图像x_,在生成的过程中会不断地使用语义图去增强语义信息。
Discriminator接收的是语义图与图像连接产生的张量,经过一系列的处理会输出判断结果,如果语义图与Generator生成的图像相连接,那么就判断为假,反之如果语义图与真实的图像相连接,那么久判断为真。
经过生成器和判别器的不断博弈训练,最终我们输入一个语义图,生成器会生成与该语义图相对应的真实图像。
他们将谱标准化 Spectral Norm 应用于生成器和判别器中的所有层。
SPADE
这个 Sync Batch Norm 表示把所有 GPU 的数据综合起来计算 BN 。
SPADE是在Generator里使用的模型,一个模块会接收上一层的输出,以及语义图作为输入,上一层的输出经过BN,语义图经过resize后通过一个卷积层,然后再分别通过两个卷积层,这两个卷积层输出的结果分别和BN的结果做wise乘法以及加法得到输出。(文中说这种处理方式能够有效地弥补BN带来的语义信息的丢失,使得生成的图像能够更加逼真,因为语义图经过卷积层处理后得到的是表示语义信息的方差和均值,然后经过反归一化操作就向生成的图像中添加了语义信息)
论文的模型并没有直接使用SPADE,而是利用其构建了一个模块SPADE ResBlk
Generator中实际使用的就是和这个模块
Generator
下图是Generator的架构:
训练时输入的z向量是满足高斯分布的向量利用真实图经过Encoder得到的均值和方差经过反归一化处理得到的,利用训练好的模型生成图像时可以直接使用满足高斯分布的向量作为Generator的输入。
Encoder
Encoder的架构如下:
Encoder 的输出用 KL 散度约束到正态分布
Discriminator
Discriminator架构如下:
为什么要 SPADE
SPADE(Spatially-Adaptive Denormalization)空间自适应反标准化
条件标准化层(Conditional normalization layers)包括 Conditional BatchNorm 和自适应实例标准化(Adaptive Instance Normalization, AdaIN)两种方法。
这两种方法最初都用于风格迁移任务,后来被用于各种视觉任务。
条件标准化似乎就是先正常 Normalization 然后再用一个线性变换作为 Denormalization ,这个线性变换的参数是通过外部数据推断的,并且需要训练
SPADE 的 Spatially-Adaptive 的意思似乎就是像素级的意思,似乎之前的条件标准化都是 channel级的。
对 mask 做 Normalization 往往会丢失太多信息
因为分割掩码通常由几个均匀uniform的区域组成,所以在应用标准化时会出现信息丢失的问题。
如果输入多个不同的纯色的 mask (比如纯天空,纯草地),经过 Normalization 后就会统统变成一样的,这样语义信息就丢失了。
所以 SPADE 里面没有对 mask 用 Normalization
不过,论文里的 BN 应该不是普通的 BN ,而是 谱标准化(Spectral Norm)
GauGAN2
GauGAN第二代发布!训练超1000万张图片,两个词就能生成风景画!
增加了 text-to-image 的功能
似乎就是加大训练集,加大模型
GauGAN2用了1000万张图像,模型有 1 亿参数
而 GauGAN 只用了 100 万张图像训练
似乎是在 DALL-E 之后提出的模型
没找到相关的论文或者解析,这个可能是闭源的
试玩:
英伟达其他模型的试玩: