36

如何通过DCGAN实现动漫人物图像的自动生成?

 3 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzAxNDEwNjk5OQ%3D%3D&%3Bmid=2650410537&%3Bidx=1&%3Bsn=a51bfe8e2a0e34af89d0d54ad03bb977
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

640?wx_fmt=gif

背景

基于生成对抗网络(GAN)的动漫人物生成近年来兴起的动漫产业新技术。传统的GAN模型利用反向传播算法,通过生成器和判别器动态对抗,得到一个目标生成模型。由于训练过程不稳定,网络难以收敛,导致生成的图像缺乏多样性和准确性,甚至会产生模式崩溃。本文基于深度学习,参考相关实战项目 pytorch-book ,学习网络的训练方法,采用经过标准化处理和分类的动漫人物面部图像 知乎用户何之源分享的素材 ,训练DCGAN,实现动漫人物图像自动生成。在训练过程中,控制实验参数,进行定量分析和优化,得到可自动生成动漫人物图像的生成器模型。主要工作如下:

  • 设计DCGAN网络模型。对课题中所涉及到GAN原理、优化器等技术进行分析,并根据DCGAN的基本原则设计面向动漫人物生成的神经网络。

  • 建立图像样本库。采集40000张动漫人物图像,按照比例随机分为训练集和测试集,并利用数据集对DCGAN进行无监督训练以及测试。

  • 实现并训练DCGAN网络。使用Pytorch作为DCGAN的框架,利用Vidsom将图像生成过程的可视化,完成目标网络的构造以及训练。在训练过程中,控制实验参数,进行定量分析和优化,得到一组高质量网络参数。

  ▐   背景及意义

随着二次元文化逐渐走进大众视野,各种动漫作品所塑造的角色已经成为一种特殊的文化符号。但是,由于动漫本身复杂的性质,其对于制作成本,质量,创意都有较高的要求,导致动漫行业频频出现投入高,收益低的现象。由于生成对抗网络(GAN)在图像生成领域和视频生成领域具有巨大的发展潜力,许多研究者尝试从GAN入手,实现动漫图像的自动生成,为创作者带来了灵感,还节省了巨额创作开支。

目前已有的动漫图像生成方式主要分为两种,第一种,是基于已有的真实人脸图片,进行人脸风格 迁移,U-GAT-IT项目利用图像处理将原始图像内容与动漫风格相融合,实现动漫风格转换,如图1.1所示。虽然风格迁移技术已经有丰富研究成果,但有一些缺陷依然无法 避免,例如:生成的卡通图像表情单一、面部特征畸变、网络结构复杂等问题。

640?wx_fmt=jpeg

图 1.1 (a)(b) 热力图 (c)动漫图像

第二种方法,是将已有的动漫人物图像,输入到训练好的生成对抗神经网络模型中,对动漫图像的面部进行特征提取,最后训练出一组网络模型,实现自动生成新的动漫人物图像,如图1.2所示。DCGAN模型一般为五层,相较于传统的GAN模型更加稳定,生成的图像也更具有多样性,更能满足创作者的需求。

640?wx_fmt=png

图 1.2自动生成的动漫人物图像

  ▐   基于GAN的图像处理研究现状

深度学习领域在近几年取得了重大突破,其中大部分研究成果都基于感知技术,计算机通过模仿人类的思维方式,感知物体、识别内容。生成对抗网络的理念由Goodfellow于2014年提出的,它的发展历程只有六年,却对人工智领域带来了极大的冲击。

GAN的博弈过程,就是使用生成器制造的数据分布来拟合真实的数据分布。设置是一个生成动漫图片的网络,接收一个随机的噪声,生成动漫图片并输出。设置为判别网络,输入一张动漫图片,判别器可以计算出该图为生成的或真实图片的概率。两者分别根据返回的结果反向更新网络,相互抗衡,动态变化最后达到纳什均衡。

基于GAN性能的优越性,该模型逐渐被运用到图像处理领域的各个方向,其中包括图片转换、图像修复、风格迁移、图像生成等。例如:2016年Phillip Isola等人设计的pix2pixGAN[4]模型,可以将语义图片转换为街景和建筑的照片、素描图转彩色图片等,在图像转换领域实现了重大突破。

