专栏首页天天P图攻城狮由生成模型到domain迁移:GAN、CGAN、StarGAN、CycleGAN、AsymmetricCycleGAN

由生成模型到domain迁移:GAN、CGAN、StarGAN、CycleGAN、AsymmetricCycleGAN

最近看一篇CVPR2018文章PairedCycleGAN: Asymmetric Style Transfer for Applying and Removing Makeup有感。总结一下GAN做domian transfer的思路脉络。

Base knowledge

Generative Adversarial Nets (GAN) :

GAN是一种训练生成模型的方法,包括两个互相对抗的模型:一个生成模型G用于拟合样本数据分布和一个判别模型D用于估计输入样本是来自于真实的训练数据还是生成模型G。生成器通过映射函数把噪声映射到数据空间,而判别器的输出是一个标量,表示数据来自真实训练数据而非G的生成数据的概率。

G和D非线性的映射函数,例如多层感知机等。

上图左边表示对于判别模型D,如果输入为真实的训练数据,那么模型最终的输出应该接近于1。上图右侧表示如果判别模型的输入为由G生成的样本,那么D的最终输出应该期望接近于0。

GAN模型没有损失函数,优化过程是一个“二元极小极大博弈(minimax two-player game)”问题,下面是模型的价值函数:

下图是GAN loss的实际代码拆解图:

输入T/F图片对,输出loss。D/G loss 交替训练

The key point is:

  1. Loss descent principle for both G and D
  2. When update G, we have fixed the D, the vice versa

Conditional GAN

给GAN模型加入一些条件约束,也就有了本文的工作Conditional Generative Adversarial Nets(CGAN)。在生成模型G和判别模型D中同时加入条件约束y来引导数据的生成过程。条件可以是任何补充的信息,如类标签,其它模态的数据等,这样使得GAN能够更好地被应用于跨模态问题,例如图像自动标注。

上图所示是CGAN的结构。

把噪声z和条件y作为输入同时送进生成器,生成跨域向量,再通过非线性函数映射到数据空间。

把数据x和条件y作为输入同时送进判别器,生成跨域向量,并进一步判断x是真实训练数据的概率。

在MNIST上以数字类别标签为约束条件,最终根据类别标签信息,生成对应的数字。

Applacation

图像转换或者图像的风格转换,顾名思义,是指把一副图像A按照另一幅 图像B的模式/风格进行转换的一个操作,例如 “白天->黑夜”,“晴天->雨天”等等;

Papers

在深度学习的方法广泛应用以后,使用深度学习方法比较早做这件事的就是使用CNN框架来做的,也就是2016cvpr的一篇文章“Image style transfer using convolutional neural networks”基于深度卷积神经网络的方法。当时出来的时候也比较火,也有一些方法在此类方法上的改进。

随着生成对抗网络(GAN)这种在图像生成上具有天生强大能力的网络结构的出现,使用GAN方法做图像生成又成为了一个比较流行的方法。列举几个截止到目前使用GAN为基础的方法:

  • pix2pix GAN (1611)
  • CycleGAN (1703)
  • DiscoGAN (1703)
  • PAN( Perceptual Adversarial Networks)感知GAN (1706)
  • StarGAN (1711)

这些方法的最终效果上可能都是为了进行图像转换,实现的形式不同而已。包括最近出来的StarGAN。

先简单看下各类方法一个效果:

Gatyes et.al. 祖师爷风格迁移的开山之作

pix2pix GAN

CycleGAN

DiscoGAN

PAN

StarGAN

Details

pix2pix GAN

先来看看第一篇文章pix2pix GAN,文章全名“Image-to-Image Translation with Conditional Adversarial Networks”

文章的框架如图所示:

来看一下这个框架,整个框架依托cGAN的思想,判别网络的输入是一个两张图组成给的数据结构,可以认为是图+label,可能有人会奇怪,这里的label为什么是一张图,这怎么是cGAN呢,我们前面说过,条件GAN接受的条件并不一定都是低维度的数值,也可以是广义的label,这里就可以认为右边的那个白色的图就是label,如果我们常见的GAN的判别器的输入是一个rgb三通道的图像的话,这里就好比输入的是一个6通道的两个图叠加的图。那么为什么要这么做呢?主要的原因应该还是为了满足生产器,其次是为了使得网络可以有效的训练。

