首页 > 卡通形象 > 头像生成器-图书递送 | AI Illustrator:如何使用基于PyTorch的生成对抗网络生成动漫头像?
2024
02-27

头像生成器-图书递送 | AI Illustrator:如何使用基于PyTorch的生成对抗网络生成动漫头像?

本文最初由《AI前线》发表。 原文链接为:图书快递| AI Illustrator:如何使用基于PyTorch的生成对抗网络生成动漫头像?

作者|陈云

编辑|娜塔莉

AI前线介绍:“2016年是TensorFlow元年,随着Google的大力推广,TensorFlow占据了各大媒体的头条。2017年初,PyTorch的出现引起了研究人员的高度关注。PyTorch简洁优雅,其独特的设计、统一的而易用的界面、快捷的速度和千变万化的灵活性给人留下了深刻的印象。

本文摘自《深度学习框架PyTorch介绍与实践》第七章。 它向读者解释了当前最流行的生成对抗网络(GAN),并带领读者从零开始实现一个动漫头像生成器,可以使用GAN生成多种风格。 动漫头像。 注意,文末有图书奖励! ”

生成对抗网络(GAN)是近年来深度学习中非常流行的方向。 卷积网络之父、深度学习资深人士LeCun Yan曾表示,“GAN是机器学习近10年来最有趣的想法”。尤其是近两年,GAN论文呈爆炸式增长GitHub上有人收集了各种GAN变体、应用、研究论文等,其中名字有上百个,作者还统计了随时间推移GAN论文发表数量的趋势,如图7-1所示,其中可见GAN的受欢迎程度。

图7-1 GAN论文数量月度累计图表

GAN原理介绍

GAN的开创性工作是被称为“GAN之父”的Ian Goodfellow于2014年发表的经典论文Generative Adversarial Networks。 在这篇论文中,他提出了一种生成对抗网络,并设计了第一个GAN实验——手写数字生成。

GAN 的灵感来自于一个突然的想法:

“我无法创造的东西,我就不明白。” (我无法创造的东西,我就不明白。)

——理查德·费曼

同样,如果深度学习无法创建图像,那么它就无法真正理解它们。 当时,深度学习已经开始征服计算机视觉的各个领域,并在几乎所有任务上都取得了突破。 然而,人们一直对神经网络的黑盒模型提出质疑,因此越来越多的人从视觉角度探索卷积网络学习到的特征和特征组合,而GAN则从生成学习的角度展示了神经网络的特性。 强大的能力。 GAN 解决了​​无监督学习中的一个众所周知的问题:给定一批样本,训练一个系统来生成相似的新样本。

生成对抗网络的网络结构如图7-2所示,主要包括以下两个子网络。

图7-2 生成对抗网络结构图

训练判别器时,需要使用生成器生成的假图片和来自现实世界的真实图片; 在训练生成器时,您仅使用噪声来生成假图片。 鉴别器评估生成的假图像的质量,提示生成器相应地调整参数。

生成器的目标是生成尽可能假的图片,以便判别器认为它是真实的图片; 鉴别器的目标是将生成器生成的图片与真实世界的图片区分开来。 可以看出,两者目标相反,在训练过程中相互竞争,这就是为什么被称为生成对抗网络。

上面的描述可能有点抽象,那么我们就以收藏齐白石作品的书画收藏家和赝画商为例来说明一下(齐白石的作品如图7-3所示)。 假漆经销商就相当于发电机。 他们希望模仿大师的原作,伪造画作来欺骗收藏家,然后高价出售。 书画收藏家希望能够辨别真品和赝品,让真品能够在世界上流通并销毁。 伪造。 这里的赝画商和收藏家交易的画作主要是齐白石画的虾。 齐白石的虾画可以说是画坛的代表作,一直受到世人的追捧。

图7-3 齐白石画虾真迹

在本案中,无论是赝品画贩还是书画收藏者都是新手,对真品和赝品的概念比较模糊。 赝品画商生产的赝品几乎都是随意涂鸦,书画收藏者的鉴别能力较差。 很多赝品被他视为真品,很多真品被他视为赝品。