原始的GAN网络虽然在2014年才首次提出,但其扩展速度迅猛,产生了大量衍生网络,如:DCGAN、SGAN、ACGAN等。2015年Mattya首次提出了chainerGAN,通过DCGAN实现动漫人物生成,但Chainer框架并未得到大范围应用。随后,Jie Lei等人在2017年发表了Animegan,该项目使用GAN框架,提出了三种新的损失函数:灰度风格loss、灰度对抗loss、色彩重构loss,将各类现实场景下的图像转化为动漫风格的图像,例如自然风景、道路街景的转换。但遗憾的是,这些项目对于非计算机领域的爱好者使用具有一定难度,产生了局限性。

2017年,复旦大学和CMU的学生共同发布了一项名为 MakeGirlsMore 的动漫人物生成项目,发布后在Github受到广泛关注。该项目使用 React.js作为页面基本框架,为了提高项目的实用性,开发者将Chainer模型转化为基于WebAssembly的Java 模型。用户可以在浏览器的界面上设置动漫人物的相关参数,例如:眼睛颜色、面部表情、发型等信息,实现动漫人物的自动生成。

   训练方案

首先,建立图像样本库需要大量动漫图像,可使用Python在动漫素材相关网站爬取或使用网络上已有的数据集,按照固定比例划分训练集和测试集,并对样本进行标准化处理,使图像大小保持,每一张图片拥有唯一ID。

其次,选择CNN作为DCGAN的基础网络,对CNN的池化层和全连接层进行调整。DCGAN是一种深度卷积网络,可以实现目标特征提取以及图像分类。在定义DCGAN中的生成网络和判别网络时,通过增加ReLU、Sigmoid等激活函数用于参数处理、图像分类等工作。

在训练网络之前,使用Pytorch作为框架,Python作为编程语言完成代码编写,利用Adam优化器最小化损失函数,优化程序调整超参数。训练网络时,使用Visdom实现训练过程的可视化,通过控制学习率、迭代次数、训练比例等参数,设置多组对照实验,观察实验结果并利用测试集进行多次测试。

将多组实验结果进行对比分析,可得到一组最优网络参数,利用训练好的目标网络模型,便可输出多张不同的动漫图像,技术路线如图1.3所示:

640?wx_fmt=jpeg

图1.3 技术路线图

神经网络及GAN相关技术介绍

    神经网络相关概念

计算机网络中的神经元是神经网络基本组成单位,它的结构参考了生物神经元。1943年McCulloch等人提出了神经元模型M-P。对于神经网络的发展有着重要的影响。M-P抽象模型如图2.1所示:

640?wx_fmt=jpeg

图2.1 神经元结构模型

结合图2.1来看,神经元的输入输出关系用有向箭头来表示,输入信号可以用Xi表示,输出用Y来表示, Wi表示权重。多个神经元可以通过设定的连接关系组合成为神经网络。

目前,神经网络根据工作原理可以分为人工神经网络和生物神经网络,在计算机领域中,人工神经网络的原理是利用计算机模拟大脑的工作方式。下图2.2展示了神经网络主要类别,本文的DCGAN模型就是基于多层神经网络CNN实现的。

640?wx_fmt=png

图2.2 神经网络主要类别

单层感知器模型前馈神经网络最经典的模型,该模型与1957年由Frank Rosenblatt提出,可实现二类线性分类。将神经元节点添加在网络的输入、输出位置,作为网络的输入单元和输出单元。输入单元的功能是传输数据,输出单元实现对上一层的输入进行计算功能。下图2.3为第一代神经网络感知模型:

640?wx_fmt=jpeg

图2.3 第一代神经网络模型

由于第一代神经网络模型不能适用于处理异或问题,仅局限于线性可分问题。所以直至20 世纪 80 年代中期,分布式并行处理(Parallel Distributed Pro-cessing ,PDP)模型开始受到广泛关注。反向传播算法也逐渐成为 PDP 模型的主要学习算法这时,神经网络才又开始引起人们的注意,并重新成为新的研究热点[7]。第二代神经网络结构也应运而生,如图2.4所示:

640?wx_fmt=jpeg

图2.4 第二代神经网络结构图

2006年Geoffrey Hinton提出了深度网络,通过大量数据训练神经元间的权重,让整个网络按照最大概率来生成数据,是一种概率生成模型,能够通过学习表示高阶抽象的复杂函数,可以使用它来识别特征、分类数据、生成数据等。

    卷积神经网络

卷积神经网络(convolutional neural network,CNN)是指至少在网络的一层中使用卷积运算来代替一般的矩阵乘法运算的神经网络[18]。第一个卷积神经网络是Alexander Waibel在1987年提出的时延神经网络(TDNN),但是直到2012年ImageNet竞赛之前,CNN才重新走进人们的视野。目前常用的CNN结构是由多个卷积层、池化层、全连接层组合构成的。如图 2.5 所示

