人员信息

主讲嘉宾

姓名:朱俊彦(Jun-Yan Zhu)

现状:麻省理工学院博士后(PostDoc at MIT),计算机科学与人工智能实验室(Computer Science and Artificial Intelligence Laboratory, CSAIL)

个人主页:http://people.csail.mit.edu/junyanz/

图形学中的尝试:趁手的武器 or 白费功夫?

在传统的图形学管线(pipeline)中,输出图像需要经过建模、材质贴图、光照、渲染等一系列繁琐的步骤(见下图)。

现在大家看到了Deep Learning的潜力,那我们自然的就有个想法:有没有可能使用Deep Learning简化计算机图形学(Computer Graphics)的研究呢?

一个直接的想法是把DNN“倒过来用”。之前的DNN可能是输入一幅图像,输出一个标签(比如说猫),那我们能不能输入“猫”这个字,输出一张猫的照片呢?

很遗憾,答案是No!因为这种任务实在太复杂啦!我们很难让DNN凭空输出图像这样的高维数据(High dimensional data)(这里的“高维”可以理解成数据量大)。实际上,在很长一段时间里,DNN只能输出数字这种简单的、低分别率的小图像,就像下面这样:

而想要生成想游戏场景这类的图片,这种方法根本没用。所以,我们必须得想出更厉害滴东西完成这项任务(使命感爆棚)!

GAN就完了?Naive!

于是…在月黑风高的某一天(画风逐渐跑偏),一个叫做生成对抗网络(Generative Adversarial Network)——也就是大名鼎鼎的GAN——的东西横空出世。作者是下面这位小哥和他的小伙伴们:

那么,我们该怎么GAN出图像呢?且听我细细道来~

一般来说,GAN中包含两种类型的网络GGG和DDD。其中,GGG为Generator,它的作用是生成图片,也就是说,在输入一个随机编码(random code)zzz之后,它将输出一幅由神经网络自动生成的、假的图片G(z)G(z)G(z)。

另外一个网络DDD为Discriminator是用来判断的,它接受GGG输出的图像作为输入,然后判断这幅图像的真假,真的输出1,假的输出0。

在两个网络互相博弈(金坷垃日本人:不邀哒架)的过程中,两个网络的能力都越来越高:GGG生成的图片越来越像真的图片,DDD也越来越会判断图片的真假。到了这一步,我们就能“卸磨杀驴”——丢掉DDD不要了,把GGG拿来用作图片生成器。

正式一点儿讲(上公式啦),我们就是要在最大化DDD的能力的前提下,最小化DDD对GGG的判断能力,这是一个最小最大值问题,它的学习目标是:

minGmaxDE[logD(G(z))+log(1−D(x))]\min\limits_{G} \max\limits_D \mathbb{E} [\log D(G(z)) + \log (1- D(x))]Gmin​Dmax​E[logD(G(z))+log(1−D(x))]

为了增强DDD的能力,我们分别考虑输入真的图像和假的图像的情况。上式中第一项的D(G(z))D(G(z))D(G(z))处理的是假图像G(z)G(z)G(z),这时候评分D(G(z))D(G(z))D(G(z))需要尽力降低;第二项处理的是真图像xxx,这时候的评分要高。

GAN的局限性

即便如此,传统的GAN也不是万能的,它有下面两个不足:

1. 没有**用户控制(user control)**能力

在传统的GAN里,输入一个随机噪声,就会输出一幅随机图像。

但用户是有想法滴,我们想输出的图像是我们想要的那种图像,和我们的输入是对应的、有关联的。比如输入一只喵的草图,输出同一形态的喵的真实图片(这里对形态的要求就是一种用户控制)。

2. 低分辨率(Low resolution)和低质量(Low quality)问题

尽管生成的图片看起来很不错,但如果你放大看,就会发现细节相当模糊。

怎样改善?

前面说过传统的GAN的种种局限,那么现在,我们相应的目标就是:

