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

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

主要内容

具体流程如下图所示:

  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{\beta} + \mathcal{P}_m \odot \mathcal{P}_f] + \mathcal{C}_m \odot \mathcal{C}_f.
\]

隐变量

注意到, 整个网络用到了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均值分类.

代码

原文代码

FineGAN的更多相关文章

  1. Fine-Grained(细粒度) Image – Papers, Codes and Datasets

    Table of contents Introduction Survey papers Benchmark datasets Fine-grained image recognition Fine- ...

随机推荐

  1. 日常Java 2021/9/29

    StringBuffer方法 public StringBuffer append(String s) 将指定的字符串追加到此字符序列. public StringBuffer reverse() 将 ...

  2. 商业爬虫学习笔记day2

    1. get传参 (1)url中包含中文报错解决方法 urllib.request.quote("包含中文的url", safe = "string.printtable ...

  3. 『学了就忘』Linux启动引导与修复 — 70、grub启动引导程序的配置文件说明

    目录 1.grub中分区的表示方法 2.grub的配置文件 3.grub的配置文件内容说明 (1)grub的整体设置 (2)CentOS系统的启动设置 1.grub中分区的表示方法 在说grub启动引 ...

  4. win10产品密钥 win10永久激活密钥(可激活win10所有版本)

    https://www.win7w.com/win10jihuo/18178.html#download 很多人都在找2019最新win10永久激活码,其实win10激活码不管版本新旧都是通用的,也就 ...

  5. haproxy动态增减主机与keepalived高级应用

    一:本文将详细介绍haproxy的配置使用以及高级功能的使用,比如通过haproxy进行动态添加删除负载集群中的后端web服务器的指定主机,另外将详细介绍keepalived的详细配置方法.配置实例及 ...

  6. centos7.4 64位安装 redis-4.0.0

    1.  下载 redis 包 链接:https://pan.baidu.com/s/1g1UE_GTreXoD9uOXB7G3HA 提取码:ug8p 2. 安装gcc.ruby .rubygems等环 ...

  7. 【Spring Framework】spring管理自己new的对象

    使用AutowireCapableBeanFactory手动注入 使用.newInstance();创建对象的话,如果其他对象都使用Spring Autowired,还需要手动创建所有依赖的Bean: ...

  8. 【Java 8】 Reduce方法

    一:reduce rudece方法:从一个流中生成一个值 三个重载方法: Optional<T> reduce(BinaryOperator<T> accumulator); ...

  9. Mybatis-plus报Invalid bound statement (not found)错误

    错误信息 org.springframework.security.authentication.InternalAuthenticationServiceException: Invalid bou ...

  10. SQLserver 2014自定义备份数据库

    一.管理-维护计划-维护计划向导-下一步 二.点击更改设置任务执行时间-确定-下一步 三.选择备份数据库完整-下一步 四.选择需要备份的数据库-然后确定 五.点目标自定义备份文件存储目录-下一步 六. ...