640?wx_fmt=jpeg

图2.5 神经网络结构图

卷积层主要通过卷积核进行图像局部特征提取,其神经元按照宽度,高度和深度的排列方式,适用于彩色图像的RGB三色通道结构,因此它的排列方式又称为三维排列。避免了传统的感知器模型纬度较低的问题,可以更好地生成于高分辨率的图像,卷积层的各个参数设置影响卷积神经网络的性能,网络的精度和卷积层数呈正相关。

激活层一般常使用ReLU激活函数,它可以缓解梯度消失问题,通过将特征图映射到新的特征空间,提高模型鲁棒性、非线性表达能力。

池化层的主要作用是进行特征选择。池化层可以通过下采样过程,对于特征图进行融合和降维,相较于卷积层降低了计算量,避免了信息冗余。常用最大池化法和平均池化法。

全连接层用于将前一层输出的局部特征,重新连接成完整的图,可以将卷积神经网络的尾部重新拟合,减少特征信息的损失。

    卷积运算

卷积(Convolution)的过程是在图像每个位置进行线性变换映射成新值的过程。本节主要讨论卷积运算在图像处中的运用。卷积运算主要是通过特征提取器(滤波器)对图片进行特征提取,例如图像的线条、结构等,降低深层网络模型的复杂度。其下列公式2.1、2.2可表示多层神经,上下层之间的关系:

上式2.1、2.2中有几个重要参数,W1:卷积前图像的宽度;W2:卷积后特征图的宽度;H1:卷积前图像的宽度;H2:卷积后特征图高度 ;S:步长(Stride),卷积核在滑动时的间隔;F:filter的宽度;P:零补充(Zero Padiding),在原始图像两端补零的圈数。

下图2.6是一张大小的原始图片,设置经过卷积操作后,得到一张大小的特征图像的部分过程,图2.6为原始输入图像,绿色部分为卷积核,蓝色图像为目标图像,为卷积后图像长度,图2.7中的值可以通过绿色部分的运算。

640?wx_fmt=jpeg

卷积后图像特征图的长度为:

运算后的取值为:

通过以上运算过程,可以总结出,卷积运算就是将高维数据映射到低维数据,而逆卷积运算就是卷积运算的相反操作,将低维数据映射到高维数据。

动漫图像生成网络设计

  DCGAN设计原则

DCGAN目前是GAN在实际工程实践中被采用最多的衍生网络,为了提高图像生成质量,增强其稳定性,许多研究学者尝试进行优化,并提出了四点设计原则,本课题中DCGAN的生成器和判别器的设计是基于该原则实现,下面将进一步阐述它们之间的关系。

(1)卷积层代替池化层

池化操作会使卷积核在缩小的特征图上覆盖了更大的图像视野,但是对网络性能的优化效果较小,使用卷积层代替池化层,让网络自动选择筛去不必要信息,学习上采样和下采样过程,提高计算机运算能力。

(2)去掉全连接层

全连接层一般添加在网络的末层,用于将图像特征进行连接,可以减少特征信息的损失,但是由于其参数过多,会产生过拟合、计算速度降低等问题。由于面部图像特征提取的感受野范围较小,不需要提取全图特征,所以为了避免上述问题,本项目中网络模型去掉了全连接层。

(3)批量归一化

本课题中的生成器和判别器都是五层神经网络,每一层输入的数据的复杂度都会逐层递增,使输出数据的分布发生变化,对网络参数的初始化和BP算法的性能产生影响。将数据进行批量归一化(Bach Normalization,BN),可以使输出的数据服从某个固定数据的分布,把数据特征转换为相同尺度,从而加速神经网络的收敛速度。

(4)激活函数

激活函数(Activation Function)具有连续可导的特性,可以使神经网络进行非线性变化,通过对数值优化来学习网络参数,提升网络的扩展性。本课题的生成器和判别器均为五层网络模型,计算量较大,每一层的激活函数选择需要满足高计算效率和训练稳定两点,其导函数的值域分布合理。

基于以上原则,在DCGAN的生成器添加了ReLu函数、Tanh函数,判别器中添加了LeakyReLu函数和Sigmoid函数,如下内容将对这四个激活函数进行的简单介绍。

Sigmoid函数是一种两端饱和型函数,取值范围在0∼1之间,Sigmoid函数定义如公式3.1所示:

640?wx_fmt=jpeg