可以看一下上述的判别器部分,此时我们白色的图像充当着噪声的功能,也就是可以把白色图像经过生成器变成黑色的图,同时黑色的图和白色的图叠加作为假样本来训练。这样我们可以发现,对于这一次的真假样本,因为白色的图(好比是label)是一样的,要想使得判别器无法判别真假,那么生成的黑色的图必须尽可能的与真样本的黑色的图像相似才满足条件吧,这也是为什么要把黑白两者叠加在一起作为样本输入的原因。

试想一下,假如只把黑色的当做真假判断条件而没有白色的,那么当把白色A图像送入生成器后,可能生成了黑色B图像,这个时候,黑色A与黑色B对于判别器来说都是真样本,所以判别器很容易没有误差了而生成器也是错的,达不到把白A生成白B的目的。

基于此可以看到这篇文章使用cGAN来实现图像转换的合理性,那么整个的目标函数可以表示如下:

G的构造

下面来看一下这个G是如何构造的,文章中展示了两种图像生成图像的典型结构,一个是自编码结构,一个是改进的U-Net结构:

图像的patch实验

这篇文章中另一个小的结构点是实验了PatchGAN的方式,也就是对于生成器或者判别器,不是以整个图像整个图像的当做输入,而是以小的patch来进行的。把一副图像划分为N*N个patch后,对于每一块进行上述的那个操作。可以发现当N=1的时候,相当于逐像素进行了,当N=256(图像大小为256的话),就是一幅图像一幅图像的操作。当然文章的实验发现当N=70的时候,效果最好。

其实当N是某一个固定块的一个最大的好处是,可以由小的图像生成大的图像,因为反正你都是对块进行操作的。比如你的原始图像都是256256的,每7070一个块进行的。训练的模型,假如有一个1000*1000的图像需要转换,是不是也可以转换,只需要把1000转成多个70的块,每个块单独转换即可。

CycleGAN

domain transfer 神作 论文:Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks17

作者提出了一种unpaired的无监督训练方法实现domain transfer。核心就是GAN Adversarial Loss + Consistency Loss。主要是后者实现解放unpaired 训练集的限制:

Star-GAN

要引入多domain,必须引入指向domain的监督。于是作者在判别网络中引入一个对domain分类的分类器。

生成网络采用cycleGAN形式。本文提出的网络结构:

作者将loss分成三部分:

c 代表target domian,c′ 代表original domain

但是做实验发现,会有一些鬼脸生成。这个可以尝试PGGAN的方法。

Asymmetric CycleGAN

妆容迁移的一篇文章

CVPR_2018: PairedCycleGAN: Asymmetric Style Transfer for Applying and Removing Makeup

主要结构继承CycleGAN,加了一个知道general domain transfer 的一个 Discriminator。

作者提到,CycleGAN也可以胜任makeup(妆容)迁移的任务,但是生成出来的太过于genreal:

“CycleGAN could in principle learn to apply a general make-you-look-good makeup to a no-makeup face, but it would not replicate a specific example makeup style.” “A second challenge, specific to our makeup problem, is that people are highly sensitive to visual artifacts in rendered faces”

人们对于妆容迁移苛刻、细致的追求导致一些传统的color transfer、style transfer的方法产生的 artifacts (like painting style) 不能容忍。所以,善于脑补(高度feature抽象与生成)的GAN会起到一些帮助作用。但是,某些时候我们做妆容迁移或者人脸属性编辑的时候,我们只想更改某一个部位的apperence,而不改变其他的部位。一般的GAN会将不该改变的部分迁移到source图片上,这并不是理想的结果。

CycleGAN可以解决这个问题。作为一个强化版双向conditional GAN,它拥有前向生成网络G与反向生成网络F,相应的,拥有监督两个domain的Discriminator Dx与Dy。Dx与Dy起到至关重要的作用,Dx区分 x  与 x′ , 而Dy区分 y 与 y′ 

 。这驱使两个Generator向正确的domain生成图片。

但是问题来了,在相对精细的妆容迁移任务上,GAN的diversity的弊端显的明显。意思是如何让CycleGAN适应任意风格的makeup输入、并且生成的图片不要有artifacts?从StarGAN的思路受到启发,可以设计一个多分类器Discriminator,来指导Gernerator生成多种风格的makeup。但是这样只能是有限种类的makeup。如何可以做到arbitrary makeup输入都可以迁移?本文提出用一个“*an auxiliary discriminator DS, which decides whether a given pair of faces wear the same makeup.”*这样的化巧妙的将范化任意种类的任务转换成判断一pair是否是一样的style这样的问题。甩锅给判别器,只要你train data里面有足够多的style 类型。

