【实战精选】掌握图像风格迁移:构建基于生成对抗网络的系统

1.研究背景与意义

随着计算机技术的不断发展,图像处理和计算机视觉领域取得了长足的进步。图像风格迁移是其中一个备受关注的研究方向,它可以将一幅图像的风格特征应用到另一幅图像上,从而创造出新的图像。这项技术具有广泛的应用前景,如艺术创作、电影特效、虚拟现实等领域。

传统的图像风格迁移方法主要基于优化算法,通过最小化图像的内容损失和风格损失来实现。然而,这些方法存在一些问题,如计算复杂度高、结果不稳定等。近年来,生成式对抗网络(GANs)的出现为图像风格迁移带来了新的突破。

GANs是一种由生成器和判别器组成的神经网络结构,通过博弈的方式训练生成器生成逼真的图像,同时判别器则试图区分真实图像和生成图像。GANs的核心思想是通过生成器和判别器之间的对抗学习,不断提升生成器的生成能力,从而生成更加逼真的图像。

基于生成式对抗网络的图像风格迁移系统具有以下几个方面的研究意义:

  1. 提高图像风格迁移的效果:传统的图像风格迁移方法往往无法完全捕捉到图像的风格特征,导致生成的图像与目标风格之间存在差异。而基于GANs的方法可以通过对抗学习不断优化生成器,从而生成更加逼真、细致的图像,提高图像风格迁移的效果。

  2. 提高图像风格迁移的稳定性:传统的图像风格迁移方法在处理复杂的图像时往往存在结果不稳定的问题,生成的图像可能会出现失真、模糊等情况。而基于GANs的方法可以通过对抗学习的方式提高生成器的稳定性,生成更加清晰、真实的图像。

  3. 拓展图像风格迁移的应用领域:基于生成式对抗网络的图像风格迁移系统具有广泛的应用前景。例如,在艺术创作领域,艺术家可以利用这一系统将不同风格的绘画作品进行融合,创造出独特的艺术作品。在电影特效领域,可以利用该系统将不同风格的特效图像应用到电影中,增强视觉效果。在虚拟现实领域,可以利用该系统将真实世界的风格特征应用到虚拟场景中,提升虚拟现实的真实感。

总之,基于生成式对抗网络的图像风格迁移系统具有重要的研究意义和广泛的应用前景。通过提高图像风格迁移的效果和稳定性,可以为艺术创作、电影特效、虚拟现实等领域带来更多可能性,推动图像处理和计算机视觉技术的发展。

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,它的功能是给指定文件夹中的图片添加椒盐噪声,并对添加噪声后的图片进行均值滤波处理,然后将处理后的图片保存到另一个文件夹中。

具体实现过程如下:

  1. 导入所需的库:os、cv2、random、numpy。
  2. 定义两个文件夹路径变量path1和path2,分别表示原始图片所在的文件夹和处理后图片保存的文件夹。
  3. 定义一个函数sp_noise,用于给图片添加椒盐噪声。该函数接受两个参数,一个是图片对象image,另一个是噪声比例prob。函数内部会根据噪声比例随机生成椒盐噪声,并将噪声添加到图片上,最后返回添加噪声后的图片。
  4. 使用os.listdir遍历path1文件夹中的所有文件。
  5. 使用cv2.imread读取每个文件的图片。
  6. 调用sp_noise函数给图片添加椒盐噪声,噪声比例为0.1。
  7. 使用cv2.blur对添加噪声后的图片进行均值滤波处理,滤波器大小为(20, 20)。
  8. 使用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界面
在这里插入图片描述

参考博客《基于生成式对抗网络的图像风格迁移系统》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/211668.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 NVProf 检测 CUDA kernel 的 bank conflict

使用 NVProf 检测 CUDA kernel 的 bank conflict NVProf 指令 使用 NVProf 可以对 bank conflict 进行检测: nvprof --events shared_ld_bank_conflict,shared_st_bank_conflict <app> [args...]其中: --events 选项指定的 shared_ld_bank_conflict,shared_st_bank_c…

NSGA-II求解微电网多目标优化调度(MATLAB)

一、NSGA-II简介 NSGA-Ⅱ算法是Kalyanmoy Deb等人于 2002年在 NSGA 的基础上提出的&#xff0c;它比 NSGA算法更加优越&#xff1a;它采用了快速非支配排序算法&#xff0c;计算复杂度比 NSGA 大大的降低&#xff1b;采用了拥挤度和拥挤度比较算子&#xff0c;代替了需要指定的…

Python Selenium 之数据驱动测试的实现!

数据驱动模式的测试好处相比普通模式的测试就显而易见了吧&#xff01;使用数据驱动的模式&#xff0c;可以根据业务分解测试数据&#xff0c;只需定义变量&#xff0c;使用外部或者自定义的数据使其参数化&#xff0c;从而避免了使用之前测试脚本中固定的数据。可以将测试脚本…

【2023.11.23】JDBC基本连接语法学习➹

1.导入jar包依赖&#xff1a;mysql-connector-java-8.0.27.jar 2.连接数据库&#xff01; 3.无法解析类->导入java.sql.*&#xff0c;&#xff08;将项目方言改为Mysql&#xff09; JDBC&#xff0c;启动&#xff01;&#xff01; public class Main {public static voi…

Shopee本土号封号几率大吗?如何避免封号?被封号了怎么办?

Shopee是近几年热门的电商平台之一&#xff0c;即使越来越多的跨境电商涌现&#xff0c;他的地位在东南亚市场依然占据一席之地&#xff0c;也依旧吸引着需要跨境商家入局。尤其在2023年&#xff0c;在TikTok Shop在印尼被关停之后&#xff0c;留下了大片空白&#xff0c;Shope…

FPGA----ZCU106使用petalinux 2019.1的第一个app开发

1、petalinux在zcu106上的构建参见前文 FPGA----ZCU106使用petalinux 2019.1&#xff08;全网最详&#xff09;-CSDN博客文章浏览阅读31次。本文完成了Vivado 2019.1版本下的基于ZCU106的全部linux系统移植https://blog.csdn.net/qq_37912811/article/details/1345197352、我们…

Modbus RTU协议及modbus库函数使用

一、与Modbus TCP的区别 在一般工业场景使用modbus RTU的场景还是更多一些&#xff0c;modbus RTU基于串行协议进行收发数据&#xff0c;包括RS232/485等工业总线协议。 与modbus TCP不同的是RTU没有报文头MBAP字段&#xff0c;但是在尾部增加了两个CRC检验字节&#xff08;CRC…

【C++】Cmake使用教程(看这一篇就够了)

文章目录 引言一 环境搭建二 简单入门2.1 项目结构2.2 示例源码2.3 运行查看 三 编译多个源文件3.1 在同一个目录下有多个源文件3.1.1 简单版本3.1.1.1 项目结构3.1.1.2 示例代码3.1.1.3 运行查看 3.1.2 进阶版本3.1.2.1 项目结构3.1.2.2 示例源码3.1.2.3 运行查看 3.2 在不同目…

Visual studio的安装教程2022最新版(图文详细)新手小白C语言软件的安装

目录 1、Visual Studio下载地址 2、工作负荷选择“使用C的桌面开发”和”Visual Studio扩展开发“&#xff0c;安装位置自选 3、下载完成后&#xff0c;点击左上角”文件“->”新建“->”项目“->”空项目“ 4、找到解决方案资源管理器的“头文件”&#xff0c;右键…

Visio学习笔记

1. 常用素材 1.1 立方体&#xff1a;张量, tensor 操作路径&#xff1a;更多形状 ⇒ 常规 ⇒ 基本形状 自动配色 在选择【填充】后Visio会自动进行配色&#xff1b;

Git本地库操作

对本地库的操作很少&#xff0c;我们学习1~6节即可&#xff0c;其他了解下。我们可以在idea中完成对本地库还有远程库的操作&#xff0c;可视化界面用起来更加舒适而且也不会混淆。 1. Git概述 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小…

飞翔的小鸟小游戏

主类 package APP;import 框架.GameFrame;public class GameApp {public static void main(String[] args) {//游戏的入口new GameFrame();} }场景实物 package 框架;import 图导.Constant; import 图导.GameUtil;import java.awt.*; import java.awt.image.BufferedImage; …