提高GAN的用户控制能力

提高GAN生成图片的分辨率和质量

为了达到这样的目标,和把大象装到冰箱里一样,总共分三步:

pix2pix:有条件地使用用户输入,它使用**成对的数据(paired data)**进行训练。

CycleGAN:使用**不成对的数据(unpaired data)**的就能训练。

pix2pixHD:生成高分辨率、高质量的图像。

下面分别进行详细叙述~

pix2pix

pix2pix对传统的GAN做了个小改动,它不再输入随机噪声,而是输入用户给的图片:

但这也就产生了新的问题:我们怎样建立输入和输出的对应关系。此时GGG的输出如果是下面这样,DDD会判断是真图:

但如果GGG的输出是下面这样的,DDD拿来一看,也会认为是真的图片QAQ…也就是说,这样做并不能训练出输入和输出对应的网络GGG,因为是否对应根本不影响DDD的判断。

为了体现这种对应关系,解决方案也很简单,你可以也已经想到了:我们把**GGG的输入和输出一起作为DDD的输入**不就好了?于是现在的优化目标变成了这样:

这项研究还是挺成功的,大家可以去这里在线体验一下demo,把草图(sketch)变成图片。

当然,有些比较皮的用户输入了奇形怪状的草图,然后画风就变成了这样:

应用

pix2pix的核心是有了对应关系,这种网络的应用范围还是比较广泛的,比如:

草图变图片[Isola, Zhu, Zhou, Efros, 2016]:

灰度图变彩色图[Isola, Zhu, Zhou, Efros, 2016]:

自动着色 Data from [Russakovsky et al. 2015]:

交互式着色[Zhang*, Zhu*, Isola, Geng, Lin, Yu, Efros, 2017]:

CycleGAN

pix2pix必须使用成对的数据进行训练。

但很多情况下成对数据是很难获取到的,比如说,我们想把马变成斑马,现实生活中是不存在对应的真实照片的:

现在我们就用Cycle-constraint Adversarial Network也就是CycleGAN解决这个问题。这种网络不需要成对的数据,只需要输入数据的一个集合(比如一堆马的照片)和输出数据的一个集合(比如一堆斑马的照片)就可以了。

但是(没错我又要说但是了),直接使用不成对的数据是不奏效的。网络会直接忽略输入,随机产生输出!所以,我们还得对网络增加**限制(constraint)**才行。

那怎么加限制呢?我们来思考一个现实问题。马克吐温认为,如果一把一段话从英文翻译成法文,再从法文翻译回英文,那么你应该得到跟之前原始输入的英文一样的内容。这里也是一样,如果我们把马变成斑马,然后再变回马,那么最后的马和开始输入的马应该是一样的。

下面讲一下具体技术细节。除了之前提到的把马变成斑马的网络GGG,我们还需要一个把斑马变回马的网络FFF。

那么,一匹马xxx用GGG变成斑马s=G(x)s = G(x)s=G(x),然后再用FFF把它变回马F(s)F(s)F(s),得到的马和一开始的马应该是一样的,也就是x=F(G(x))x = F(G(x))x=F(G(x))。

反过来,斑马变马再变回斑马也要满足要求,注意这一步最好不要省略。虽然理论上只用一个条件是可以的,但是现实实现中,有很多因素,比如计算的准备度,优化的问题,应用中都是把所有约束都加上。比如说a=b=ca=b=ca=b=c,理论上我们只要要求$(a-b)2+(a-c)2=0 ,但现实中我们都是做,但现实中我们都是做,但现实中我们都是做(a-b)2+(a-c)2+(b-c)^2=0$。

我们同时优化GGG和FFF,最后就能拿到一个想要的网络GGG。

CycleGAN为什么有效

CycleGAN成功的原因在于它分离了风格(Style)和内容(content)。人工设计这种分离的算法是很难的,但有了神经网络,我们很容易让它学习者去自动保持内容而改变风格。

