[oneAPI] Neural Style Transfer

[oneAPI] Neural Style Transfer

  • oneAPI
  • Neural Style Transfer
    • 特殊环境
    • 定义使用包
    • 加载数据
    • Neural Style Transfer模型与介绍
    • 训练过程
    • 结果

比赛:https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517
Intel® DevCloud for oneAPI:https://devcloud.intel.com/oneapi/get_started/aiAnalyticsToolkitSamples/

oneAPI

import intel_extension_for_pytorch as ipex# Device configuration
device = torch.device('xpu' if torch.cuda.is_available() else 'cpu')optimizer = torch.optim.Adam([target], lr=config.lr, betas=[0.5, 0.999])
vgg = VGGNet().to(device).eval()'''
Apply Intel Extension for PyTorch optimization against the model object and optimizer object.
使用Intel Extension for PyTorch中, 实际上在推理模式下是不需要优化器的
'''
vgg = ipex.optimize(vgg)

Neural Style Transfer

Neural Style Transfer是一种使用 CNN 将一幅图像的内容与另一幅图像的风格相结合的算法。给定内容图像和风格图像,目标是生成最小化与内容图像的内容差异和与风格图像的风格差异的目标图像。
在这里插入图片描述
内容丢失

为了最小化内容差异,我们将内容图像和目标图像分别前向传播到预训练的VGGNet,并从多个卷积层中提取特征图。然后,更新目标图像以最小化内容图像的特征图与其特征图之间的均方误差。

风格丧失

与计算内容损失一样,我们将风格图像和目标图像前向传播到 VGGNet 并提取卷积特征图。为了生成与风格图像的风格相匹配的纹理,我们通过最小化风格图像的 Gram 矩阵和目标图像的 Gram 矩阵之间的均方误差来更新目标图像(特征相关性最小化)。请参阅此处了解如何计算风格损失。

特殊环境

本实验:借助PyTorch以及Intel® Optimization for PyTorch,对PyTorch进行了精心的优化与扩展,极大地提升了其性能,特别是在英特尔硬件上的表现更加卓越。这一优化策略使得我们的模型在训练和推断过程中变得更加迅捷高效,显著缩短了计算时间,提升了整体效率。并通过深度融合硬件与软件的精巧设计,有效地解锁了硬件潜力,让模型的训练和应用变得更加快速高效,为人工智能应用带来了全新的可能性。
在这里插入图片描述

数据集使用自己收集的一些数据

在这里插入图片描述
在这里插入图片描述

content.png 表面原始的图片
在这里插入图片描述
style.png表示需要将原始图片转化为的风格

定义使用包

from __future__ import division
from torchvision import models
from torchvision import transforms
from PIL import Image
import argparse
import torch
import torchvision
import torch.nn as nn
import numpy as npimport intel_extension_for_pytorch as ipex# Device configuration
device = torch.device('xpu' if torch.cuda.is_available() else 'cpu')

加载数据

def load_image(image_path, transform=None, max_size=None, shape=None):"""Load an image and convert it to a torch tensor."""image = Image.open(image_path)if max_size:scale = max_size / max(image.size)size = np.array(image.size) * scaleimage = image.resize(size.astype(int), Image.LANCZOS)if shape:image = image.resize(shape, Image.LANCZOS)if transform:image = transform(image).unsqueeze(0)return image.to(device)

Neural Style Transfer模型与介绍

VGGNet是一个经典的深度卷积神经网络架构,由牛津大学的研究团队提出,用于图像分类和识别任务。VGGNet以其简单而有效的结构在计算机视觉领域取得了显著的成就,成为了深度学习研究的重要里程碑之一。

VGGNet的特点在于其深层的网络结构,通过多个小尺寸的卷积核和池化层的堆叠,达到了很强的特征提取能力。其标准结构包括数个卷积层,之后是池化层,最后是全连接层。