下图3.1是Sigmoid的函数图像,它以坐标轴原点0为分界,输入值变大,输出结果接近于1,输入值减小,输出结果接近0,所以一般用它做输出端,解决二分类问题。这种特性也存在一定弊端,例如,神经网络训练结果输出恒大于零,并且当输入数据为极大,极小值时,Sigmoid函数梯度无限趋近于0,不利于神经网络的反向传播。

640?wx_fmt=png

图3.1 Sigmoid函数图像

Tanh函数的图像也是S型,一般情况下Tanh的收敛速度都优于Sigmoid函数,它可以避免出现均值不为零的情况,公式如3.2所示:

640?wx_fmt=jpeg

由函数图像3.2可得,它的值域为(0,1),DCGAN网络在生成器的输出层添加Tanh函数,有利于图像色彩覆盖。

640?wx_fmt=png

图3.2 Tanh函数图像

Relu激活函数是一种左饱和的激活函数。它的计算效率较高,一般常用于隐层神经元输出,在近几年被广泛用于训练多层神经网络模型,其函数公式3.3所示:

640?wx_fmt=jpeg        

由ReLU函数图3.3可知,导数在x>0时为1,x<0时为0,可以提高神经网络的收敛速度。但是ReLU也存在一些问题,例如“死亡ReLU”,在训练时,如果有一个数据较大的梯度流通过ReLu神经元,导致参数更新出现问题,数据分布被打乱,这个神经元的梯度保持为0,且无法对任一数据进行激活操作。

640?wx_fmt=png

图3.3 ReLU函数图像

LeakyReLU函数可以解决“死亡ReLU”现象,是基于ReLU函数的基础上提出的,函数公式如3.4所示:

640?wx_fmt=jpeg

如图3.4所示,当小于0时,给增加一个斜率,取值一般较小,避免了ReLU在负半轴训练时停滞的问题。

640?wx_fmt=png

图3.4 LeakyReLU函数图像

    DCGAN网络结构      

DCGAN模型由生成网络G与判别网络D组成,网络结构均为五层,生成网络的接受一个随机输入的噪声,通过该噪声生成一张目标图像;判别网络接受一张图像,对该图像做出判断后,计算出一个概率值,若该图像来源为生成网络,则输出0,若该图像来自真实的数据分布,则输出为1。两者根据反馈的结果,不断更新自己的参数,直至达到纳什均衡。

    生成网络和判别网络详细设计

生成器网络结构

生成模型的网络结构一共有五层,通过上采样方法生成大小的图像,它的主要结构如图3.6所示:

640?wx_fmt=jpeg

图3.6 DCGAN的生成器网络结构图

生成器整个网络结构没有池化层,输入一个服从均匀分布的nz维度的噪声,神经网络根据输入的向量信息,分步获取输入图像的特征信息,例如:线条、风格等,随后根据网络的深度,不断优化图片的细节。

输入一张的图片,根据需要的特征图大小设置相应的卷积核,卷积核的大小影响了生成网络的可学习空间特征值的大小。在代码中使用nn.Sequential()函数可以根据传入的次序,将卷积、激活、池化等按照顺序加入该模块中,在构建完网络层后,自动调用forward方法。在除了输出层之外的每一层,加上批归一化(BN)处理,缓解模型崩溃问题。根据每层网络结构的需求,使用对应的激活函数,最后,输出一个像素的3通道RGB图像。具体的层次结构如下表3.1所示:

640?wx_fmt=png

表3.1 DCGAN生成模型层次结构

Layer1是输入层, 输入随机噪声,将Stride设置为1,将Padding设置为0。接下来,通过ConvTranspose2d()函数求逆卷积,并在BN层对数据进行批量归一化处理,使用ReLU激活函数加速收敛,输出对应的特征映射图;

Layer2: 将Stride设置为2,将Padding设置为1,添加BN层将数据批量归一化处理,使用ReLU激活函数加速收敛,输出对应的特征映射图;

Layer3: 将Stride设置为2,将Padding设置为1,添加BN层将数据批量归一化处理,使用ReLU激活函数加速收敛,输出对应的特征映射图;

Layer4: 将Stride设置为2,将Padding设置为1,添加BN层将数据批量归一化处理,使用ReLU激活函数加速收敛,输出对应的特征映射图;

Layer5: 输出层, 将Stride设置为3,将Padding设置为1,使用Tanh作为激活函数,输出对应的图像。

生成器代码结构图如图像3.7所示:

640?wx_fmt=jpeg

图3.7生成器代码结构图

判别器网络结构

