【深度学习 | 风格迁移】神经网络风格迁移,原理详解附详细案例源码

在这里插入图片描述

🤵‍♂️ 个人主页: @AI_magician
📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍

图像迁移技术

    • 图像风格迁移技术
      • Neural Style Transfer(神经风格迁移)
        • 内容 & 风格表示
        • 论文实现(Keras实现)

论文复现系列专栏,欢迎大家支持!

✨相关源码和模型的下载链接地址✨ : 点击链接进行跳转

图像风格迁移技术

图像风格迁移是指将一张图像的内容与另一张图像的风格相融合,生成具有新风格的图像。

风格(style)是指图像中不同空间尺度的纹理、颜色和视觉图案,内容(content)是指图像的高级宏观结构

风格迁移这一想法与纹理生成的想法密切相关,在 2015 年开发出神经风格迁移之前,这一想法就已经在图像处理领域有着悠久的历史。但事实证明,与之前经典的计算机视觉技术实现相比,基于深度学习的风格迁移实现得到的结果是无与伦比的,并且还在计算机视觉的创造性应用中引发了惊人的复兴。

风格迁移其主要应用场景如在艺术创作场景,将不同艺术风格应用于图像,可以创造出独特的艺术效果,使作品具有新的视觉呈现。或者在社交平台上风格化滤镜,图像增强等。

历史发展历程

  • 早期方法:最早的图像风格迁移方法是基于优化的方法,如L. A. Gatys等人提出的"Neural Style Transfer"(神经风格迁移)算法。该算法通过最小化内容图像与风格图像之间的差异,同时最大化生成图像与风格图像之间的相似性来实现风格迁移。这种方法需要进行大量的迭代优化,计算成本较高。

  • 基于卷积神经网络(CNN)的方法:随着深度学习的发展,基于卷积神经网络的方法逐渐成为主流。Gatys等人的方法启发了后续的研究者,他们提出了一系列基于CNN的图像风格迁移算法,如"Perceptual Losses for Real-Time Style Transfer and Super-Resolution"(实时风格迁移和超分辨率的感知损失)和"Instance Normalization: The Missing Ingredient for Fast Stylization"(实例归一化:快速风格化的缺失要素)。

  • 基于生成对抗网络(GAN)的方法:生成对抗网络是一种强大的深度学习架构,被广泛用于图像生成任务。在图像风格迁移中,也有研究者采用GAN来实现更好的风格迁移效果。例如,“CycleGAN: Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks”(CycleGAN:使用循环一致性对抗网络进行无配对图像转换)是一种无需成对训练数据的图像风格迁移方法,它可以在不同风格的图像之间进行转换。

下表对上文的几种常见的图像风格迁移算法优缺点进行描述。

算法名称特点优缺点
Neural Style Transfer(神经风格迁移)- 基于优化的方法,生成图像与风格图像之间的相似性较高
- 需要进行大量的迭代优化,计算成本较高。
- 可能会出现一些艺术上的不稳定性,生成图像的细节不够清晰。
优点:生成图像与风格图像相似度高。
缺点:计算成本高,生成图像细节不清晰。
Fast Neural Style Transfer(快速神经风格迁移)- 通过引入一个风格化网络,加速了风格迁移的过程。
- 可以实时地对图像进行风格迁移。
- 生成的图像细节相对较清晰。
优点:风格迁移速度快,生成图像细节清晰。
缺点:对大尺寸图像的处理可能存在困难。
CycleGAN(循环一致性对抗网络)- 无需成对训练数据,可以在不同风格的图像之间进行转换。
- 基于生成对抗网络,生成的图像质量较高。
- 可以处理无配对的训练数据,具有较大的灵活性。
优点:无需成对训练数据,生成图像质量高。
缺点:对于复杂的风格迁移任务,可能需要更多的训练数据。

相关学习资源

  • 论文:

    • Gatys, L. A., Ecker, A. S., & Bethge, M. (2016). A neural algorithm of artistic style. arXiv preprint arXiv:1508.06576.
    • Johnson, J., Alahi, A., & Fei-Fei, L. (2016). Perceptual losses for real-time style transfer and super-resolution. In European conference on computer vision (pp. 694-711). Springer, Cham.
    • Ulyanov, D., Vedaldi, A., & Lempitsky, V. (2016). Instance normalization: The missing ingredient for fast stylization. arXiv preprint arXiv:1607.08022.
    • Zhu, J. Y., Park, T., Isola, P., & Efros, A. A. (2017). Unpaired image-to-image translation using cycle-consistent adversarial networks. In Proceedings of the IEEE international conference on computer vision (pp. 2223-2232).
  • 代码实现:

    • Neural Style Transfer in TensorFlow
    • Fast Neural Style Transfer in PyTorch
    • CycleGAN in PyTorch