VGGNet在图像分类竞赛中取得了优异的表现,其简单的结构和深层次的特征提取使得它成为了其他网络架构的基础。然而,由于其深层次的结构,VGGNet在计算资源和训练时间上需要较大代价,后续的研究逐渐提出了更加高效的网络架构,如ResNet和Inception等。

而对于本任务,我们使用原图,目标图,风格图的’0’, ‘5’, ‘10’, ‘19’, '28’等层的特征进行对比,最后让原图和风格图内容对应,而目标图与风格图的风格相似

class VGGNet(nn.Module):def __init__(self):"""Select conv1_1 ~ conv5_1 activation maps."""super(VGGNet, self).__init__()self.select = ['0', '5', '10', '19', '28']self.vgg = models.vgg19(pretrained=True).featuresdef forward(self, x):"""Extract multiple convolutional feature maps."""features = []for name, layer in self.vgg._modules.items():x = layer(x)if name in self.select:features.append(x)return features

训练过程

def main(config):# Image preprocessing# VGGNet was trained on ImageNet where images are normalized by mean=[0.485, 0.456, 0.406] and std=[0.229, 0.224, 0.225].# We use the same normalization statistics here.transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize(mean=(0.485, 0.456, 0.406),std=(0.229, 0.224, 0.225))])# Load content and style images# Make the style image same size as the content imagecontent = load_image(config.content, transform, max_size=config.max_size)style = load_image(config.style, transform, shape=[content.size(2), content.size(3)])# Initialize a target image with the content imagetarget = content.clone().requires_grad_(True)optimizer = torch.optim.Adam([target], lr=config.lr, betas=[0.5, 0.999])vgg = VGGNet().to(device).eval()'''Apply Intel Extension for PyTorch optimization against the model object and optimizer object.使用Intel Extension for PyTorch中, 实际上在推理模式下是不需要优化器的'''vgg = ipex.optimize(vgg)for step in range(config.total_step):# Extract multiple(5) conv feature vectorstarget_features = vgg(target)content_features = vgg(content)style_features = vgg(style)style_loss = 0content_loss = 0for f1, f2, f3 in zip(target_features, content_features, style_features):# Compute content loss with target and content imagescontent_loss += torch.mean((f1 - f2) ** 2)# Reshape convolutional feature maps_, c, h, w = f1.size()f1 = f1.view(c, h * w)f3 = f3.view(c, h * w)# Compute gram matrixf1 = torch.mm(f1, f1.t())f3 = torch.mm(f3, f3.t())# Compute style loss with target and style imagesstyle_loss += torch.mean((f1 - f3) ** 2) / (c * h * w)# Compute total loss, backprop and optimizeloss = content_loss + config.style_weight * style_lossoptimizer.zero_grad()loss.backward()optimizer.step()if (step + 1) % config.log_step == 0:print('Step [{}/{}], Content Loss: {:.4f}, Style Loss: {:.4f}'.format(step + 1, config.total_step, content_loss.item(), style_loss.item()))if (step + 1) % config.sample_step == 0:# Save the generated imagedenorm = transforms.Normalize((-2.12, -2.04, -1.80), (4.37, 4.46, 4.44))img = target.clone().squeeze()img = denorm(img).clamp_(0, 1)torchvision.utils.save_image(img, 'output-{}.png'.format(step + 1))if __name__ == "__main__":parser = argparse.ArgumentParser()parser.add_argument('--content', type=str, default='png/content.png')parser.add_argument('--style', type=str, default='png/style.png')parser.add_argument('--max_size', type=int, default=400)parser.add_argument('--total_step', type=int, default=2000)parser.add_argument('--log_step', type=int, default=10)parser.add_argument('--sample_step', type=int, default=500)parser.add_argument('--style_weight', type=float, default=100)parser.add_argument('--lr', type=float, default=0.003)config = parser.parse_args()print(config)main(config)

结果

在这里插入图片描述

迭代结果图

在这里插入图片描述