判别模型的网络结构一共有五层,采用下采样方法。整个网络结构没有池化层,采用LeakyReLU作为激活函数,最后,通过一个全连接层输出判别结果,范围为0∼1,表示输入图像属于真实样本还是由生成器所生成的图像,它的结构如图3.8所示:

640?wx_fmt=jpeg

图3.8 DCGAN的判别器网络结构图

判别器中也添加了BN层,并且每一层都使用激活函数进行非线性处理,具体的层次结构如下表3.2所示:

640?wx_fmt=png

表3.2 DCGAN判别模型层次结构

Layer1:输入层, 首先输入图片,Stride设置为1,将Padding设置为0。通过Conv2d()函数求卷积,接下来使用LeakyReLU()激活函数,优化网络收敛速度;

Layer2: 输入图像,Stride设置为2,将Padding设置为1,添加BN层将数据批量归一化处理,使用LeakyReLU()激活函数加速收敛;

Layer3: 输入图像,Stride设置为2,将Padding设置为1,添加BN层将数据批量归一化处理,使用LeakyReLU()激活函数加速收敛;

Layer4: 输入图像,Stride设置为2,将Padding设置为1,添加BN层将数据批量归一化处理,使用LeakyReLU()激活函数加速收敛;

Layer5:输出层, Stride设置为3,将Padding设置为1,使用sigmoid()函数输出概率,表示图像的真实性。

综上,可以看出这两个网络模型的Padding、Stride等设置几乎相同,整体的网络结构是对称,只是各层使用的激活函数有差异。

    损失函数

损失函数是一种非负实数函数,可以评估模型的预测值与真实值不一致的程度。两者差距减少,概率分布越接近,差距增加,概率差异越高,在Pytorch中可以通过导入torch.nn包来使用。Pytorch中提供许多损失函数,每一种函数都有其特性,例如:MSELoss是一种均方误差损失函数,使用梯度下降算法,一般常用于解决股票预测、房价预测等回归类问题;SmoothL1Loss是一种稳定的损失函数,也被用于解决回归问题,它的函数曲线光滑可以避免梯度爆炸的问题;BCELoss是CrossEntropyLoss的一个特例,常用于解决分类问题。在本课题中我们需要,判断样本的输出是真实图片还是生成图片,所以本课题选择BCELoss作为损失函数,它在 PyTorch 中的定义如公式2.1所示:

由于生成网络和判别网络的输出层的激活函数分别为Than函数和Sigmoid函数,两者都是S型函数,其函数特性会导致反向传播算法收敛速度降低,使用BCELoss函数后,解决了因sigmoid函数导致的梯度消失问题。

    Adam优化器

在DCGAN的训练过程中,可以通过优化器最小化损失函数,一般分为一阶优化算法和二阶优化算法。本课题选用Adam优化程序调整超参数,它结合了 AdaGrad 和 RMSProp 算法最优的性能,不仅可以计算每个参数的自适应学习率,还可以通过训练数据的不断迭代使网络权重自动更新,相较于其他几种算法而言Adam算法实现简单、对计算机资源占用率较低,收敛速度也更快。   

Adam算法有一些重要参数,其中params表示用于优化的可以迭代参数或定义参数组;lr表示学习率,可以调节权重的更新比例,影响网络的收敛速度,在Pytorch源码中定义如下:

torch.optim.Adam(params,lr=a,betas=(b,c),eps=d, weight_decay=e)

本文基于Adam优化器的默认参数做出改进,采用一种动态调整学习率的方法,改善训练过程中产生的图像模糊,模式崩塌,损失函数震荡明显等问题,详细步骤在网络训练部分阐述。

动漫图像生成实战

本章首先将几种常用的开源框架进行对比分析,选择了最适用于本实验需要的开源框架Pytorch,并对可视化工具Visdom的功能进行说明。接下来,详细描述了网络训练流程,对各组实验生成的图像和Loss函数进行了分析,对传统的DCGAN网络训练参数提出了改进,针对相关问题提出优化方案。

    实验环境搭建

深度学习框架Pytorch

随着各类开源深度学习框架的不断更新迭代,大规模的深度学习模型得到了极大的简化,促进了图像处理、NLP、语音识别等技术的发展。本课题的核心功能是自动生成动漫图像,近几年大火的TensorFlow、Pytorch等框架都可用于处理图像类问题。

TensorFlow框架属于静态计算图,生成图像后无法改变,在初始化时需要考虑到所有的可能性,对计算机配置要求高。在代码中,静态图不支持基本的python语法,缺乏灵活性,不适用于研究性学习。