效果展示

下面是效果展示环节~

马变斑马

两张图片分别是原来的马和GGG duang的一下变出的斑马:

橘子变苹果:

可以看到,CycleGAN能够比较准确的找到橘子的位置,并把它变成苹果。

图像风格的迁移:

游戏场景替换

这个应用就很酷了,它以一些德国城市的照片作为输入,成功替换了游戏GTA5中的场景!

失败例子

在输入骑马的普京大帝照片时,输出图像里把普京也变成了斑马。

这是因为,训练图像里并没有骑马的人,所以网络就傻掉了。

目前暂且的解决办法是先用Mask R-CNN做图像分割之后再针对马进行变化,不过这个效果也不好,因为人和马在图像上有重叠的部分。这个问题需要未来解决。

源代码

这是2017年github最受欢迎的项目之一,截止到本文写作时间(2018年9月),已经有5000+ Star了:

课程

CycleGAN现在非常火,以致于很多大学和在线平台都开设了它的课程:

用户的结果

下面是这些课程里的一些学生作业:

Twitter上也有一些很有趣的应用,比如把狗变成猫@itok_msi:

或者把猫变成狗:

再比如“吃鸡”游戏的风格转换@Cahintan Trivedi:

不过这里存在一个严重的问题:CycleGAN只能输出256p/512p的低分辨率图像。

pix2pixHD

是的,我们还剩一个悬而未决的问题:分辨率和图像质量。pix2pixHD就是用来解决这个问题的!

假设我们输入一张高分辨率的草图:

使用pix2pix,结果很差(之前说过,让网络产生高维数据输出很难):

pix2pixHD采取了金字塔式的方法:

先输出低分辨率的图片。

将之前输出的低分辨率图片作为另一个网络的输入,然后生成分辨率更高的图片。

这样,就把一个困难的问题拆分成了两个相对简单的问题~

最终的效果是,给定下面的高分辨率草图:

pix2pixHD可以**实时(real time)**产生这样的效果:

pix2pixHD也支持用户交互,比如加一辆车、添几棵树之类的:

pix2pixHD还有许多有趣的应用。

比如用草图生成高分辨率人脸:

再比如:

其他问题

目前生成的斑马视频帧与帧之间的纹理变化较大,为了解决帧之间的连续性问题,新的研究工作应运而生:Video-to-Video Synthesis。

它主要的解决思路有下面三个:

输入一段视频中的几帧,检查真假

把前面的帧当做后面帧的输入

使用“optical flow”,具体请看paper

总结

本文介绍了怎样用神经网络生成图片,我们使用pix2pix完成了基本任务,使用CycleGAN解决了输入数据不成对的问题,最后用pix2pixHD解决了图像分辨率和图像质量的问题。