训练过程图

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

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

相关文章

Kafka 入门到起飞 - 什么是 HW 和 LEO?何时更新HW和LEO呢?

上文我们已经学到, 一个Topic(主题)会有多个Partition(分区)为了保证高可用,每个分区有多个Replication(副本)副本分为Leader 和 Follower 两个角色,Leader副本对外提供读…

做海外游戏推广有哪些条件?

做海外游戏推广需要充分准备和一系列条件的支持。以下是一些关键条件: 市场调研和策略制定:了解目标市场的文化、玩家偏好、竞争格局等是必要的。根据调研结果制定适合的推广策略。 本地化:将游戏内容、界面、语言、货币等进行本地化&#…

SpringBoot复习:(42)WebServerCustomizer的customize方法是在哪里被调用的?

ServletWebServletAutoConfiguration类定义如下: 可以看到其中通过Import注解导入了其内部类BeanPostProcessorRegister。 BeanPostProcessor中定义的registerBeanDefinition方法会被Spring容器调用。 registerBeanDefinitions方法调用了RegistrySyntheticBeanIf…

【C++】面向对象编程引入 ③ ( 面向过程编程的结构化程序设计方法 | 结构化程序设计方法概念 / 特点 / 优缺点 | 面向对象编程引入 )

文章目录 一、面向过程编程的结构化程序设计方法1、结构化程序设计方法概念2、结构化程序设计方法特点3、结构化程序设计方法优缺点 二、面向对象编程引入 一、面向过程编程的结构化程序设计方法 如果使用 面向过程语言 ( 如 : C 语言 ) , 开发 大型 项目 , 一般使用 结构化程序…

什么是字体堆栈(font stack)?如何设置字体堆栈?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是字体堆栈(Font Stack)?⭐ 如何设置字体堆栈?⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 …

Android Framework 全局替换系统字体

基于Android 11 Android Framework 全局替换系统字体 第一种通过替换系统默认字体 将需要替换的字体资源放置frameworks/base/data/fonts/目录下。 将系统默认的Roboto字体替换为HarmonyOs字体。 frameworks/base/data/fonts/fonts.xml frameworks/base/data/fonts/Android.…

Vue.js 生命周期详解

Vue.js 是一款流行的 JavaScript 框架,它采用了组件化的开发方式,使得前端开发更加简单和高效。在 Vue.js 的开发过程中,了解和理解 Vue 的生命周期非常重要。本文将详细介绍 Vue 生命周期的四个阶段:创建、挂载、更新和销毁。 …

缓存平均的两种算法

引言 线边库存物料的合理性问题是物流仿真中研究的重要问题之一,如果线边库存量过多,则会对生产现场的布局产生负面影响,增加成本,降低效益。 写在前面 仿真分析后对线边Buffer的使用情况进行合理的评估就是一个非常重要的事情。比较关心的参数包括:缓存位最大值…

【NAS群晖drive异地访问】使用cpolar远程访问内网Synology Drive「内网穿透」

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…

C语言刷题训练【第11天】

大家好,我是纪宁。 今天是C语言笔试刷题训练的第11天,加油! 文章目录 1、声明以下变量,则表达式: ch/i (f*d – i) 的结果类型为( )2、关于代码的说法正确的是( )3、已知有如下各变…

Python Web框架:Django、Flask和FastAPI巅峰对决

今天,我们将深入探讨Python Web框架的三巨头:Django、Flask和FastAPI。无论你是Python小白还是老司机,本文都会为你解惑,带你领略这三者的魅力。废话不多说,让我们开始这场终极对比! Django:百…

神经网络基础-神经网络补充概念-03-逻辑回归损失函数

概念 逻辑回归使用的损失函数通常是"对数损失"(也称为"交叉熵损失")或"逻辑损失"。这些损失函数在训练过程中用于衡量模型预测与实际标签之间的差异,从而帮助模型逐步调整权重参数,以更好地拟合数…