由于Pytorch框架的设计思想基于动态计算图,它的 API的设计具有极高的通用性,源码直观简洁,易于理解,支持python的条件判断、循环等基本语法,可以动态执行并且调试方便。基于它的高效性、易用性,本课题选Pytorch作为深度学习框架。

可视化工具Visdom

可视化工具可以为我们实时提供程序运行过程中各类数据变化情况和训练效果。Visdom是一款轻量级的可视化工具。适用于Pytorch框架下的图像展示,支持Python语言,可绘制多种图形,例如:热力图、地理图、自定义图像。

Visdom的UI可视化框架主要由环境和窗格组成。一般默认使用main环境,不同环境之间相互独立。窗格相当于一个容器,支持多种图像类型,一个环境中可以创建多个窗格。用户通过创建一个自己的绘图环境,启动浏览器窗口,便可以实时查看图像数据,这些图像可以缩放、保存、动态更新。

基于Visdom具有轻量、实用性、灵活性的特点,本课题选择它作为可视化工具,绘制Loss函数和生成图形变化过程,便于分析数据,调整优化器和网络训练参数。下图4.1展示了在Visdom中网络训练过程和Loss函数。

640?wx_fmt=png

图4.1 Visdom可视化展示

综上,选用第三方框架为Pytorch,使用Python完成代码编写,通过Visdom实现图像生成过程的可视化,使用样本库对网络进行训练,实验所需的环境和软件的详细信息在下表4.1所示:

640?wx_fmt=png

表4.1 实验环境

    训练过程

建立图像样本库

图像样本库内容为动漫人物面部特征图片,可通过爬虫获取大量原始动漫人物形象素材后,使用opencv工具将图片进行剪裁,仅留出动漫人物面部图像,本项目使用知乎用户何之源提供的已处理好的动漫图像样本库,按照1:1随机划分为训练集和测试集。

  • 训练集包含20000张动漫人物图像,图像格式为JPEG,分辨率为3:heavy_multiplication_x:96:heavy_multiplication_x:96,每张图像的文件名是一个唯一的id;

  • 测试集包含20000张动漫人物图像,图像格式为JPEG,分辨率为3:heavy_multiplication_x:96:heavy_multiplication_x:96,每张图像的文件名是一个唯一的id,样本参数图4.1:

640?wx_fmt=png

图4.1  图像样本参数

640?wx_fmt=png

图4.2   图像样本库(部分)

超参数设置

为了证明各参数设置对网络训练效果的影响,在不同的对照组中按照比例设置参数。其中,G代表生成器在单位周期的训练次数,D代表判别器单位周期的训练次数,LrG表示生成器学习率,LrD表示判别器学习率,Epcho表示总训练周期,BatchSize为一次迭代时输入的样本数量,经过多次实验与测试,选取了以下4组具有代表性的实验参数用于实验结果分析,如下表4.2所示:

640?wx_fmt=png

表4.2 实验参数

训练网络 

训练DCGAN时,我们需要分别固定生成器和判别器。将生成器输出的动漫图片,与样本库所提供的动漫图片,输入到判别器中,并利用sigmoid函数对这两种图像进行分类。生成器可以根据返回的结果,不断反向调整和优化参数,从而使生成的动漫图像更加逼真,接近真实图像。

判别器的输入是一张动漫人物图片,计算出这张图片是真实图片的概率后,用Sigmoid函数将结果进行处理,使其输出值范围为0∼1之间。我们可以根据判别器的计算结果,来量化它的辨别能力,根据反馈的结果,不断优化,从而使它对真实的动漫图像和生成的动漫图像的判别结果更加准确。

这两个过程交替重复,当达到指定的训练次数后,便可保存最后的网络模型,并检验训练效果,不断改进,基本的训练流程如下图所示:

640?wx_fmt=png

图4.3 DCGAN动态博弈过程

训练结果展示与分析

由于此次DCGAN网络模型的主要功能是生成动漫人物图像,主要根据生成图形的色彩、清晰度、动漫人物面部完整性作为评价标准,用人眼主观对图像效果进行评价,Loss函数用于对网络模型收敛程度的判定指标。

(1)当训练次数比例G:D=5:1,G&D Learning rate=0.0002,batchsize=128,训练200个周期时,DCGAN的第1、49、99、199个周期的图像效果如下图所示:

640?wx_fmt=jpeg         640?wx_fmt=jpeg                                               

图4.4 实验一生成图像对比

640?wx_fmt=jpeg

图4.5 实验一生成器和判别器损失函数图像

