FineGAN

Singh K., Ojha U. & Lee Y. FineGAN: Unsupervised Hierarchical Disentanglement for Fine-Grained Object Generation and Discovery. CVPR, 2019.

利用GAN生成图片, 特别的是, 这是一种分层的生成方式: 背景 + 轮廓 + 色彩和纹理. 同时这个网络还可以用于无监督的分类.

image-20201202182811627

主要内容

具体流程如下图所示:

  1. 背景code (b) + 隐变量(z) 生成背景 (mathcal{B});

  2. 轮廓code (p) + (z) 生成掩码(mathcal{P}_m) 和轮廓(mathcal{P}_f);

  3. 色彩和纹理code (c) 生成掩码(mathcal{C}_m)和实例(mathcal{C}_f).

  4. 最后的图片为

[(1-mathcal{C}_m) odot[(1-mathcal{P}_m) odot mathcal{eta} + mathcal{P}_m odot mathcal{P}_f] + mathcal{C}_m odot mathcal{C}_f. ]

image-20201202182951093

隐变量

注意到, 整个网络用到了4个隐变量, 分别是(b, p, c)(z), 其中

[z sim mathcal{N}(0, 1) \ b sim mathrm{Cat}(K=N_b, p=1/N_b) \ p sim mathrm{Cat}(K=N_p, p=1/N_p) \ c sim mathrm{Cat}(K=N_c, p=1/N_c) ]

其中(N_b, N_p, N_c)皆为超参数.

另外, 基于一个直接理解, 即轮廓是较为抽象的信息, 同一类的物体的轮廓往往是一致, 但是同一类的物体要进行细分依赖于(c)即色彩和纹理, 所以作者假设(N_p < N_c), 多个(c)会共享一个(p)(虽然我不知道怎么实现这个的). 另外, 由于背景往往和物体有很大的联系, 比如鸭子飞到树上是比较少见的事情, 所以在训练的时候, 作者会选择令(b=c), 相当于少采样了一次. 但是在测试的时候, 这个约束可以不关, 我们完全可以让鸭子飞到太空上.

背景

利用背景信息, 其实一个很直接很直接的问题是, 怎么得到背景信息呢? 这实际上是一个分割问题, 作者会利用检测器将图片中的背景信息提取出来, 所以上面的(D_b, D_{bg\_aux}) 都是基于patch而非整个图片工作的. 这样, 对于生成器(G_b)生成的图片, 我们同样可以进行相同的操作了.

(D_b)便是普通的用于判断图片真假的判别器, 后者(D_{bg\_aux})似乎是用来判断这个patch是否是背景图片的, 这能够使得网络更好的生成背景图片.

轮廓

轮廓这部分生成器会生成掩码和实例, 并且之前的特征会继续传给下一个阶段使用.

要知道, 想要通过判别器(D)来训练生成器的一个很重要的条件是真实数据是存在的, 但是我们实际上并没有这部分数据(即轮廓), 所以作者采用了类似InfoGAN的info损失:

[mathcal{L}_{p\_info} = max_{D_p, G_{p, f}, G_{p,m}} mathbb{E}_{z, p} [log D_p(p|mathcal{P}_{f, m})], ]

其中(D_p)是用来近似条件分布的.

色彩和纹理

这部分是类似上面的, 因为我们同样没有色彩和纹理的数据, 同样有一个(mathcal{L_{c\_info}})的损失, 以及最后, 三个部分结合起来是最后的图片, 这部分可以直接用普通的adversarial loss (mathcal{L}_{c\_adv}).

用于无监督分类

这个倒是没什么特别的, 就是再训练(phi_p, phi_c), 将图片(mathcal{C}_j) 映射到隐变量(c, p), 并根据这些特征利用K均值分类.

代码

原文代码

原文地址:https://www.cnblogs.com/MTandHJ/p/14075964.html