草庐IT

【深度学习实战】基于深度学习的图片风格快速迁移软件(Python源码+UI界面)

阿_旭 2024-06-22 原文

功能演示

摘要:图像风格迁移(Image Style Transfer)是一种将一张图像的风格应用到另一张图像上的技术。本文详细介绍了其实现的技术原理,同时给出完整的Python实现代码、训练好的Pt模型,并且通过PyQT实现了UI界面,更方便进行功能的展示。图片风格转换系统主要实现了3种风格的图片转移模型(可以自己训练喜欢的风格模型),只需要载入要进行风格转化的图片,并选择自己喜欢的风格,就可以立即得到转化后的图片效果。本文提供了完整的Python代码和使用教程,给感兴趣的小伙伴参考学习,完整的代码资源文件获取方式见文末。

文章目录

点击跳转至文末《完整相关文件及源码》获取


前言

图像风格迁移(Image Style Transfer)是一种将一张图像的风格应用到另一张图像上的技术。具体来说,它将一张包含艺术风格的图像作为输入(称为"风格图片"),并将其应用到一张包含内容的图像(称为"内容图片")上,以生成一张新的图像,该图像保留了原始内容图片的内容,但具有风格图片的艺术风格。它是一种深度学习技术,利用了卷积神经网络的特征提取能力。通常使用预训练的卷积神经网络,如VGG网络,以提取输入图像的特征表示。然后,通过最小化内容图片和风格图片的特征表示之间的差异,以及保持生成图像与内容图片之间的相似度,生成新的图像。图像风格迁移可以应用于许多场景,如图像编辑、艺术创作、视频处理等,它是计算机视觉领域中的热门研究方向之一。

下面是博主设计的简洁软件界面,能够实现目标图片的风格选择,并且快速的将目标图片转换为指定风格并进行展示,还提供了图片保存功能。感兴趣的小伙伴可以自己试试。

觉得不错的小伙伴,感谢点赞、关注加收藏!如果大家有任何建议或意见,欢迎在评论区留言交流!

初始界面如下图:

图片载入并选择图片风格之后,点击风格转换转换之后,界面如下:(然后点击保存图片,可以将转换后的风格图片保存至默认目录)

一、效果演示

(1)图片风格转移
点击载入图片,默认图片风格为梵高风格,点击风格转换,即可在右边显示出转换后的图片。

(2)更改图片风格
这里提供了3种预训练好的图片风格模型进行选择,通过下拉框选择指定的风格,然后点击风格转换即可。点击保存图片,即可将风格迁移后的图片进行保存。

二、图片迁移原理介绍

1.基本原理

本文主要利用的是基于神经网络的风格转换(Neural style transfer)技术:是一种基于离线模型优化的快速图像风格化迁移算法。核心思想就是利用基于离线模型优化的快速图像重建方法来节省时间。具体来说就是预训练一个前向网络,使得图像经过一次前向计算就可以得到图像重建结果,在依据各自约束来优化这一结果。根据一个训练好的前向网络能够学习到多少个风格作为分类依据,这里可以将这一类算法再细分为单模型单风格(PSPM)、单模型多风格(MSPM)和单模型任意风格(ASPM)的快速风格化迁移算法。
本文使用的是单模型单风格(PSPM)的方式,即基于某一种图片风格以VGG网络为backbone,训练好相应风格的预训练模型,然后可以直接使用该训练好的模型对于图片进行快速的风格迁移。基本原理见下图:

更多原理介绍可参考:https://blog.csdn.net/qq_39297053/article/details/120453246

2.训练模型

可以在自己的输入样式图像上训练自定义模型。为此,需要一个内容图像数据集来进行训练:例如MS-COCO 2014 数据集。

启动训方式,按以下方式运行train.py脚本:

python train.py --dataset_path [PATH_TO_DATASET] --style_image_path [PATH_TO_STYLE_IMAGE]

具体示例如下:

python train.py \
  --dataset_path ms-coco \
  --style_image_path images/style/1.jpg \
  --batch_size 8 \
  --lambda_style 200

dataset_path:包含训练集和验证集的文件夹的路径。该文件夹的结构应如下所示:

train.py的参数说明:

style_image_path:目标样式图像的路径。
root_logdir:保存模型快照和 TensorBoard 日志的根目录。默认=“模型”。
weights_snapshot_path:模型权重快照的路径。在恢复以前的培训工作时使用。默认 = ‘’。
lambda_content:内容项在总损失中的权重。经验上好的范围:1 - 100。默认值 = 10。
lambda_style:样式项在总损失中的权重。经验上好的范围:10 - 100,000。默认值 = 100。
lambda_tv:生成图像的总变化在总损失中的权重。经验上好的范围:0 - 1,000。默认值 = 10。
learning_rate:优化过程中每一步的大小。默认值 = 1e-3。
epochs:要执行的训练时期数。默认值 = 2。
content_block_weights:每个卷积块在内容损失中的权重。这五个数字指的是VGG19模型的以下五个激活:conv1_1、conv2_1、conv3_1、conv4_1、conv5_1。默认值 = (0.0, 1.0, 0.0, 0.0, 0.0)。
style_block_weights:样式损失中每个卷积块的权重。这五个数字指的是VGG19模型的以下五个激活:conv1_1、conv2_1、conv3_1、conv4_1、conv5_1。默认 = (1/5, 1/5, 1/5, 1/5, 1/5)。
input_images_dim:模型输入图像的维度。默认值 = 256。
visualization_interval:间隔(训练迭代次数),之后程式化图像的中间结果将在 TensorBoard 中可视化。默认值 = 50。
snapshot_interval:间隔(训练迭代次数),之后模型的中间快照将被保存到磁盘。默认值 = 1000。
batch_size:用于每次训练迭代的小批量大小。默认值 = 4。
num_data_loader_workers:用于在后台从数据集中加载图像的工作人员数量。默认值 = 5。

3.模型使用方法

命令行方式:

python run.py [PATH_TO_PRETRAINED_MODEL] [PATH_TO_CONTENT_IMAGE] [PATH_TO_STYLIZED_OUTPUT]

编程方式:

import image_utils
from stylize import Stylizer

stylizer = Stylizer('models/style1.pt')
image = image_utils.load('images/content/1.jpg')
stylized = stylizer.stylize(image)
image_utils.save(stylized, f'images/stylized/style1/1.jpg')

4.风格迁移示例


【获取方式】

本文涉及到的完整全部程序文件:包括python源码、UI文件等(见下图),获取方式见文末:

注意:该代码采用Pycharm+Python3.8开发,运行界面的主程序为MainProgram.py,测试图片脚本可运行img_test.py。为确保程序顺利运行,请按照requirements.txt配置Python依赖包的版本。

关注下方名片【阿旭算法与机器学习】,回复【图片风格迁移】即可免费获取


结束语

以上过程是图片风格快速迁移的方法之一,还有更过的实现方法,小伙伴们可以尽情去探索哦~。
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

觉得不错的小伙伴,感谢点赞、关注加收藏哦!

有关【深度学习实战】基于深度学习的图片风格快速迁移软件(Python源码+UI界面)的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  4. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  5. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  6. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  7. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  8. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  9. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  10. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

随机推荐