1.研究背景与意义
随着计算机技术的不断发展,图像处理和计算机视觉领域取得了长足的进步。图像风格迁移是其中一个备受关注的研究方向,它可以将一幅图像的风格特征应用到另一幅图像上,从而创造出新的图像。这项技术具有广泛的应用前景,如艺术创作、电影特效、虚拟现实等领域。
传统的图像风格迁移方法主要基于优化算法,通过最小化图像的内容损失和风格损失来实现。然而,这些方法存在一些问题,如计算复杂度高、结果不稳定等。近年来,生成式对抗网络(GANs)的出现为图像风格迁移带来了新的突破。
GANs是一种由生成器和判别器组成的神经网络结构,通过博弈的方式训练生成器生成逼真的图像,同时判别器则试图区分真实图像和生成图像。GANs的核心思想是通过生成器和判别器之间的对抗学习,不断提升生成器的生成能力,从而生成更加逼真的图像。
基于生成式对抗网络的图像风格迁移系统具有以下几个方面的研究意义:
-
提高图像风格迁移的效果:传统的图像风格迁移方法往往无法完全捕捉到图像的风格特征,导致生成的图像与目标风格之间存在差异。而基于GANs的方法可以通过对抗学习不断优化生成器,从而生成更加逼真、细致的图像,提高图像风格迁移的效果。
-
提高图像风格迁移的稳定性:传统的图像风格迁移方法在处理复杂的图像时往往存在结果不稳定的问题,生成的图像可能会出现失真、模糊等情况。而基于GANs的方法可以通过对抗学习的方式提高生成器的稳定性,生成更加清晰、真实的图像。
-
拓展图像风格迁移的应用领域:基于生成式对抗网络的图像风格迁移系统具有广泛的应用前景。例如,在艺术创作领域,艺术家可以利用这一系统将不同风格的绘画作品进行融合,创造出独特的艺术作品。在电影特效领域,可以利用该系统将不同风格的特效图像应用到电影中,增强视觉效果。在虚拟现实领域,可以利用该系统将真实世界的风格特征应用到虚拟场景中,提升虚拟现实的真实感。
总之,基于生成式对抗网络的图像风格迁移系统具有重要的研究意义和广泛的应用前景。通过提高图像风格迁移的效果和稳定性,可以为艺术创作、电影特效、虚拟现实等领域带来更多可能性,推动图像处理和计算机视觉技术的发展。
2.图片演示
3.视频演示
基于生成式对抗网络的图像风格迁移系统_哔哩哔哩_bilibili
4.生成式对抗网络简介
卷积神经网络与循环神经网络是目前较常见的两类人工神经网络算法,前者长于处理图像信息,后者常用于处理序列信息。它们都需要大量的训练样本来保证训练的质量,需要成千上万张图片来做训练。但与脱胎于生物神经元模型的深度学习算法不同,成年人的学习过程却并不需要海量的样本和数据。因此,有学者开始尝试发展小样本学习的神经网络算法,希望用少量的样本就可以训练出较为准确的网络模型,生成式对抗网络就是近年来发展较快的模型之一。
2014年,I.J.Goodfellow等人提出了一个深度学习算法的新框架,该模型借鉴了二人零和博弈的思想,通过对抗过程估计生成模型,即假设在游戏博弈过程中双方都同时采取最优的方案并使用,使得游戏结果达到纳什均衡的状态。在该算法中,生成式模型G和判别式模型D一起进行训练。其中,G负责学习样本数据分布,D则估计样本来自生成器G或训练数据的概率。生成式模型需要尽量降低判别式模型对数据做出
正确判断的概率,而判别式模型则要不断识别出生成式模型生成的假数据,两个模型间相互对抗,互相提高,最终使得生成式模型生成的数据与真实数据在数据分布上差别很小,而判别式模型最后则无法判断该数据是来自真实的数据集还是由生成器G所生成。
GoodFellow提出的生成式对抗网络,判别器网络使用常规的训练方法,训练数据则包括小批量的真实样本数据集和随机噪声z,真实的样本被标记为1,生成器网络输入噪声之后生成的假样本标记为0。用G(z)表示新的数据集,判别式模型D则有两个输入,分别是表示真实数据的x和生成式模型G生成的数据,真实数据的分布则用Pilan(t)表示,判别式模型对数据进行判断,输出一个标量值。然后做反向传播更新生成器网络的参数,判别器网络的参数不变,交替训练,经过多次迭代,假样本的数据分布相较于真实数据几乎相同,即生成器网络生成的假数据判别器已经无法正确出该数据的真伪,训练过程如图所示。
5.核心代码讲解
5.1 cycleGAN.py
class ResidualBlock(nn.Layer):"""定义残差块"""def __init__(self, in_channels):super(ResidualBlock, self).__init__()self.conv1 = nn.Conv2D(in_channels, in_channels, kernel_size=3, stride=1, padding=1)self.bn1 = nn.BatchNorm2D(in_channels)self.prelu = nn.PReLU()self.conv2 = nn.Conv2D(in_channels, in_channels, kernel_size=3, stride=1, padding=1)self.bn2 = nn.BatchNorm2D(in_channels)def forward(self, x):identity = xout = self.conv1(x)out = self.bn1(out)out = self.prelu(out)out = self.conv2(out)out = self.bn2(out)out += identityreturn outclass cycleGAN(nn.Layer):"""定义cycleGAN网络"""def __init__(self, upscale_factor=4, num_residual_blocks=16):super(cycleGAN, self).__init__()self.conv1 = nn.Conv2D(3, 64, kernel_size=3, stride=1, padding=1)self.prelu = nn.PReLU()# 添加残差块residual_blocks = []for _ in range(num_residual_blocks):residual_blocks.append(ResidualBlock(64))self.residual_blocks = nn.Sequential(*residual_blocks)self.conv2 = nn.Conv2D(64, 64, kernel_size=3, stride=1, padding=1)self.bn2 = nn.BatchNorm2D(64)# 上采样层,使用反卷积进行上采样upsampling_layers = []for _ in range(int(upscale_factor / 2)):upsampling_layers.append(nn.Conv2DTranspose(64, 64, kernel_size=3, stride=2, padding=1, output_padding=1))upsampling_layers.append(nn.BatchNorm2D(64))upsampling_layers.append(nn.PReLU())self.upsampling = nn.Sequential(*upsampling_layers)self.conv3 = nn.Conv2D(64, 3, kernel_size=3, stride=1, padding=1)def forward(self, x):out = self.conv1(x)out = self.prelu(out)residual = self.residual_blocks(out)out = self.conv2(residual)out = self.bn2(out)out += residualout = self.upsampling(out)out = self.conv3(out)return out
该程序文件cycleGAN.py定义了一个CycleGAN网络模型。该模型包含两个主要部分:ResidualBlock和cycleGAN。
ResidualBlock是一个残差块,用于增加网络的深度和学习能力。它包含两个卷积层和两个批归一化层。在前向传播过程中,输入通过第一个卷积层和批归一化层,然后通过PReLU激活函数。然后,输出通过第二个卷积层和批归一化层。最后,将输入和输出相加得到残差块的输出。
cycleGAN是整个网络模型。它包含一个卷积层、一个PReLU激活函数、多个ResidualBlock残差块、一个卷积层和一个批归一化层。在前向传播过程中,输入通过第一个卷积层和PReLU激活函数。然后,输出通过多个ResidualBlock残差块。接下来,输出通过第二个卷积层和批归一化层,并与之前的残差块输出相加。最后,输出通过上采样层进行上采样,并通过最后一个卷积层得到最终的输出。
该模型用于图像超分辨率重建任务,通过学习低分辨率图像和高分辨率图像之间的映射关系,实现将低分辨率图像转换为高分辨率图像的功能。
5.2 demo.py
class ImageNoise:def __init__(self, path1, path2):self.path1 = path1self.path2 = path2def sp_noise(self, image, prob):"""添加椒盐噪声prob:噪声比例"""output = np.zeros(image.shape,np.uint8)thres = 1 - probfor i in range(image.shape[0]):for j in range(image.shape[1]):rdn = random.random()if rdn < prob:output[i][j] = 0elif rdn > thres:output[i][j] = 255else:output[i][j] = image[i][j]return outputdef add_noise(self, prob=0.1):for i in os.listdir(self.path1):im = cv2.imread(self.path1 + '/' + i)# 调用噪声函数生成噪声图片img_sp = self.sp_noise(im, prob)# 均值滤波img_blur = cv2.blur(img_sp, (20, 20))cv2.imwrite(self.path2 + '/' + i, img_blur)
这个程序文件名为demo.py,它的功能是给指定文件夹中的图片添加椒盐噪声,并对添加噪声后的图片进行均值滤波处理,然后将处理后的图片保存到另一个文件夹中。
具体实现过程如下:
- 导入所需的库:os、cv2、random、numpy。
- 定义两个文件夹路径变量path1和path2,分别表示原始图片所在的文件夹和处理后图片保存的文件夹。
- 定义一个函数sp_noise,用于给图片添加椒盐噪声。该函数接受两个参数,一个是图片对象image,另一个是噪声比例prob。函数内部会根据噪声比例随机生成椒盐噪声,并将噪声添加到图片上,最后返回添加噪声后的图片。
- 使用os.listdir遍历path1文件夹中的所有文件。
- 使用cv2.imread读取每个文件的图片。
- 调用sp_noise函数给图片添加椒盐噪声,噪声比例为0.1。
- 使用cv2.blur对添加噪声后的图片进行均值滤波处理,滤波器大小为(20, 20)。
- 使用cv2.imwrite将处理后的图片保存到path2文件夹中,文件名与原始图片相同。
5.3 setup.py
class PPGAN:def __init__(self):with open('requirements.txt', encoding="utf-8-sig") as f:self.requirements = f.readlines()def readme(self):with open('README.md', encoding="utf-8-sig") as f:self.README = f.read()def setup(self):setup(name='ppgan',packages=find_packages(),include_package_data=True,entry_points={"console_scripts": ["paddlegan= paddlegan.paddlegan:main"]},author='PaddlePaddle Author',version=__version__,install_requires=self.requirements,license='Apache License 2.0',description='Awesome GAN toolkits based on PaddlePaddle',long_description=self.readme(),long_description_content_type='text/markdown',url='https://github.com/PaddlePaddle/PaddleGAN',download_url='https://github.com/PaddlePaddle/PaddleGAN.git',keywords=['gan paddlegan'],classifiers=['Intended Audience :: Developers', 'Operating System :: OS Independent','Natural Language :: Chinese (Simplified)','Programming Language :: Python :: 3','Programming Language :: Python :: 3.5','Programming Language :: Python :: 3.6','Programming Language :: Python :: 3.7', 'Topic :: Utilities'],)
这是一个Python的安装脚本文件,文件名为setup.py。该脚本用于安装ppgan工具包,并设置相关的配置信息。脚本中使用了setuptools库来进行安装和打包操作,使用了find_packages函数来查找所有的包,使用了open函数来读取文件内容。
脚本中定义了一个readme函数,用于读取README.md文件的内容作为长描述。在setup函数中,设置了ppgan的名称为’ppgan’,包含所有的包,包括数据文件,设置了命令行入口为’paddlegan’,作者为’PaddlePaddle Author’,版本号为__version__,依赖包为requirements.txt中的内容,许可证为Apache License 2.0,描述为’Awesome GAN toolkits based on PaddlePaddle’,长描述为README.md的内容,URL为源码,下载URL为,关键词为’gan paddlegan’,分类器为一些开发者相关的信息和Python版本信息。
6.系统整体结构
以下是每个文件的功能概述:
文件路径 | 功能 |
---|---|
cycleGAN.py | 实现CycleGAN模型的训练和推理 |
demo.py | 演示文件,用于展示模型的使用方法 |
setup.py | 安装文件,用于安装依赖和设置环境 |
ui.py | 用户界面文件,用于创建图形用户界面 |
applications_init_.py | 应用程序模块的初始化文件 |
7.图像风格迁移
艺术风格迁移是一种有吸引力的技术,可以利用内容图像的结构和示例风格图像的风格样式来创造艺术图像。它已经成为学术界和工业界普遍的研究课题。近年来,人们提出了许多神经风格迁移的方法,大致可分为两类:图像优化方法和模型优化方法。
图像优化方法是利用固定网络迭代优化风格化图像。Gatyset等人的开创性工作在迭代优化过程中实现风格迁移,其中风格样式是通过从预先训练的深度神经网络中提取的特征的相关性来捕获的。后续工作主要以不同损失函数的形式改进。虽然取得了优越的风格化结果,例如STROTSS,但这些方法的广泛应用仍然受到其在线优化过程缓慢的限制。相反,模型优化方法通过训练来更新神经网络,并在测试中进行前馈。主要有三种细分类型:
(1)Per-Style-Per-Model方法,被训练来合成具有单一特定风格的图像;
(2)Multi-Style-Per-Model方法,引入多种网络架构,同时处理多种风格;
(3)Arbitrary-Style-Per-Model方法,进一步采用多种特征修改机制来迁移任意风格。
回顾这些方法,我们发现虽然局部风格样式可以被迁移,但是混合了全局和局部风格的复杂样式仍然不能被正确地迁移。与此同时,很多情况下会出现伪影和瑕疵。为此,在本次工作中,我们的主要目标是通过前馈网络实现高质量的艺术风格迁移,在美学上保留局部和全局的样式。
人类画家在绘画时如何处理复杂的风格样式?一个常见的过程,特别是对于初学者来说,是先画一个草图捕捉整体结构,然后逐步修改局部细节,而不是直接一步一步完成最终的画。受此启发,我们提出了一种新的用于风格迁移的神经网络——拉普拉斯金字塔网络(LapStyle)。首先,在我们的框架中,Drafting Network被设计用于在低分辨率下迁移全局风格样式,因为我们观察到,由于更大的感受野和更少的局部细节,全局风格更容易在低分辨率下迁移。然后使用Revision Network根据草稿和拉普拉斯滤波在2倍分辨率的内容图像上提取的纹理,通过产生残差图像,在高分辨率下修改局部细节。注意,我们的Revision Network可以以金字塔的方式堆叠,以生成更高分辨率的细节。最终的风格化图像是通过聚合所有金字塔层的输出得到的。此外,我们采用浅色块判别器对局部风格样式进行对抗性学习。如图1所示,我们的“Drafting and Revison”过程取得了不错的风格化结果。
综上所述,主要贡献如下:
我们引入了一个新的框架“Drafting and Revison”,通过将风格迁移过程拆分为全局风格样式起草和局部风格样式修订来模拟绘画创作机制。
我们提出了一种新的前馈式迁移方法LapStyle。采用Drafting Network迁移低分辨率的全局风格样式,采用高分辨率Revision Network根据内容图像的多级拉普拉斯滤波输出,以金字塔方式修正局部风格样式。
实验证明,我们的方法可以生成高分辨率和高质量的风格化结果,其中全局和局部风格样式都是有效合成的。此外,本文提出的LapStyle具有极高的效率,能够在512分辨率下达到100fps的速度。
8.网络结构
对于输入的内容图像xc和风格图像xs,分别提取其拉普拉斯金字塔区。, r.2和(xs,r’s),其中x,是xc两倍下采样的结果,而残差图r ,是利用拉普拉斯滤波器得到的,保存了下采样时丢失的高频信息。风格图像也做了同样的处理
在第一阶段,Drafting Network首先使用预训练的神经网络对来自又.和x.的内容特征和风格特征进行编码,然后使用多粒度的风格特征对内容特征进行调制,最后使用解码器生成风格化图像.xs。在第二阶段,Revision Network首先将.c上采样到x s,然后将x 和r o连接起来作为网络输入,生成带有高频风格化细节的残差图rs。最后,我们通过聚合低分辨率风格化结果和高分辨率残差图得到最终风格化图像xcs。
Drafting Network
Drafting Network的目的是在低分辨率下综合全局样式。为什么用低分辨率?我们观察到,由于接收域大,局部细节少,全局样式在低分辨率下更容易迁移。为了实现单一风格的迁移,早期的工作直接训练一个编码器-解码器模块,其中只有内容图像被用作输入。为了更好的结合风格特性和内容特性,我们从最近的任意风格迁移方法中采用了AdaIN。
Drafting Network的结构如图3所示,其中包括一个编码器、几个AdaIN模块和一个解码器。 (1) 编码器是一个预先训练好的VGG-19网络,在训练过程中是固定的。对于给出的x xxc和x xxs,VGG编码器在2_1、3_1和4_1层提取多个粒度的特征。 (2) 然后,我们分别在2_1、3_1和4_1层后使用AdaIN模块在内容和风格特征之间进行特征调制。 (3) 最后,在解码器的每个粒度中,来自AdaIN模块的相应特征通过跳跃连接进行合并,在这里,利用低级别和高级别的AdaIN模块之后的跳跃连接有助于保留内容结构,特别是对于低分辨率图像。
Revision Network
Revision Network的目的是通过生成残差细节图像来修正粗糙的风格化图像,而最终的风格化图像是通过聚合r c和粗糙的风格化图像区xs生成的。这个过程确保了全局风格样式在xs中的分布得到了妥善的保留。同时,Revision Network更容易学习利用残差细节图像对局部风格图像进行修正。
如图所示,Revision Network设计为简单有效的编解码器架构,只有一个下采样层和一个上采样层。此外,我们还引入了一个patch判别器来帮助Revision Network在对抗学习设置下捕获精细的patch纹理。我们选择定义一个相对较浅的D,(1)避免过度拟合,因为我们只有—个风格图像;(2)控制感受野,以确保只能捕获局部样式。
9.系统整合
下图完整源码&环境部署视频教程&自定义UI界面
参考博客《基于生成式对抗网络的图像风格迁移系统》