用生成对抗网络,将普通图片转换为梵高大作
全文共4175字,预计学习时长8分钟
最近,多项研究采用了生成对抗网络(Generative Adversarial Networks, 简称GANs)这一技术来生成分辨率为1024x1024的高清图片。超级逼真的人脸、动物和其他算法生成的图像令人惊叹不已,要知道,这项技术出现也不过短短几年。从分辨率低,像素差的图片到如今栩栩如生的高清画质,在很短的时间内就实现了质的飞跃:这一领域进步多大,请看下图。
这一领域相关度最高的研究是英伟达的 StyleGAN和谷歌的BigGAN。
要生成高质量的图片需要极高的计算能力,所以目前仍不是个可以轻松解决的问题。因此,本文将介绍如何在不使用昂贵硬件的前提下利用GANs处理高清图片,这对手上没有高级显卡(GPU)的人来说是一个绝好机会。本文讨论的所有内容都可以在谷歌的Colaboratory上找到,该平台提供了免费GPU以供大众完成自己的机器/深度学习项目。
目标
我们要使用一个很特别而简单的GAN结构来完成任务,在两个高清图片之间进行风格转换。此外,还会将一张普通的高清风景图片编辑成梵高的风格。近几年在计算机视觉领域,风格转换非常流行。
《艺术化的神经网络算法》引领了这股潮流,该论文在事先测试好的卷积网络中对图片进行内容和风格上的调整。虽然这种方法能处理高清图片,但它只能用一张图像作为参照,比如说,它只能用《星夜》作为梵高整体绘画风格的参照,这不是我们想要的结果。
生成对抗网络技术(GAN)需要大量图片作为输入数据才能完全捕捉画家的风格,CycleGAN这篇论文提到了很多关于风格迁移的有趣发现。
然而,调试GANs对计算机配置要求很高:只有高阶硬件再花上很长的调试时间才能处理这一代高分辨率图片。希望本文介绍的方法能在处理高清图片方面帮助到大家。
梵高的作品
具体步骤如下
建立模型
这一步的目标是实现图像到图像的转换(从A域到B域)。可以通过很多方法来实现,也有很多网络模型,其中最有名的可能就是CycleGAN,也有很多与这个话题相关的论文。
本文在孪生网络里自定义了一个模型作为鉴别器,还采用了一个很特别但是非常简单的损失函数。选择这个方法的原因是每一个损失项都不那么依赖于每个像素之间的差异:这就意味着网络在生成高清图片时没有几何限制,从而能编辑出画面更加生动的图片。(这个结论在本例中成立。)
下面将简单介绍孪生生成式对抗网络(Siamese GAN)的架构。
孪生生成式对抗网络由生成器和鉴别器组成。图片输入生成器,输出编辑过的图片。图片输入鉴别器,输出一个潜在矢量。
孪生鉴别器有两个功能:其一,指挥生成器生成画面更逼真的图片;其二,对于那些画面看起来不真实的图片,维持现有的图片内容,尽量保持和原图风格一致。
从A域和B域分别随机取图片并命名为A1, A2和B1,B2,X是一张随机图片,G(X)是生成器合成的图片,鉴别器需要将图片加工成矢量D(X),如:
1. D(B1)和一个固定点(以原点为例)之间的欧几里得距离必须非常近,与此同时,D(G(A1))必须离这个点非常远。相应地,矢量与固定点距离越近,能生成的图片越逼真。另外,在大多数研究对抗网络的例子中,生成器都要试着缩短从D(G(A1))到这个固定点之间的距离。
2. 如果要保留A和G(A)之间的“内容”,(D(A1)-D(A2))和 (D(G(A1)-D(G(A2))) 的余弦相似度必须保持一致。生成器和鉴别器都会参与这个步骤。
第一条根据矢量大小的变化而变化,第二条更侧重于矢量的角度。如果能实现从A域到B域之间的图像转换,目标就完成了。
现在有了一个模型,下面就一起探索怎样运用网络来得到高清图片吧。
图像提取
首先需要两个高清图库,在这个例子中,需要一个风景图库作为A域,以及梵高的作品图库作为B域。切记,图片越大,预处理时间就越长,比如裁剪、调整大小等,但这些操作并不会延长调试网络的时间。
然后需要选择输入生成器的图片大小:显然不能直接使用图片库里的高清图片,不然调试时间会变得很长,网络的规模也很大,这样就不能解决任何实质性的问题了。所以要选择足够小的尺寸(如像素为64*64),以便控制调试时间,即便是比如免费的谷歌Colaboratory等中等表现的图像处理器也能处理这些图片。
相应地,想必读者也已经考虑到了,输入生成器之前,这些图片需要预先处理,裁剪成更小的尺寸。输入图片后处理成为张量,以随机的SxS尺寸打包一同输入进网络。这听起来很简单,实际操作也非常简单!
现在,假设用这种方法训练生成对抗网络,直到生成器把所有尺寸调整好的图片都转换成了想要的“梵高风”,这时候问题就来了:如何才能将整张高清图片从A域转换到B域呢?
其实很简单,将图片像素分解为SxS(如果高清图片本来像素为BxB,就会出现(B//S)x(B//S)的格式),每个像素尺寸为SxS的图片都会经过生成器处理,最终组合到一起。
有一个更简单的方法,将图片的尺寸由大裁小,但调试GAN的过程中就会发现问题:通过这种方法调整后的图片再经过生成器转换到B域的时候,和原图放在一起很违和。结果显示,每个像素为SxS的图片中的轮廓都特别清晰,“奇迹”般地失败了。相对来讲,这算是小问题,即使使用以像素为单位的CycleGAN等方法也会出现同样的毛病。
如何解决这一问题?
惯用的方法简单易懂,并且贯彻了这篇文章想要传达的中心思想。
首先需要重新访问数据管道:先将图片处理成2Sx2S的大小(如果S=64,就需要裁剪成128x128大小),然后再转换成BxB高清图片。接着,设置好生成器之后,创建一个新模型,命名为Combo,功能如下:
1. INP:输入一批A域的图片,格式为2Sx2S;
2. INPCUT:将每个图片裁剪成4SxS的格式;
3. 将裁减好的4SxS的图片(INPCUT)输进生成器,得到OUTCUT(与INPCUT形状相同,但每个SxS图片都已经编辑过了);
4. 将OUTCUT里的每组4SxS图片组合起来,得到OUT(与INP形状相同,但每个2Sx2S图片都已经编辑过了);
5. 得到输出结果OUT。
Combo模型的输出就变成了鉴别器的输入,并且输入数据的大小变成了之前的两倍。这点轻微的调整不会占用太多计算时间,并且可以有效解决之前的问题。具体方法如下:
现在生成器必须生成边缘和颜色都保持一致的图片,否则鉴别器无法将这些图片识别为真实图片,这样就无法帮助生成器进行优化。具体来讲,对每张有4个边界的SxS图片,生成器必须要生成非常逼真的图片,即便是一个边界处理得不好都会毁掉增长2x2图像的真实感。
“全家桶”
为了保证目前为止所有步骤都清楚明了,再复习一下整个网络如何运行的。
我们的目的是将A类图片编辑成B风格。2Sx2S的图片大小是从A类和B类的高分辨率图片来的。A域的图片是Combo的输入,这个模型会先把图片裁剪成4份更小的尺寸,然后使用生成器(G)来转换它们,最后再组合到一起,称其为伪图像(fake images)AB。
接着是孪生鉴别器(D),鉴别器的输入数据大小是生成器输入数据大小的两倍(2Sx2S),其输出是大小为LENVEC的向量。
D将图片信息解码,处理成向量D(X),例如:
1. D(B)必须与原点相近(大小为VECLEN的零向量):
LossD1的值是D(B)到原点距离的欧几里得距离的平方,也就是Eucl(D(A))2
2. D(AB)必须与原点相隔一定的距离:
LossD2 = (max(0, cost — Eucl(D(AB))))²
3. 转换向量(D(A1)-D(A2))和(D(AB1)-D(AB2))必须是相似向量,才能保留图片的内容:
LossD3 = cos_similarity(D(A1)-D(A2), D(AB1)-D(AB2))
另外,生成器必须输出合成后的图片AB,比如:
1. D(AB)必须与原点距离相近:
LossG1 = Eucl(D(AB))²
2.转换向量(D(A1)-D(A2))和(D(AB1)-D(AB2))必须是相似向量(与鉴别器相同):
LossG2 = cos_similarity(D(A1)-D(A2), D(AB1)-D(AB2))
按照这个方法,生成器就能自主学习并生成指定风格的小尺寸图片,其边界不会有任何差错。所以,如果要编辑一整张高清图片,将其分成更小的SxS图像再输入生成器就能得到一张赏心悦目且风格统一的高清图片了。
结语
本文介绍的方法仍存在一些问题。
如果选择了分辨率极高的图片,那么用来调试网络的更小尺寸的图片可能里面没有任何相关信息,很可能就是纯色、单一像素的图片,这样的调试就没有任何实际意义:生成器和鉴别器都需要处理一定的信息。鉴别器必须根据其内容进行编程,如果数据内容没有意义的话,这个过程中可能会出现一些问题。
即使测试成功,把多个高分辨率的图片组合到一起时,虽然每一部分的风格进行了转换,但对一整张高清图片来讲远远不够,最后的结果往往和原图差不多,只变换了一下颜色。
实验中发现,测试阶段使用低分辨率的高清数据库,要编辑的时候再切换为原大小的高清图库的操作能有效解决第一个问题。
这种方法还有更多内容有待开发:除传统风格转换以外的其他图像编辑也是可能实现的。要知道,这个例子中的生成器并不知道图片的原貌是什么样的,只能识别分辨率比较低的图片。所以,如果能给生成器提供更多内容,比如编码后的“内容向量”,就能衍生出各种各样的其他用法,为更复杂的内容为导向的高清图片编辑开启无限可能,比如由一种图像转换成另一种图像、人脸、或动物等。
所以,仍有无限可能等待发掘。
留言 点赞 发个朋友圈
我们一起分享AI学习与发展的干货
推荐文章阅读
ACL2018论文集50篇解读
EMNLP2017论文集28篇论文解读
2018年AI三大顶会中国学术成果全链接
ACL2017 论文集:34篇解读干货全在这里
10篇AAAI2017经典论文回顾
长按识别二维码可添加关注
读芯君爱你
用生成对抗网络,将普通图片转换为梵高大作相关推荐
- 【GANs】将普通图片转换为梵高大作
最近,多项研究采用了生成对抗网络(Generative Adversarial Networks, 简称GANs)这一技术来生成分辨率为1024x1024的高清图片.超级逼真的人脸.动物和其他算法生成 ...
- [人工智能-深度学习-63]:生成对抗网络GAN - 图片创作:普通GAN, pix2pix, CycleGAN和pix2pixHD的演变过程
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- GAN (生成对抗网络) 手写数字图片生成
GAN (生成对抗网络) 手写数字图片生成 文章目录 GAN (生成对抗网络) 手写数字图片生成 Discriminator Network Generator Network 简单版本的生成对抗网络 ...
- python生成手写文字图片_使用生成对抗网络(GAN)生成手写字
先放结果 这是通过GAN迭代训练30W次,耗时3小时生成的手写字图片效果,大部分的还是能看出来是数字的. 实现原理 简单说下原理,生成对抗网络需要训练两个任务,一个叫生成器,一个叫判别器,如字面意思, ...
- 深度卷积生成对抗网络DCGAN——生成手写数字图片
前言 本文使用深度卷积生成对抗网络(DCGAN)生成手写数字图片,代码使用Keras API与tf.GradientTape 编写的,其中tf.GradientTrape是训练模型时用到的. 本文用到 ...
- 万字综述之生成对抗网络(GAN)
作者丨郭晓锋 单位丨爱奇艺 研究方向丨图像生成 前阵子学习 GAN 的过程发现现在的 GAN 综述文章大都是 2016 年 Ian Goodfellow 或者自动化所王飞跃老师那篇.可是在深度学习,G ...
- [论文阅读] (06) 万字详解什么是生成对抗网络GAN?经典论文及案例普及
<娜璋带你读论文>系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢.由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学 ...
- 深度学习之生成对抗网络(2)GAN原理
深度学习之生成对抗网络(2)GAN原理 1. 网络结构 生成网络G(z)\text{G}(\boldsymbol z)G(z) 判别网络D(x)\text{D}(\boldsymbol x)D(x) ...
- sagan 自注意力_请使用英语:自我注意生成对抗网络(SAGAN)
sagan 自注意力 介绍 (Introduction) In my effort to better understand the concept of self-attention, I trie ...
最新文章
- 【Qt】QWidget对样式表设置边框无效的解决方法
- c++语言static作用,详解c++中的 static 关键字及作用
- 好几天没戴工牌坐地铁了,受不了!
- Spring MVC实现Spring Security,Spring Stomp websocket Jetty嵌入式运行
- 【机器学习基础】SVM算法在项目实践中的应用!
- 实例分享--告诉你如何使用语音和自然语言控制智能家居
- 设计模式-创建型模式-模板方法
- atitit.资源释放机制--attilax总结
- c语言浮点数输出格式的控制,c语言输出格式控制
- php报修小程序,微信小程序报修管理系统
- 华为云学院新春大礼包:场景化微认证上新了!
- mysql服务重启后不见了_Win10更新后,MySQL服务莫名消失的问题
- Storage of multidimensional arrays based on arbitrary tiling
- 当兵的目标和计划_最新大学生征兵工作计划
- MacOS搭建golang开发环境
- SS中添加多用户失败
- 电源电路设计常用软件,哪个适合你的应用?
- 华工2018计算机网络随堂练习,计算机网络随堂练习-华工2019随堂练习
- no such column
- 新电脑的正确打开方式——(近万字图文并茂详细分步骤讲解)【万一那天你就有新电脑了呢】包括个性化·等你来解锁哦