首先,书画收藏家收集了市场上大量的赝品和齐白石大师的真迹,仔细研究对比,初步了解了画中虾的结构。 他明白,画中的生物有着弯曲的体形和一双类似钳子的“螯肢”。 ”,所有不符合这个条件的假画都会被过滤掉。 当收藏家用这个标准在市场上进行鉴定时,假画基本上无法欺骗收藏家,而假画经销商则损失惨重。 然而,一些假画贩子生产的赝品仍然具有欺骗性。 这些假货具有弯曲的形状和一对类似钳子的“螯肢”。 于是,仿冒画商开始修改仿制手法,在仿制作品中加入弧形形状和一把钳子状的“螯肢”。 除了这些特征之外,其他地方比如颜色和线条都是随机绘制的。 假冒油漆经销商生产的第一版假货如图7-4所示。

图7-4 假画商生产的第一版赝品

假画贩将这些画作投放市场出售时,很容易欺骗收藏家,因为画中有一个弯曲的生物,生物前面有一把类似钳子的东西,符合收藏家认可的真伪标准。 因此收藏家将其作为真品购买。 随着时间的推移,收藏家买回的赝品越来越多,损失惨重,于是他闭门研究赝品与真品的区别。 经过反复比对和比较,他发现,除了虾的形状是弯曲的之外,虾的触手很长,整个身体是半透明的。 虾的细节非常丰富,每一节虾都是白色的。

收藏家们完成学业后,又回到工作岗位,但赝品画商的造假技术并没有提高,他们制作的赝品很容易被收藏家识破。 于是,冒牌画商也开始尝试不同的画虾技法,但大多都徒劳无功。 然而,在众多的尝试中,仍然有一些赝品欺骗了收藏家。 假画贩发现,这些仿制品有长长的触手和半透明的身体,虾画非常细致,如图7-5所示。 于是,假画贩子开始大量仿制此类画作,并在市场上出售。 其中许多人成功地欺骗了收藏家。

图7-5 假画贩子制作的第二版赝品

这位收藏家再次损失惨重,被迫关店,以研究齐白石原作与赝品的区别,了解齐白石原作的特点,提高自己的鉴定技巧。 就这样表情包设计,通过收藏家和赝画贩子的博弈,收藏家从无到有,逐渐提高了辨别真伪的能力,而赝画贩子也不断提高了仿齐白石原作的水平。 收藏家利用赝品画商提供的赝品与原作进行比较,更好地欣赏齐白石画作的原作; 而仿冒画作经销商不断地努力提高仿冒水平,提高仿冒画作的质量,即使最终生产出来的仍然是赝品,但却非常接近正品。 收藏家和赝品画贩相互竞争,同时又不断鼓励对方学习进步,从而达到共同提高的目的。

在这个例子中,假画经销商相当于一个生成器,收集者相当于一个判别器。 生成器和判别器一开始都表现不佳,因为它们都是随机初始化的。 训练过程分为两个交替的步骤。 第一步是训练判别器(仅修改判别器的参数并修复生成器)。 目标是区分真品和赝品; 第二步是训练生成器(只修改生成器参数,固定判别器),使得生成的赝品能够被判别器判断为真品(被收藏家认为是真品)。 这两个步骤交替进行,分类器和判别器都达到了很高的水平。 训练结束时,生成器生成的虾图片(如图7-6)与齐白石的真实图片几乎没有区别。

图7-6 生成器生成的虾

接下来我们来思考一下网络结构的设计。 判别器的目标是判断输入图片是真还是假,因此可以将其视为二分类网络。 参考第六章的狗与猫的实验,我们可以设计一个简单的卷积网络。 生成器的目标是从噪声中生成彩色图片。 这里我们采用广泛使用的DCGAN(Deep Convolutional Generative Adversarial Networks)结构,即全卷积网络,其结构如图7-7所示。 网络的输入是100维噪声,输出是3×64×64图像。 这里的输入可以看作是100×1×1的图像,通过上卷积慢慢增大到4×4、8×8、16×16、32×32和64×64。 上卷积,或者说转置卷积,是一种特殊的卷积运算,类似于卷积运算的逆运算。 当卷积的stride为2时,输出将被下采样到输入大小的一半; 当上卷积的步长为2时,输出将被上采样到输入大小的两倍。 这种上采样的方法可以理解为图片的信息存储在100个向量中。 根据这100个向量描述的信息,神经网络首先在上采样的前几步中勾勒出轮廓和色调等基本信息。 上采样会慢慢细化细节。 网络越深,细节越详细。

图7-7 DCGAN中的生成器网络结构图

在DCGAN中,判别器的结构与生成器对称:生成器使用上采样卷积,判别器使用下采样卷积。 生成器根据噪声输出 64×64×3 的图片。 判别器根据输入的64×64×3图片输出该图片属于正样本和负样本的分数(概率)。