以上实验结果分析可知,随着训练周期的提升,DCGAN生成的图像质量不断提高,但动漫人物面部存在畸变,图像整体色彩发灰的问题。生成器得Loss函数数值振荡明显,网络收敛效果较差,而判别器的Loss函数数值整体低于生成器,表面判别器的网络收敛更快,能力更强。

(2)当训练次数比例G:D=1:5,G&D Learning rate=0.0002,batchsize=128,训练200周期,DCGAN的第1、49、99、199个周期的图像生成效果如下图所示:

640?wx_fmt=jpeg

640?wx_fmt=jpeg

图4.6 实验二生成图像对比

640?wx_fmt=jpeg

图4.7 实验二生成器和判别器损失函数图像

以上实验结果分析可知,随着训练周期的提升,DCGAN生成的动漫人物图像趋于同化,产生了模式坍塌,生成器输出一些不易被识别的图像,大部分结果都与我们预期的图像不符合。生成器的Loss函数值虽然比较低,但从训练中期开始上升。本实验生成的图像与实验一的图像进行对比可得,生成器训练次数小于判别器训练次数时,网络训练不稳定。

(3)当训练次数比例G:D=1:1,G&D Learning rate=0.0002,batchsize = 128,训练第1、49、79、99个周期时,动漫人物图像的生成效果如下图所示:

640?wx_fmt=jpeg

640?wx_fmt=jpeg

图4.8 实验三生成图像对比

640?wx_fmt=jpeg

图4.9 实验三生成器和判别器损失函数图像

由以上实验图像可知,当训练次数比例G:D=1:1时,在第49个训练周期时已经产生较为完整的图像,且图像细节优于前面两组实验,但是图像依然存在色调偏灰的问题,生成图像无法满足需求。生成器的损失函数一直处于增长状态,网络不断反向更新参数,收敛效果较差。

(4)当训练次数比例G:D=1:1,G Learning rate=0.0002,D Learning rate = 0.00005,Batchsize=128,训练第1、49、79、99个周期时,动漫人物图像的生成效果如下图所示:

640?wx_fmt=jpeg                                                        

640?wx_fmt=jpeg

图4.10 实验四生成图像对比

640?wx_fmt=jpeg

图4.9 实验三生成器和判别器损失函数图像

由以上实验图像可知,当训练次数比例G:D=1:1时,在第49个训练周期时已经产生较为完整的图像,且图像细节优于前面两组实验,但是图像依然存在色调偏灰的问题,生成图像无法满足需求。生成器的损失函数一直处于增长状态,网络不断反向更新参数,收敛效果较差。

(4)当训练次数比例G:D=1:1,G Learning rate=0.0002,D Learning rate = 0.00005,Batchsize=128,训练第1、49、79、99个周期时,动漫人物图像的生成效果如下图所示:

640?wx_fmt=jpeg                                                        

640?wx_fmt=jpeg

图4.10 实验四生成图像对比

640?wx_fmt=jpeg

图4.11 实验四生成器和判别器损失函数图像

由以上实验图像可知,当训练次数比例G:D=1:1时,调整生成网络和判别网络学习率的比值,可以 使DCGAN生成的图像细节、色彩都更好。虽然图像在第99个训练周期出现了模式坍塌,但前98个周期的图片质量都较好,并且它们的损失函数在训练中期“此消彼长”,生成器的学习率在5以下,判别器的学习率基本从40个训练周期后变降到了0.5以下。后期可以通过动态调整判别器的学习率,减缓模式坍塌的发生。    

通过上述实验结果对比可以得出,实验四设置的训练参数可以获得较好的动漫人物图形,其色彩、细节都强于其他组实验,并且损失函的数值变化状态较为均衡,因此选用第四次实验的第97个训练周期输出的网络作为目标网络。

DCGAN模型测试

使用同一组超参数对测试集进行训练,图像生成效果与训练集基本一致,使用第四次实验的第97 个训练周期DCGAN模型进行测试,选取4组图像,如下图所示:

640?wx_fmt=png

图4-12 生成器输出图像结果

观察以上实验结果可以得出,生成器所输出的图像风格符合动漫人物风格的要求,但细节上还存在缺陷。从动漫人物面部图像的完整性来看,人物的发型、面部轮廓的特征全都覆盖;约11%的图像存在眼睛不清晰、不完整的问题;约38%的图像存在嘴巴不完整的问题。

从动漫 人物图像的色彩性来看,图像的“发灰”问题已经解决,生成的图像色彩与真实图像已经非常接近。由于动漫人物图像的特殊性,样本的面部细节与真实世界人类的面部特征存在较大差异,动漫人物的鼻子、嘴巴等特征都是由简单线条构成,具体的形状、颜色信息不够丰富,导致训练效果低于其它面部特征,可以通过收集面部细节更精细、面部特征更明显的图像样本改善这一问题。