效果:

作者简介:Chaos?, 天天P图 iOS 工程师


文章后记 天天P图是由腾讯公司开发的业内领先的图像处理,相机美拍的APP。欢迎扫码或搜索关注我们的微信公众号:“天天P图攻城狮”,那上面将陆续公开分享我们的技术实践,期待一起交流学习!

加入我们 天天P图技术团队长期招聘: (1) 深度学习(图像处理)研发工程师(上海) 工作职责

  • 开展图像/视频的深度学习相关领域研究和开发工作;
  • 负责图像/视频深度学习算法方案的设计与实现;
  • 支持社交平台部产品前沿深度学习相关研究。

工作要求

  • 计算机等相关专业硕士及以上学历,计算机视觉等方向优先;
  • 掌握主流计算机视觉和机器学习/深度学习等相关知识,有相关的研究经历或开发经验;
  • 具有较强的编程能力,熟悉C/C++、python;
  • 在人脸识别,背景分割,体态跟踪等技术方向上有研究经历者优先,熟悉主流和前沿的技术方案优先;
  • 宽泛的技术视野,创造性思维,富有想象力;
  • 思维活跃,能快速学习新知识,对技术研发富有激情。

(2) AND / iOS 开发工程师  (3) 图像处理算法工程师 期待对我们感兴趣或者有推荐的技术牛人加入我们(base 上海)!联系方式:ttpic_dev@qq.com

本文分享自微信公众号 - 天天P图攻城狮(ttpic_dev)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android P之Smart Linkify

    如果是自定义模式,则需要调用上面的方法(方法很多,未完全列出来),其核心就是通过正则去匹配,所以这种自定义模式必须要传入一个Pattern值。

    天天P图攻城狮
  • iOS基础开发实践:iMessage Extension浅析

    天天P图攻城狮
  • 例说 Constraint Layout:初探

    谷歌的墙裂推荐,标志着 CL 布局的技术已经发展地成熟了,之前还在持观望态度的我们,是时候来深入了解一下这个 Android 布局的终极武器了。

    天天P图攻城狮
  • CVPR 2018摘要:第一部分

    在Neuromation,我们一直在寻找有助于我们的研究的新的有趣想法。 还有什么比顶级会议更适合寻找它们的地方。 我们已经在CVPR(计算机视觉和模式识别)会...

    AI研习社
  • 一键空中“画”窗户!MIT和IBM联合发布“GAN 绘画工作室”

    是的,又是GAN再一次不负众望,一家由麻省理工学院和IBM团队建立的“GAN 绘画工作室”,可以自动生成逼真摄影图像并编辑其中对象的系统。

    大数据文摘
  • [计算机视觉论文速递] 2018-07-05 GAN专场

    这篇文章有4篇论文速递,都是GAN方向,包括根据文本生成图像和多域图像生成等方向。其中一篇是IJCAI 2018。

    Amusi
  • 一行代码,Pandas秒变分布式,快速处理TB级数据

    刚刚在Pandas上为十几KB的数据做好了测试写好了处理脚本,上百TB的同类大型数据集摆到了面前。这时候,你可能面临着一个两难的选择: 继续用Pandas?可能...

    量子位
  • python实现模糊匹配

    题目:模糊匹配, ‘?’代表一个字符, *代表任意多个字符。给一段明确字符比如avdjnd 以及模糊字符比如*dj?dji?ejj,判断二者是否匹配。若能匹配输...

    py3study
  • 发布vue组件npm包

    其实很早之前就想尝试着写一写vue组件然后发布npm包,这次借着公司开发新项目,于是封装了一个Toast组件。

    wade
  • 不到50行代码实现一个能对请求并发数做限制的通用RequestDecorator

    在开发中,我们可能会遇到一些对异步请求数做并发量限制的场景,比如说微信小程序的request并发最多为5个,又或者我们需要做一些批量处理的工作,可是我们又不想同...

    嘿嘿嘿

扫码关注云+社区

领取腾讯云代金券