使用PyTorch进行图像风格迁移:基于VGG19实现

图像风格迁移(Neural Style Transfer, NST)是深度学习中一个令人着迷的应用,它能够将一张图像的风格应用到另一张图像上。例如,能够将梵高的画风应用到一张普通照片上。本文将详细解释如何使用PyTorch进行风格迁移,逐步分析代码,并讲解其中的关键技术。

1. 环境准备

在开始之前,确保安装了必要的库:

pip install torch torchvision pillow

2. 模型缓存目录设置

为了加速模型的加载,我们可以通过设置环境变量TORCH_HOME来指定模型缓存目录,避免每次运行代码时重新下载模型:

os.environ['TORCH_HOME'] = './model_directory'  # 你可以根据需要自定义目录

3. 加载图像

加载图像并进行预处理是风格迁移中的重要步骤。我们需要将图像转换为张量并进行归一化处理,以便与预训练的VGG19模型匹配:

def load_image(image_path, max_size=400):image = Image.open(image_path).convert('RGB')size = min(max_size, max(image.size))transform = transforms.Compose([transforms.Resize((size, size)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])])return transform(image).unsqueeze(0)

在这里,我们将图像调整为不大于400像素的正方形,并将其转换为适合VGG19模型输入的格式。

4. VGG19模型的特征提取

风格迁移的核心思想是将内容图像的高层次特征与风格图像的低层次特征结合。我们使用VGG19模型的前21层来提取图像的特征:

class VGG(nn.Module):def __init__(self):super(VGG, self).__init__()self.features = vgg19(pretrained=True).features[:21].eval()def forward(self, x):features = []for i, layer in enumerate(self.features):x = layer(x)if i in {0, 5, 10, 19, 21}:features.append(x)return features

5. 内容与风格损失

内容损失衡量生成图像与内容图像的特征差异,而风格损失则是基于Gram矩阵来衡量生成图像与风格图像的差异。

  • 内容损失:
class ContentLoss(nn.Module):def __init__(self, target):super(ContentLoss, self).__init__()self.target = target.detach()def forward(self, input):return nn.functional.mse_loss(input, self.target)
  • 风格损失:
class StyleLoss(nn.Module):def __init__(self, target):super(StyleLoss, self).__init__()self.target = self.gram_matrix(target).detach()def gram_matrix(self, input):batch_size, channels, height, width = input.size()features = input.view(batch_size * channels, height * width)G = torch.mm(features, features.t())return G.div(batch_size * channels * height * width)def forward(self, input):G = self.gram_matrix(input)return nn.functional.mse_loss(G, self.target)

6. 图像风格迁移算法

核心算法将内容图像初始化为输入图像,并通过多次迭代优化,使其逐步接近目标风格图像,同时保持内容的完整性。我们使用LBFGS优化器来实现这一过程:

def style_transfer(content_img, style_img, num_steps=1000, style_weight=1e9, content_weight=1):device = torch.device("cuda" if torch.cuda.is_available() else "cpu")content_img = content_img.to(device)style_img = style_img.to(device)model = VGG().to(device)style_features = model(style_img)content_features = model(content_img)input_img = content_img.clone().requires_grad_(True).to(device)optimizer = optim.LBFGS([input_img])style_losses = []content_losses = []for sf, cf in zip(style_features, content_features):content_losses.append(ContentLoss(cf))style_losses.append(StyleLoss(sf))run = [0]while run[0] <= num_steps:def closure():optimizer.zero_grad()input_features = model(input_img)content_loss = 0style_loss = 0for cl, input_f in zip(content_losses, input_features):content_loss += content_weight * cl(input_f)for sl, input_f in zip(style_losses, input_features):style_loss += style_weight * sl(input_f)loss = content_loss + style_lossloss.backward()run[0] += 1if run[0] % 50 == 0:print(f'Step {run[0]}, Content Loss: {content_loss.item():4f}, Style Loss: {style_loss.item():4f}')return lossoptimizer.step(closure)return input_img

7. 结果保存

生成的图像需要去除归一化并保存为常规图片格式:

def save_image(tensor, path):image = tensor.clone().detach()image = image.squeeze(0)image = transforms.ToPILImage()(image)image.save(path)

8. 主函数执行

整个过程可以通过主函数来执行,加载图像、进行风格迁移并保存结果:

if __name__ == '__main__':content_image_path = 'content_image.png'style_image_path = 'style_image.png'output_image_path = 'output_image.jpg'content_img = load_image(content_image_path)style_img = load_image(style_image_path)result = style_transfer(content_img, style_img)save_image(result, output_image_path)print(f"风格迁移完成,图像已保存为 {output_image_path}")

总结

本文展示了如何使用PyTorch和VGG19模型实现图像风格迁移。通过合理设置内容和风格损失的权重,我们可以生成既保留内容图像结构又具有风格图像艺术风格的全新图像。

完整代码

github:https://github.com/Yolumia/Image_style_transfer_base_vgg19/

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

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

相关文章

解决el-table排序sortable只排序当前页问题

el-table-column中添加sortable只是让每页数据单独排序&#xff0c;没有把所有数据进行排序&#xff0c;可以通过sort-change事件解决。 1、首先在需要排序的列上加sortable“custom” <el-table-columnprop"date"label"日期"width"180"sort…

C++(2)之Linux多线程服务端编程总结

C之Linux多线程服务端编程读书笔记 Author: Once Day Date: 2023年1月31日/2024年8月23日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: Linux实践…

C++:类与对象

一、面向对象编程 (一) 面向过程vs面向对象 面向过程&#xff08;Procedural-Oriented-Programming&#xff0c; POP&#xff09;和面向对象&#xff08;Object-Oriented-Programming&#xff0c;OOP&#xff09;&#xff0c;是两种典型的编程范式&#xff0c;通常是作为划分编…

Flume:大规模日志收集与数据传输的利器

Flume&#xff1a;大规模日志收集与数据传输的利器 在大数据时代&#xff0c;随着各类应用的不断增长&#xff0c;产生了海量的日志和数据。这些数据不仅对业务的健康监控至关重要&#xff0c;还可以通过深入分析&#xff0c;帮助企业做出更好的决策。那么&#xff0c;如何高效…

频带宽度固定,如何突破数据速率的瓶颈?

目录 目录 引言 信道 频带宽度 信噪比 信噪比的重要性 影响信噪比的因素 码元 码元的特点&#xff1a; 码元与比特的关系&#xff1a; 码元的作用&#xff1a; 码元的类型&#xff1a; Question 类比解释&#xff1a; 技术解释&#xff1a; 引言 在现代通信系统中…

Oracle EBS中AR模块的财务流程概览

应收账款 (AR) 模块是Oracle E-Business Suite (EBS) 中另一个重要的财务管理模块&#xff0c;主要用于管理企业销售过程中的账款回收。下面是AR模块中的一些关键财务流程及其详细说明&#xff1a; 1. 销售订单管理 创建销售订单&#xff1a;当客户下单时&#xff0c;销售人员…

Git 使用教程:从入门到精通

Git 是一个开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 创建&#xff0c;用于有效、高速地处理从小到大的项目版本管理。本教程将带你从 Git 的安装开始&#xff0c;逐步学习到如何使用 Git 进行日常的版本控制操作。 安装 Git Windows 访问 Git 官方网站 下载 …

OpenAI o1:AI领域的“草莓”革命,华人科学家贡献卓越

最近&#xff0c;科技界的热门明星“草莓”频繁出现在大家的视线中。9月11号&#xff0c;The Information报道称&#xff1a;OpenAI计划在未来两周内推出一款更智能、更昂贵、更谨慎的AI模型&#xff01;网友们对此消息持怀疑态度&#xff0c;认为类似消息屡见不鲜&#xff0c;…

centos8构建nginx1.27.1+BoringSSL+http3+lua+openresty

需要接入http3&#xff0c;索性最新的nginx在构建一波&#xff0c;趟一遍坑 准备工作 1.环境命令安装 yum install GeoIP -y yum install GeoIP-devel -y yum install libmaxminddb-devel -y yum install -y patch wget zlib zlib-devel lftp gcc gcc-c make openssl-devel p…

