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 6.29

    今天是学习Java的第一天. 学习内容:了解了JDK的下载和安装: 学会了如何配置Path环境变量及安装eclipse: 执行了HelloWorld案例: 在Java中关键字需要小写,Java中最基本 ...

  2. [源码解析] PyTorch分布式优化器(2)----数据并行优化器

    [源码解析] PyTorch分布式优化器(2)----数据并行优化器 目录 [源码解析] PyTorch分布式优化器(2)----数据并行优化器 0x00 摘要 0x01 前文回顾 0x02 DP 之 ...

  3. Flink(三)【核心编程】

    目录 一.Environment 二.Source 从集合读取数据 从文件读取数据 从kakfa读取数据(常用) 自定义数据源 三.Transform map Rich版本函数 flatMap key ...

  4. org.apache.hadoop.hive.ql.metadata.HiveException: Internal Error: cannot generate all output rows for a Partition解决

    自己在路径访问明细表开发时,写的sql如下 SELECT guid, sessionid, event['url'] as page, `timestamp` as ts, row_number() ...

  5. 100个Shell脚本—【脚本6】拷贝目录

    [脚本6]拷贝目录 编写shell脚本,把/root/目录下的所有目录(只需要一级)拷贝到/tmp/目录下: 一.脚本 #!/bin/bash cd /root list=(`ls`) for i i ...

  6. Android 清除本地缓存

    主要功能:清除内.外缓存,清除数据库,清除Sharepreference,清除files和清除自定义目录 public class DataCleanManager { //清除本应用内部缓存(/da ...

  7. oracle中注释都是问号?中文显示不出来问题

    本人在工作中需要把开发上的库恢复到自己的虚拟机里面,然而捣鼓了许久建立好数据库之后,在使用建表语句初始化表的时候,发现注释都是????? 然后一脸懵逼不知何解,网上一大堆是说修改环境变量 NLS_LA ...

  8. AFNetworking 网络错误提示data转换字符串

    AFN在进行网络交互时,有时候会碰到返回502.500.404的时候.后台的总需要你配合他查出问题所在.但是AFN在返回数据序列化时解析错误只会转成NSData类型的数据,如果直接扔给后台Data的数 ...

  9. NSURLSessionDownloadTask实现大文件下载

    - 4.1 涉及知识点(1)使用NSURLSession和NSURLSessionDownload可以很方便的实现文件下载操作 第一个参数:要下载文件的url路径 第二个参数:当接收完服务器返回的数据 ...

  10. 【Java 与数据库】How to Timeout JDBC Queries

    How to Timeout JDBC Queries JDBC queries by default do not have any timeout, which means that a quer ...