Press "Enter" to skip to content

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

 

最近,多项研究采用了生成对抗网络(Generative Adversarial Networks, 简称GANs)这一技术来生成分辨率为1024×1024的高清图片。 超级逼真的人脸、动物和其他算法生成的图像令人惊叹不已,要知道,这项技术出现也不过短短几年。 从分辨率低,像素差的图片到如今栩栩如生的高清画质,在很短的时间内就实现了质的飞跃: 这一领域进步多大,请看下图。

 

 

生成式对抗网络技术人脸处理实例

 

这一领域相关度最高的研究是英伟达的 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,就需要裁剪成128×128大小),然后再转换成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图片,生成器必须要生成非常逼真的图片,即便是一个边界处理得不好都会毁掉增长2×2图像的真实感。

 

 

测试实例(从左到右): 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图像再输入生成器就能得到一张赏心悦目且风格统一的高清图片了。

 

 

 

 

高清图片的编辑: 虽然并不完美,但笔触十分逼真,图像也很连贯。 网络环境越好、性能越好的情况下图片分辨率越高。

 

 

 

结语

 

本文介绍的方法仍存在一些问题。

 

如果选择了分辨率极高的图片,那幺用来调试网络的更小尺寸的图片可能里面没有任何相关信息,很可能就是纯色、单一像素的图片,这样的调试就没有任何实际意义: 生成器和鉴别器都需要处理一定的信息。 鉴别器必须根据其内容进行编程,如果数据内容没有意义的话,这个过程中可能会出现一些问题。

 

 

失败案例: 生成器在一些区域混淆了风格不同的颜色和图形

 

即使测试成功,把多个高分辨率的图片组合到一起时,虽然每一部分的风格进行了转换,但对一整张高清图片来讲远远不够,最后的结果往往和原图差不多,只变换了一下颜色。

 

实验中发现,测试阶段使用低分辨率的高清数据库,要编辑的时候再切换为原大小的高清图库的操作能有效解决第一个问题。

 

这种方法还有更多内容有待开发: 除传统风格转换以外的其他图像编辑也是可能实现的。 要知道,这个例子中的生成器并不知道图片的原貌是什幺样的,只能识别分辨率比较低的图片。 所以,如果能给生成器提供更多内容,比如编码后的“内容向量”,就能衍生出各种各样的其他用法,为更复杂的内容为导向的高清图片编辑开启无限可能,比如由一种图像转换成另一种图像、人脸、或动物等。

 

所以,仍有无限可能等待发掘。

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注