pix2pixhd_一文读懂GAN, pix2pix, CycleGAN和pix2pixHD相关推荐

  1. 一文读懂GAN, pix2pix, CycleGAN和pix2pixHD

    人员信息 主讲嘉宾 姓名:朱俊彦(Jun-Yan Zhu) 现状:麻省理工学院博士后(PostDoc at MIT),计算机科学与人工智能实验室(Computer Science and Artifi ...

  2. [人工智能-深度学习-63]:生成对抗网络GAN - 图片创作:普通GAN, pix2pix, CycleGAN和pix2pixHD的演变过程

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  3. 如何用深度学习生成图片(GAN, pix2pix, CycleGAN和pix2pixHD)

    本文翻译.总结自朱俊彦的线上报告,主要讲了如何用机器学习生成图片. 来源:Games2018 Webinar 64期 :Siggraph 2018优秀博士论文报告 人员信息 主讲嘉宾 姓名:朱俊彦(J ...

  4. pix2pix, CycleGAN和pix2pixHD(没有公式,容易理解)

    pix2pix:有条件地使用用户输入,它使用成对的数据(paired data)进行训练. CycleGAN:使用不成对的数据(unpaired data)的就能训练. pix2pixHD:生成高分辨 ...

  5. ​一文读懂EfficientDet

    一文读懂EfficientDet. 今年年初Google Brain团队在 CVPR 2020 上发布了 EfficientDet目标检测模型, EfficientDet是一系列可扩展的高效的目标检测 ...

  6. 一文读懂图卷积GCN

    " 本文的内容包括图卷积的基础知识以及相关辅助理解的知识点,相信同学们看完后一定能平滑上手理解GCN!" 作者:苘郁蓁 来源:知乎专栏 郁蓁的机器学习笔记. 编辑:happyGir ...

  7. | 一文读懂迁移学习(附学习工具包)

    当一个CNN用于另一个领域,就使用到了迁移学习.迁移学习是一种用于模型领域泛化和扩展的工具. 文章链接:独家 | 一文读懂迁移学习(附学习工具包) 参考:当深度学习成为过去,迁移学习才是真正的未来? ...

  8. gcn 图卷积神经网络_复制一文读懂图卷积GCN

    首发于郁蓁的机器学习笔记 写文章 一文读懂图卷积GCN 苘郁蓁 ​ 阿里巴巴 算法工程师 ​关注她 唯物链丶.小小将等 480 人赞同了该文章本文的内容包括图卷积的基础知识以及相关辅助理解的知识点,希 ...

  9. 从实验室走向大众,一文读懂Nanopore测序技术的发展及应用

    关键词/Nanopore测序技术    文/基因慧 随着基因测序技术不断突破,二代测序的发展也将基因检测成本大幅降低.理想的测序方法,是对原始DNA模板进行直接.准确的测序,消除PCR扩增带来的偏差, ...

最新文章

  1. Android开发中adb启动失败adb连接异常的解决办法
  2. ccf-csp #201903-4 消息传递接口
  3. 详谈为何不要使用Windows的notepad编写shell
  4. 配置解压版本的Tomcat为Windows服务
  5. 二叉树的创建_大多数人都不会手写创建并遍历二叉树,一航这里帮你终结了
  6. div为空的时候 浮动没有效果_3种CSS清除浮动的方法
  7. 虚拟机安装rsync服务器配置,虚拟机安装rsync服务器配置
  8. mmc检测到此管理单元发生一个错误_理解这八大优势,才算精通单元测试
  9. 金属零件图像数据集_如何使用包装零件来开发易于维护的数据仓库解决方案
  10. Linux高级管理之ACL(访问控制列表)实战应用
  11. UWP Composition API - GroupListView(二)
  12. synchronized 线程同步
  13. 怎么看vray渲染进度_VRay,corona渲染器可恢复渲染设置,再也不怕渲染参数丢失了...
  14. python前端用什么写_Python 竟然也可以写网页前端了
  15. Android Launcher研究与开发——桌面的初步定制化
  16. maria安装包mysql_mariadb安装
  17. JAVA的0x1b分隔符_hive 特殊分隔符 0X1B
  18. 订阅消息 data.thing1.value is emtpy
  19. 完美显示html的版权符号
  20. Android学习日记(yzy):显示application并调用

热门文章

  1. Notepad++ 异常崩溃 未保存的new *文件列表没了怎么办?
  2. [原创]K8域控植入脚本生成器(内网渗透/RPC不可用解决方案)
  3. 解决centos下tomcat启动太慢 JDBC连接oracle太慢的问题
  4. eclipse部署的web项目没有添加到Tomcat的webapps目录下解决方法
  5. 使用多个JFrame:好的还是不好的做法? [关闭]
  6. sed和awk有什么区别? [关闭]
  7. 如何丢弃Git中未进行的变更?
  8. BigInteger和BigDecimal类
  9. NFC Basics(基本NFC)——翻译自developer.android.com
  10. sybase笔记 2762错误