Neural Style Transfer(神经风格迁移)

自Leon A. Gatys、Alexander S. Ecker 和 Matthias Bethge 于 2015 年发表的文章“A neural algorithm of artistic style”以来,风格迁移开始不断地改进,也出现了许多变体。

其中风格迁移的流程可以为以下公式

style transfer

这是原论文的演示图(左下角的小图为对应的风格)

在这里插入图片描述

内容 & 风格表示

我们需要让输出的目标图像既符合原始图像和目标风格,就需要内容和风格进行表示。

在深度学习实现上,我们需要确定我们的的目标是什么,就是保存原始图像的内容,同时采用参考图像的风格。那么就有一个适当的损失函数将对其进行最小化,如下:
l o s s = d i s t a n c e ( s t y l e ( r e f e r e n c e _ i m a g e ) − s t y l e ( g e n e r a t e d _ i m a g e ) ) + d i s t a n c e ( c o n t e n t ( o r i g i n a l _ i m a g e ) − c o n t e n t ( g e n e r a t e d _ i m a g e ) ) loss = distance(style(reference\_image) - style(generated\_image)) + \\ distance(content(original\_image) - content(generated\_image)) loss=distance(style(reference_image)style(generated_image))+distance(content(original_image)content(generated_image))
这里的 distance 是一个范数函数(用来衡量向量或矩阵的大小或长度),比如 L2 范数;content 是一个函数,输入一张图像,并计算出其内容的表示;style 是一个函数,输入一张图像,并计算出其风格的表示。将这个损失最小化,会使得 style(generated_image) 接近于 style(reference_image)、content(generated_image) 接近于 content(generated_image),从而实现我们定义的风格迁移。

Gatys 等人通过深度卷积神经网络能够从数学上定义 style和 content 两个函数。

内容
在CNN卷积网络进行对象识别任务中,随着层次的加深对象的信息输出更加的明确,较前的层数特征图输出到一些更加通用的结构,比如猫狗分类中的基础边缘线条,而更深的层可以捕捉到更加全局和抽象的结构,如猫耳,猫眼睛。根据这个模式,我们可以通过不同深度的层特征图重建输入图像以可视化层所包含输入图像的信息,如下图可以看到深层的特征图包含了图像中对象的全局排列信息(高级、抽象),但是像素值信息会丢失。浅层的层特征图重建图像几乎是完整的精确像素值。

在这里插入图片描述

这样一来在内容上的损失函数便是在一个预训练模型(需要在大型数据集下训练好的能有效提取特征的模型)同一深的层激活的范式数,这样至少在深的层看来,二者图像的内容是一致的。

风格
同样的,不同深度的层特征图包含了不同空间尺度的输入图像的信息,基于此Gatys等人在每一层特征图中采用格拉姆矩阵(Gram matrix)(描述特征图之间的相关性),即特征值的内积,以在不同空间尺度下提取不同滤波器的特征图之间的相互关系(纹理),得到输入图像的多尺度的纹理信息(不捕获全局排列信息)。如上图层激活所包含的风格信息(颜色和局部排列信息),abcde图为不同子集的CNN层的风格重建图像的风格,(“conv1 1”(a)、“conv1 1”和“conv2 1”(b)、“conv1 1”、“conv2 1”和“conv3 1”(c)、“conv1 1”、“conv2 1”、“conv3 1”和“conv4 1”(d)、“conv1 1”、“conv2 1”、“conv3 1”、“conv4 1”和“conv5 1”(e)) 这会输出与参考图像风格越来越模式匹配的输出,且会忘记其全局排列信息.

通过使输出图像和风格图像在不同尺度的层激活都有相似的相互关系,即不同尺度的纹理都很相同,便可以实现风格的迁移。

此外,在风格和内容上我们还需要定义贡献强度,这里我们可以通过损失函数的权重来实现即可

通过这两种构建损失函数进行优化,便可以使得模型输出图像符合在深层次中“看到”的图像内容是一致的,不同层中特征图的内部特征相互关系的是相似的以实现目标

论文实现(Keras实现)

神经风格迁移可以用任何预训练的模型进行实现(只要能够很好实现前面所述的目标即可),原论文所实现的是VGG19网络。