Pikachu靶场之csrf

CSRF 跨站请求伪造 CSRF入门及靶场实战 - FreeBuf网络安全行业门户 攻击者伪造恶意链接&#xff0c;诱使用户点击&#xff0c;这个链接附带了用户的认证凭据Cookie、Session等&#xff0c;执行操作如转账。 因为带了cookie、session&#xff0c;服务器认为是用户的行为。借用…

node-red 资料收集

环境搭建 使用echarts折线图制作面板 物联网项目Node-red镜像 docker run -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red node-red - 节点实战总结 采集服务器配置及软件安装

待机模式中WKUP上升沿模拟开机与关机

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 前言 待机模式 代码 wkup.h wkup.c main.c 使用注意 前言 建议先阅读下面的博客中待机模式部分。本博客主要分享代码-基于待机模式WKUP引脚的上升沿实现类似长按开机与关机的功能…

二维码的原理以及Java生成二维码【中间带图片】

一、什么是二维码&#xff1a; 二维码 &#xff08;2-dimensional bar code&#xff09;&#xff0c;是用某种特定的几何图形按一定规律在平面&#xff08;二维方向上&#xff09; 分布的黑白相间的图形记录数据符号信息的。 二、常用的码制 Data Matrix, Maxi Code, Aztec,…

看看智慧门诊银医通自助服务方案,如何化解医院患者跑难题

“看病三分钟&#xff0c;排队三小时”&#xff0c;这是许多患者在就医过程中的无奈吐槽。挂号队伍长如龙&#xff0c;看病流程繁琐复杂&#xff0c;缴费窗口人满为患&#xff0c;检查报告等待时间漫长…… 这些就医痛点&#xff0c;不仅让患者身心疲惫&#xff0c;也给医院的管…

基于微信小程序+Java+SSM+Vue+MySQL的宿舍管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSSMVueMySQL的宿舍管理系统【附源码文档…

F1C100S/F1C200S的资料来源说明

文章目录 常用板子开源创客荔枝派榴莲派 我想说是的官网啥资料都没有。但是它的资料又很多&#xff0c;从淘宝或者其他地方能都搜到很多。 http://wiki.lcmaker.com/index.php?titleLC-PI-200S https://github.com/peng-zhihui/Planck-Pi?tabreadme-ov-file#head4 http://do…

使用 PyCharm 新建 Python 项目详解

使用 PyCharm 新建 Python 项目详解 文章目录 使用 PyCharm 新建 Python 项目详解一 新建 Python 项目二 配置环境1 项目存放目录2 Python Interpreter 选择3 创建隔离环境4 选择你的 Python 版本5 选择 Conda executable 三 New Window 打开项目四 目录结构五 程序编写运行六 …

虚拟机Linux+Ubuntu操作系统 如何在虚拟机上安装docker VMPro 2024在线激活资源

一般情况下 不建议在windows系统上安装docker Windows本身就自带一个虚拟机叫WSL 但是不推荐在日常使用的电脑上安装 我们要下一个虚拟机 我们在window上安装docker会被告知WSL内核太老 我们要一个专业的 隔离的虚拟机软件 推荐使用虚拟机 这是我们的虚拟机软件 我们这边…

中国电子学会202403青少年软件编程(Python)等级考试试卷(三级)真题与解析

202403Python 三级真题 一、选择题 1.在 Python 中,hex(2023)的功能是?( ) A.将十进制数 2023 转化为十六进制数 B.将十进制数 2023 转化为八进制数 C.将十六进制数 2023 转化为十进制数 D.将八进制数 2023 转化为十进制数 2.下列表达式的值与其他三个选项不相…

Linux 性能优化 copy

如何分析 Linux 系统的性能瓶颈&#xff1f;有哪些工具可以使用&#xff1f; top&#xff1a;查看系统当前运行的进程以及资源占用情况。 vmstat&#xff1a;报告虚拟内存统计信息&#xff0c;包括系统、进程和块设备等方面的信息。 iostat&#xff1a;监视系统I/O活动&#…