通过GAN模型实现动漫图像自动生成的研究工作,在本文之前已经取得一定的研究成果。一种是通过风格迁移,将真实的人物图像转换为动漫风格;另一种是将已有的动漫人物图像,输入DCGAN模型中,对动漫图像的面部进行特征提取,最后训练出一组网络模型,输出动漫人物图像。本课题基于第二种方案,不同之处在于优化了默认的参数设置和传统的训练方式,在更短的训练周期内获得细节更完善、色彩更饱满的图像。

问题与解决方案

从上述训练过程可以得出,随着实验参数的调整、样本的优化,DCGAN的效果不断提高,基于以上实验内容,总结出两个主要问题,并根据实践提出了对应的解决方案。

(1)判别网络收敛速度太快,导致生成器Loss数值持续上升。

解决方案1:

调整生成器和判别器单位周期内的训练次数。就目前实验数据来看,当生成器和判别器学习率相同的情况下,提高生成器的训练次数,DCGAN训练效果更好。

解决方案2:

调整生成器和判别器学习率。一般情况下,进行DCGAN训练时两者在Adam优化器的学习率都使用参考值0.0002。当出现其中一方收敛速度过快时,可以通过观察Loss函数的变化,按照一定比例调整学习率,在本课题中,判别器的网络收敛速度更快,导致虚假图像很快被识别。生成器反向更新参数后,导致后续每一层输入的数据分布也发生变化,Loss函数值持续增加。可以通过降低判别器的学习率,间接影响生成器的网络收敛状况。

(2)生成图像质量较差,有畸变、模糊、模式崩溃等现象。

解决方案1:

检查图像样本库,在样本数量足够的情况下,检查样本中是否存在非动漫图像,动漫风格是否类似,样本的表情、发色等面部属性是否足够丰富。

解决方案2:

将训练次数比例和学习率结合,动态调整。判别器训练效果太好,会导致生成器反向调整参数,生成一些已经被识别为“真”的样本,特殊情况下,还输出许多面部特征畸变的图像,导致样本缺乏多样性和准确性。根据Loss函数,查看损失值突变的训练周期,可以按照周期来动态调整生成器或判别器的学习率或训练次数,例如,每经过10个训练周期,将生成网络或判别网络的学习率递减为原来的1/2。

总结

此次网络训练过程在前人研究的基础上,基本完成了深度神经网络的训练,得到一组高质量网络参数。但是受制于能力和硬件等方面的因素,还有许多不足之处,在以下几个方面需要进行更加深入的学习和探索:

(1)精细化样本库。由于图像样本库的素材由网络图片剪裁而成,动漫人物形象风格、色彩、背景都有较大差异,对网络训练产生干扰,影响生成图像的质量。采集白色或统一背景的动漫人物面部图像,可以提高生成图片质量。

(2)增加网络模型深度。可以使生成的图片细节更加完善,图片质量清晰,虽然目前实验环境有限制,但是生成更加清晰的动漫图像可以扩展其使用范围,更加满足动漫创作者的需求。

(3)改善生成图像质量。随着训练次数的增多,部分会产生图像色彩失真现象,图片看起来色调偏灰,可以在图片输出之前对生成图片质量判断,根据色彩饱和度等信息,使用Torch中的图像增强函数,对图片色彩进行调整。

(4)优化工程界面。软件的普及离不开其易用、美观的特点。目前本课题还需要利用命令行完成运行,通过一键点击自动生成动漫图像,并用简洁的前端页面展示是接下来的工作目标。

链接:

https://github.com/chenyuntc/pytorch-book?spm=ata.13261165.0.0.4061525dFyDth4

https://zhuanlan.zhihu.com/p/24767059?spm=ata.13261165.0.0.4061525dK3i1w7

https://make.girls.moe/#/

淘系技术- 拍卖测试团队

创新业务新赛道,结合搜索,数据,算法,导购,营销,交易,直播等多领域的测试能力,为提供更加稳定,顺滑的产品体验,打造高质量的拍卖业务中台系统保驾护航。重估一切价值,期待有你同行!Base:杭州

邮箱:postbox:: [email protected]

✿  拓展阅读

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

作者| 田一凡(宝澜)

编辑| 橙子君

出品| 阿里巴巴新零售淘系技术

640?wx_fmt=jpeg

640?wx_fmt=png


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK