最近,多项研究采用了生成对抗网络(Generative Adversarial Networks, 简称GANs)这一技术来生成分辨率为1024x1024的高清图片。超级逼真的人脸、动物和其他算法生成的图像令人惊叹不已,要知道,这项技术出现也不过短短几年。从分辨率低,像素差的图片到如今栩栩如生的高清画质,在很短的时间内就实现了质的飞跃:这一领域进步多大,请看下图。
生成式对抗网络技术人脸处理实例
这一领域相关度最高的研究是英伟达的 StyleGAN和谷歌的BigGAN。
要生成高质量的图片需要极高的计算能力,所以目前仍不是个可以轻松解决的问题。因此,本文将介绍如何在不使用昂贵硬件的前提下利用GANs处理高清图片,这对手上没有高级显卡(GPU)的人来说是一个绝好机会。本文讨论的所有内容都可以在谷歌的Colaboratory上找到,该平台提供了免费GPU以供大众完成自己的机器/深度学习项目。
目标
我们要使用一个很特别而简单的GAN结构来完成任务,在两个高清图片之间进行风格转换。此外,还会将一张普通的高清风景图片编辑成梵高的风格。近几年在计算机视觉领域,风格转换非常流行。
《艺术化的神经网络算法》引领了这股潮流,该论文在事先测试好的卷积网络中对图片进行内容和风格上的调整。虽然这种方法能处理高清图片,但它只能用一张图像作为参照,比如说,它只能用《星夜》作为梵高整体绘画风格的参照,这不是我们想要的结果。
论文中关于风格迁移的实例
生成对抗网络技术(GAN)需要大量图片作为输入数据才能完全捕捉画家的风格,CycleGAN这篇论文提到了很多关于风格迁移的有趣发现。
CycleGAN风格迁移实例
然而,调试GANs对计算机配置要求很高:只有高阶硬件再花上很长的调试时间才能处理这一代高分辨率图片。希望本文介绍的方法能在处理高清图片方面帮助到大家。
梵高的作品
处理成梵高风格的高清图片
具体步骤如下
建立模型
这一步的目标是实现图像到图像的转换(从A域到B域)。可以通过很多方法来实现,也有很多网络模型,其中最有名的可能就是CycleGAN,也有很多与这个话题相关的论文。
本文在孪生网络里自定义了一个模型作为鉴别器,还采用了一个很特别但是非常简单的损失函数。选择这个方法的原因是每一个损失项都不那么依赖于每个像素之间的差异:这就意味着网络在生成高清图片时没有几何限制,从而能编辑出画面更加生动的图片。(这个结论在本例中成立。)
下面将简单介绍孪生生成式对抗网络(Siamese GAN)的架构。
孪生生成式对抗网络(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模型:裁剪、编辑、组合
Combo模型的输出就变成了鉴别器的输入,并且输入数据的大小变成了之前的两倍。这点轻微的调整不会占用太多计算时间,并且可以有效解决之前的问题。具体方法如下:
现在生成器必须生成边缘和颜色都保持一致的图片,否则鉴别器无法将这些图片识别为真实图片,这样就无法帮助生成器进行优化。具体来讲,对每张有4个边界的SxS图片,生成器必须要生成非常逼真的图片,即便是一个边界处理得不好都会毁掉增长2x2图像的真实感。
测试实例(从左到右):A域的图片,编辑后的图片(AB), B域的图片
“全家桶”
为了保证目前为止所有步骤都清楚明了,再复习一下整个网络如何运行的。
我们的目的是将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图像再输入生成器就能得到一张赏心悦目且风格统一的高清图片了。
高清图片的编辑:虽然并不完美,但笔触十分逼真,图像也很连贯。网络环境越好、性能越好的情况下图片分辨率越高。
结语
本文介绍的方法仍存在一些问题。
如果选择了分辨率极高的图片,那么用来调试网络的更小尺寸的图片可能里面没有任何相关信息,很可能就是纯色、单一像素的图片,这样的调试就没有任何实际意义:生成器和鉴别器都需要处理一定的信息。鉴别器必须根据其内容进行编程,如果数据内容没有意义的话,这个过程中可能会出现一些问题。
失败案例:生成器在一些区域混淆了风格不同的颜色和图形
即使测试成功,把多个高分辨率的图片组合到一起时,虽然每一部分的风格进行了转换,但对一整张高清图片来讲远远不够,最后的结果往往和原图差不多,只变换了一下颜色。
实验中发现,测试阶段使用低分辨率的高清数据库,要编辑的时候再切换为原大小的高清图库的操作能有效解决第一个问题。
这种方法还有更多内容有待开发:除传统风格转换以外的其他图像编辑也是可能实现的。要知道,这个例子中的生成器并不知道图片的原貌是什么样的,只能识别分辨率比较低的图片。所以,如果能给生成器提供更多内容,比如编码后的“内容向量”,就能衍生出各种各样的其他用法,为更复杂的内容为导向的高清图片编辑开启无限可能,比如由一种图像转换成另一种图像、人脸、或动物等。
所以,仍有无限可能等待发掘。
推荐阅读


【GANs】将普通图片转换为梵高大作相关推荐

  1. 用生成对抗网络,将普通图片转换为梵高大作

    全文共4175字,预计学习时长8分钟 最近,多项研究采用了生成对抗网络(Generative Adversarial Networks, 简称GANs)这一技术来生成分辨率为1024x1024的高清图 ...

  2. 用python画梵高星空-python 梵高

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 对于一个视频来说,只需要将每一帧都转换后输出,并按照一定的时间间隔清屏. ...

  3. 教你从头到尾利用DL学梵高作画:GTX 1070 cuda 8.0 tensorflow gpu版

    教你从头到尾利用DL学梵高作画 作者:七月在线开发/市场团队中的三人,骁哲.李伟.July.本教程主要由骁哲撰写,李伟负责Linux命令部分. 时间:二零一六年九月二十五日 配置:GTX 1070 c ...

  4. 教你从头到尾利用DL学梵高作画

    教你从头到尾利用DL学梵高作画 作者:七月在线开发/市场团队三人,骁哲.李伟.July.本教程主要由骁哲撰写,李伟负责Linux命令部分. 配置:GTX 1070 cuda 8.0 Ubuntu 14 ...

  5. 教你从头到尾利用DL学梵高作画 GTX 1070 cuda 8 0 tensorflow gpu版

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 教你从头 ...

  6. 利用OPENCV创作梵高艺术风格图片

    OpenCV is a library with 20 years of continuous development under its belt. The age of introspection ...

  7. python风格变换图片_利用神经网络轻松把照片转换成梵高风格

    在今天的文章中,我们将实现风格转换效果. 为了做到这一点,我们必须更深入地理解卷积神经网络及其各层是如何工作的. 在本文的最后,您将能够创建并运行一个风格转换程序. 什么是风格转换 在我们开始我们的风 ...

  8. Python机器学习案例|梵高的《星空》图片压缩

    Python机器学习案例:梵高的<星空>图片压缩 01 案例背景 本案例将奇异值分解用于处理图像压缩任务.要压缩的图片如图所示,是梵高的作品<星空>. 02 实现代码 Pyth ...

  9. python风格变换图片_【人工智能】python图片风格迁移,来欣赏梵高风格的石原里美吧!...

    图像的风格迁移,心心念念好久了啊! 简单几个步骤,就可以转换图片风格啦. 1. 在github下载模型,模型后缀名是 t7,新建 model 文件夹用来存放模型 2. 新建 fengge.py 文件, ...

最新文章

  1. 形态学滤波:腐蚀与膨胀(浅谈)
  2. windows查看系统信息方法
  3. python的image读取的图片是什么类型的-python如何实现读取并显示图片(不需要图形界面)...
  4. wxWidgets:wxDC类用法
  5. Zookeeper工作原理(详细)
  6. NMI watchdog: BUG: soft lockup - CPU#2 stuck for 23s!
  7. ES6系列:什么是ES6? 新手应该怎么理解
  8. 随想录(我们的竞争力)
  9. 传统IT正在被颠覆,下一个风口会是互联网+吗?
  10. Vue:解决安装Vue Devtools报错Error: Cannot find module@vue-devtools/build-tools解决办法
  11. Ubuntu 16.04虚拟环境virtualenv搭建
  12. Improving Opencv11 Extract horizontal and vertical lines by using morphological operations
  13. 分布式事务之基础概念篇
  14. html页面导出pdf截断问题,vue页面生成pdf且避免分页截断处理
  15. 浅析R语言单因素方差分析中的多重比较
  16. 情人节程序员用HTML网页表白【粉色烂漫的七夕情人节专题页面】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  17. java分割图片为九宫格
  18. R及Rstudio下载安装教程
  19. Spring Cloud Zuul API 网关服务
  20. Synchronized锁的使用

热门文章

  1. 粗糙漫画网站(真的粗糙)之首页设计
  2. TIA博途软件中程序编辑区标题上的收藏快捷指令取消了,如何恢复显示?
  3. Sql 从一个表往另一个表里插数据
  4. c语言二级编程实例,二级c语言编程 -实例
  5. strassen矩阵乘法 java_矩阵乘法Strassen算法
  6. java ca 验证失败,Apache CURL错误SSL:CA证书集,但禁用证书验证
  7. 高中计算机奥林匹克竞赛试题及答案,答案来了!2020年第36届全国高中数学奥赛决赛完整试题和参考答案...
  8. 聊聊前端开发日常的协作工具(全)
  9. 机器人产业化给导电环行业带来的机遇
  10. UG模具:简单的运动仿真!只需七步,就让轮子转起来!