使用GAN生成动漫头像

本节将使用GAN来实现生成动漫角色头像的示例。 日本某科技博客网站上有一位博主(想必是一位2D爱好者)使用DCGAN向20万个动漫头像进行学习。 最后,他可以使用该程序自动生成动漫头像。 生成的图片效果如图7所示。-8所示。 源程序使用Chainer框架实现。 在本节中,我们尝试使用 PyTorch 来实现它。

图7-8 DCGAN生成的动漫头像

从网站爬取原图吉祥物设计,使用OpenCV截取头像,处理起来比较麻烦。 这里我们使用了知乎用户何志远抓取并处理的 50,000 张图像。 您可以从本书附带程序README.MD的百度网盘链接下载所有图片压缩包,并解压到指定文件夹。 需要注意的是,这里图像的分辨率是3×96×96,而不是论文中的3×64×64,因此需要对网络结构进行相应调整,使得生成图像的尺寸为96。

我们先看一下这个实验的代码结构。

接下来我们看一下 model.py 中生成器是如何定义的。

可以看出,发电机的构造比较简单。 只需使用nn.Sequential将卷积、激活、池化等操作拼接在一起即可。 这里需要注意ConvTranspose2d的使用。 当kernel size为4,stride为2,padding为1时,根据公式H_out=(H_in-1)*stride-2*padding+kernel_size,输出大小正好是输入大小的两倍。 最后一层使用内核大小 5、步长 3 和填充 1 将 32×32 上采样到 96×96。 这是本例中图像的尺寸,与论文中的64×64尺寸不同。 最后一层使用Tanh将输出图像的像素归一化为-1~1。 如果想要归一化为0~1,就需要使用Sigmoid。 接下来我们看一下判别器的网络结构。

可以看到,判别器和生成器的网络结构几乎对称,从卷积核大小到padding、stride等设置,它们几乎完全相同。 例如,生成器的最后一个卷积层的尺度是(5,3,1),判别器的第一个卷积层的尺度也是(5,3,1)。 另外,这里需要注意的是,生成器的激活函数使用了ReLU,而判别器则使用了LeakyReLU。 两者没有本质区别。 这里的选择更多的是一种经验总结。 每个样本经过判别器后,会输出一个0到1之间的数字,表示这个样本是真实图片的概率。 在开始编写训练函数之前,我们先看一下模型的配置参数。

这些只是模型的默认参数。 您还可以使用 Fire 等工具通过命令行传入它们来覆盖默认值。 另外,我们还可以直接使用opt.attr,还可以使用IDE/IPython提供的自动补全功能,非常方便。 这里大部分超参数设置都是从​​DCGAN论文中复制默认值。 经过大量的实验,作者发现这些参数可以更快地训练出一个好的模型。

我们下载完数据后,需要将所有图片放在一个文件夹中头像生成器,然后将该文件夹移动到data目录下(请确保data下没有其他文件夹)。 这种处理方式是为了能够直接使用torchvision自带的ImageFolder来读取图像,而不需要自己写Dataset。 数据读取和加载的代码如下:

可见,使用ImageFolder配合DataLoader来加载图片是非常方便的。

在训练之前,我们还需要定义几个变量:模型、优化器、噪声等。

加载预训练模型时,最好指定map_location。 因为如果程序之前是在GPU上运行的,模型会保存为torch.cuda.Tensor,所以加载时数据会默认加载到显存中。 如果运行程序的计算机没有GPU,加载时会报错,所以会通过指定map_location默认将Tensor加载到内存中,必要时再移动到显存中。

让我们开始训练网络。 训练步骤如下。

(1)训练判别器。

(2) 训练生成器。

(3)回到第一步,循环交替训练。

这里需要注意以下几点。

接下来是一些可视化代码。 每个可视化中使用的噪声都是固定的fix_noises,因为这使我们更容易比较生成器生成的图像对于相同的输入是如何逐步改进的。 另外,由于我们已经对输入图像(-1~1)进行了归一化,因此在可视化时需要将其恢复到原始尺度(0~1)。

此外,它还提供了可以加载预训练模型并使用噪声随机生成图像的功能。

完整代码请参考本书附带的示例代码chapter7/AnimeGAN。 按照README.MD中的说明配置环境,准备数据,然后使用以下命令开始训练:

如果你使用visdom,打开[你的ip]:8097就可以看到生成的镜像。

训练完成后,我们就可以利用生成网络随机生成动漫头像了。 输入命令如下:

结果分析

实验结果如图7-9所示,分别是神经网络训练1、10、20、30、40、200个epoch后生成的动画头像。 需要注意的是,每次输入到生成器的噪声都是相同的,因此我们可以比较在相同输入下生成图像的质量如何缓慢提高。

一开始生成的图像比较模糊(1个epoch),但是可以看出图像已经有了面部轮廓。

继续训练10个epoch后,生成的图像有很多更详细的信息,包括头发、颜色等,但整体图片仍然很模糊。

经过20个epoch的训练,细节不断完善,包括头发的纹理、眼睛的细节等,但仍然有很多涂抹的痕迹。

训练到第40个epoch时,可以看到明显的面部轮廓和细节,但仍然存在拖尾现象,而且有些细节不够合理,比如眼睛变大变小,面部轮廓严重扭曲。

经过200个epoch的训练,图片细节已经更加完善,线条更加流畅,轮廓更加清晰。 虽然还有一些不合理的地方,但是已经有很多图片可以看起来很真实了。

图7-9 GAN生成的动漫头像

类似的生成动漫头像的项目是“使用DRGAN生成高清动漫头像”,效果如图7-10所示。 不幸的是,由于版权问题,论文中使用的数据无法公开。 本文的主要改进包括使用更高质量的图像数据和更深、更复杂的模型。

图7-10 DRGAN生成的动漫头像

本章讲解的示例程序也可以应用于不同的图像生成场景,只要将训练图像改为其他类型的图像即可,例如LSUN客房图像集、MNIST手写数据集或CIFAR10数据集等。事实上,上述模型还有很大的改进空间。 这里,我们使用的全卷积网络只有四层,模型比较浅。 ResNet论文发表后,不少研究者尝试将Residual Block结构引入GAN的网络结构中,并取得了良好的视觉效果。 。 有兴趣的读者可以尝试将示例代码中的单层卷积修改为Residual Block,相信可以取得不错的效果。

近年来,GAN的重大突破在于理论研究。 论文《Towards PrincipledMethods for Training Generative Adversarial Networks》从理论角度分析了为什么 GAN 难以训练。 作者随后在另一篇论文Wasserstein GAN中提出了更好的解决方案。 然而Wasserstein GAN论文的一些技术细节的实现过于随意,因此随后有人提出Improved Training of Wasserstein GANs来更好地训练WGAN。 后两篇论文分别使用PyTorch和TensorFlow实现,代码可以从GitHub上搜索到。 作者还尝试用大约100行代码实现Wasserstein GAN。 有兴趣的读者可以了解更多。

随着GAN研究逐渐成熟,人们也在尝试将GAN应用于实际的工业问题。 在众多相关论文中,最令人印象深刻的一篇是使用循环一致对抗网络的不配对图像到图像翻译。 论文中提出了一种名为 CycleGAN 的新 GAN 结构。 CycleGAN利用GAN实现风格迁移、黑白图像的着色、马和斑马的相互转换等,效果非常突出。 论文作者使用PyTorch实现了所有代码,并在GitHub上开源。 有兴趣的读者可以自行查看。

本章主要介绍GAN的基本原理,带领读者使用GAN生成动漫头像。 GAN 有很多变体。 GitHub 上有许多使用 PyTorch 实现的 GAN。 有兴趣的读者可以自行查看。

关于作者

陈云是一位Python程序员、Linux爱好者和PyTorch源代码贡献者。 主要研究方向包括计算机视觉和机器学习。 “2017知乎看山杯机器学习挑战赛”一等奖、“2017天池医疗人工智能大赛”第八名。 热衷于推广PyTorch并拥有丰富的使用经验。 他活跃于 PyTorch 论坛和知乎相关版块。

福利! 福利! 我们将向AI一线的粉丝赠送10本《深度学习框架PyTorch入门与实践》纸质书! 在本文下方留言头像生成器,说出您想要这本书的原因,我们将邀请您加入捐书群。 中奖名单将由抽奖小程序随机抽取。 抽奖时间为2月6日(周二)上午10点。 获奖者将被每人获得一份。 附上京东购买地址,点击“阅读原文”!

更多实用内容,可关注AI前线,ID:ai-front,后台回复“AI”、“TF”、“大数据”,即可获取《AI前线》系列PDF迷你书籍及技能图谱。

最后编辑:
作者:nuanquewen
吉祥物设计/卡通ip设计/卡通人物设计/卡通形象设计/表情包设计