神经风格迁移流程一般为 计算层激活 -> 计算损失函数 -> 梯度下降最优化损失函数

  1. 网络层激活:输出目标图像,原始图像,参考图像的层激活输出
  2. 计算损失函数: 通过所求的层激活计算对应的内容和风格损失函数
  3. 梯度下降优化:通过梯度下降的方式减小损失函数,训练模型参数使得模型能学习到参考图像风格的纹理和保持内容的不变

具体在实现上来说流程如下

  1. 使图像尺寸大小相似(如果差异很大,由于模型中尺度变换会使得风格迁移很麻烦)

  2. 读取图像, 加载预训练模型,得到层激活

  3. 根据层激活构建需要最小化的最终损失(需要注意的是在重建图像需要添加总变差损失平滑图像)

    在图像重建或图像去噪任务中,通常将总变差损失与其他损失函数(如均方误差损失)相结合,通过权衡平滑性和重建准确性。在这里需要注意的是Loss的权重值。

    如果强调注重风格则可能会没有任何内容的结构,如从左到右是强调内容的强度,其中层次越深,生成的图像纹理越抽象(每列上方的数字表示强调照片内容匹配与艺术品风格之间的比率α/β)

    image-20240111162718809

  4. 设置梯度下降优化算法(论文所实现的方案为L-BFGS 算法,)

  5. 训练模型

以下是是实现的一个效果,在这里插入图片描述

在这里插入图片描述

该技术对图像仅仅是改变图像纹理(风格迁移),如果风格参考图像有明显的纹理信息和高度自相关时(原论文采用的梵高画像就有着很好的纹理特征),且内容信息不复杂,不需要高层次细节就能被识别,该算法效果最好,因此该算法通常也难以迁移一个抽象的风格,比如将一个肖像的绘画风格迁移过来,这是一个很抽象的流程,该算法更多的可以看作是信号处理过程,所以不要指望能发生魔法般的效果👀。

此外,该算法实现风格迁移速度很慢(我们可以适当减少训练轮次或减小图片像素,建议在晚上睡觉前跑一遍👀),尤其是图像较大的情况,但是这种低层次的纹理变化很简单,我们可以通过花费大量的时间参考某一个固定风格图像批量生成许多输入 - 输出样例图像,并训练一个小型前馈卷积神经网络学习这种变换,就可以非常快速进行这种变换(秒级)

✨相关源码和模型的下载链接地址✨ : 点击链接进行跳转

在这里插入图片描述

						  🤞到这里,如果还有什么疑问🤞
					🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
					 	 🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

将Python程序打包成exe文件

一、什么是exe可执行文件? **exe文件英文全名是executable file,翻译为可执行文件(但它不等于可执行文件),可执行文件包含两种,文件扩展名为.exe的是其中的一种。exe文件可以在Windows平台上直接双击运行&a…

蓝凌EIS智慧协同平台 多处SQL注入漏洞复现

0x01 产品简介 蓝凌EIS智慧协同平台是一款专为企业提供高效协同办公和团队合作的产品。该平台集成了各种协同工具和功能,旨在提升企业内部沟通、协作和信息共享的效率。 0x02 漏洞概述 由于蓝凌EIS智慧协同平台 doc_fileedit_word.aspx、frm_form_list_main.aspx、frm_butt…

力士乐触摸屏维修触控屏VR2109.01-00-01-N2-NNN-A

Rexroth力士乐触控屏VCP20.1BUN.768PB-NN-PW数控系统屏幕维修及排查: 力士乐数控机床故障诊断的一般步骤都是相同的。当数控机床发生故障时,除非出现危险及数控机床或人身的紧急情况,一般不要关断电源,要尽可能地保持机床原来的状…

zotero云存储免费扩容到25G

zotero免费云存储只有300MB,若想扩容要么付费购买zotero的云空间,要么通过WebDAV方式使用云盘空间进行同步。很久以前好像尝试过坚果云盘,但是感觉有点辣鸡,网上的博客教程大部分都是用的坚果。 最后在淘宝上花了20找人远程了一下…

Google的Ndk-Sample学习笔记之一(hello-jniCallback)

前言: 近段时间因为项目的需求,需要使用JNI,所以下载了Google的Ndk-Sample学习下,准备记录 下来,留给后期自己查看 问题点一:JNI_OnLoad方法必须返回JNI的版本 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {JNIEnv *env;memset(&g_ctx, 0, sizeof(g_…

竞赛保研 基于深度学的图像修复 图像补全

1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学的图像修复 图像补全 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-se…

C#编程-实现多线程

实现多线程 多线程帮助同时执行各种操作。这为用户节省时间。多线程程序包括一个主线程和其他用户定义的线程以同时执行多个任务。 微处理器为执行的进程分配内存。每个进程占有内存中它们自己的地址空间。但是,所有在进程中的线程占有相同的地址空间。多线程允许在一个程序…

美团2024届秋招笔试第一场编程真题(js版本)

1.小美的外卖订单 简单的加法逻辑,需要注意的是各个数据的边界问题 折扣价不能超过原价减的价格不能超过满的价格满减优惠仅限原价购入 const rl require("readline").createInterface({ input: process.stdin }); void (async function () {let count…

JavaScript保留字和预定义的全局变量及函数汇总

保留字也称关键字,每种语言中都有该语言本身规定的一些关键字,这些关键字都是该语言的语法实现基础,JavaScript中规定了一些标识符作为现行版本的关键字或者将来版本中可能会用到的关键字,所以当我们定义标识符时就不能使用这些关…

典型场景解析|PolarDB分布式版如何支撑SaaS多租户?

SaaS多租户背景 很多平台类应用或系统(如电商CRM平台、仓库订单平台等等),它们的服务模型是围绕用户维度(这里的用户维度可以是一个卖家或品牌,可以是一个仓库等)展开的。因此,这类型的平台业务…

文件上传漏洞(全网最详细)

目录 前言 文件上传漏洞介绍 文件上传漏洞危害 文件上传漏洞满足条件 文件检测流程 CTFSHOW 151关-170关 151关:前端验证绕过 152关:后端校验 Content-Type 校验文件格式 153关:filename字段文件后缀校验 154关:关键字过…

18_类加载

文章目录 类加载器类加载时机Java代码的3个阶段 反射关于Class配置文件(.properties)Properties类通过反射获取构造方法(Constructor)通过反射获取成员变量(Field)通过反射获取成员方法(Method) 其他API自定义类加载器反射的应用 类加载器 分类: Bootstrap ClassLo…

Visual Studio中项目添加链接文件

这个需求在VS里面使用还真不多见,只是最近在做项目的版本编号的时候遇到一个头大的问题,我一个解决方案下面有几十个类库,再发布的时候这几十个类库的版本号必须要统一,之前我们都是在单个的AssemblyInfo.cs里面去改相关的信息&am…

轻量级图床Imagewheel本地部署并结合内网穿透实现远程访问

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测…

Echarts的常用API,以及常用的写法

ECharts是一款基于JavaScript的开源可视化库,用于构建交互式的图表和可视化数据。它提供了丰富的API用于定制图表和处理数据。下面是一些常用的ECharts API和写法的简介: 初始化图表容器: var myChart echarts.init(document.getElementBy…

win11更改桌面默认存储路径

打开文件资源管理器 右击桌面点击属性 在属性中找到位置选项卡,在里面有一个移动,点击它选择你想要的位置 选好位置后点击应用,随后会出现一个进度条,跑完后点击确认 到这里就完成了桌面默认位置的转移

在windows11系统上利用docker搭建linux记录

我的windows11系统上,之前已经安装好了window版本的docker,没有安装的小伙伴需要去安装一下。 下面直接记录安装linux的步骤: 一、创建linux容器 1、拉取镜像 docker pull ubuntu 2、查看镜像 docker images 3、创建容器 docker run --…

2024 年 1 月安全更新修补了 58 个漏洞(Android )

谷歌发布了针对 Android 平台 58 个漏洞的补丁,并修复了 Pixel 设备中的 3 个安全漏洞,拉开了 2024 年的序幕。 Android 2024 年 1 月更新的第一部分以 2024 年 1 月 1 日安全补丁级别发布在设备上,解决了框架和系统组件中的 10 个安全漏洞&…

高级分布式系统-第6讲 分布式系统的容错性--故障/错误/失效/异常

分布式系统容错性的概念 分布式系统的容错性: 当发生故障时, 分布式系统应当在进行恢复的同时继续以可接受的方式进行操作, 并且可以从部分失效中自动恢复, 且不会严重影响整体性能。 具体包括以下4个方面的内容: 可…

redis — redis cluster集群模式下如何实现批量可重入锁?

一、redis cluster 集群版 在Redis 3.0版本以后,Redis发布了Redis Cluster。该集群主要支持搞并发和海量数据处理等优势,当 Redis 在集群模式下运行时,它处理数据存储的方式与作为单个实例运行时不同。这是因为它应该准备好跨多个节点分发数据,从而实现水平可扩展性。具体能…