完全让ChatGPT写一个风格迁移的例子,不改动任何代码

2024-02-08 00:36

本文主要是介绍完全让ChatGPT写一个风格迁移的例子,不改动任何代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

⭐️ 前言

小编让ChatGPT写一个风格迁移的例子,注意注意,代码无任何改动,直接运行,输出结果。
在这里插入图片描述
额。。。。这不是风格转换后的结果图。

⭐️ 风格迁移基本原理

风格迁移是一种计算机视觉领域的图像处理技术,它的目标是将一张图像的内容与另一张图像的艺术风格相结合,创造出一张新的图像。这一技术通过深度学习的方法,结合卷积神经网络(CNN)和损失函数,实现了在内容和风格之间进行有效迁移。

在这里插入图片描述

下面详细探讨风格迁移的原理:

1. 内容表示:

内容图像: 风格迁移的源,提供图像的内容信息。
内容表示: 使用预训练的卷积神经网络,通常选择网络中的某一层,提取内容图像的特征表示。

2. 风格表示:

风格图像: 风格迁移的目标,提供所需的艺术风格。
风格表示: 同样使用卷积神经网络,选择多个层次的特征表示,以捕捉图像的不同尺度和层次的艺术风格。

在这里插入图片描述

5. 优化过程:

通过调整生成图像的像素值,以最小化总体损失函数,来生成最终的风格迁移图像。这通常通过梯度下降等优化算法来实现。

在这里插入图片描述

代码如下:

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import models, transforms
from PIL import Image
import numpy as np# 加载预训练的VGG模型
def load_vgg_model():vgg = models.vgg19(pretrained=True).featuresfor param in vgg.parameters():param.requires_grad_(False)return vgg# 图像预处理
def load_image(image_path, transform=None, max_size=None, shape=None):image = Image.open(image_path).convert('RGB')if max_size:scale = max_size / max(image.size)size = tuple(int(x * scale) for x in image.size)image = image.resize(size)if shape:image = image.resize(shape)if transform:image = transform(image).unsqueeze(0)return image# 图像后处理
def convert_image(tensor):image = tensor.to("cpu").clone().detach()image = image.numpy().squeeze()image = image.transpose(1,2,0)image = image * np.array((0.229, 0.224, 0.225)) + np.array((0.485, 0.456, 0.406))image = image.clip(0, 1)return image# 定义风格迁移网络
class StyleTransferNet(nn.Module):def __init__(self, content_layers, style_layers):super(StyleTransferNet, self).__init__()self.vgg = load_vgg_model()self.content_layers = content_layersself.style_layers = style_layersdef forward(self, x):content_outputs = []style_outputs = []for i, layer in enumerate(self.vgg):x = layer(x)if i in self.content_layers:content_outputs.append(x)if i in self.style_layers:style_outputs.append(x)return content_outputs, style_outputs# 损失函数
def content_loss(target, generated):return torch.mean((target - generated)**2)def gram_matrix(tensor):_, d, h, w = tensor.size()tensor = tensor.view(d, h * w)gram = torch.mm(tensor, tensor.t())return gramdef style_loss(target, generated):target_gram = gram_matrix(target)generated_gram = gram_matrix(generated)return torch.mean((target_gram - generated_gram)**2)def total_variation_loss(image):return torch.sum(torch.abs(image[:, :, :, :-1] - image[:, :, :, 1:])) + \torch.sum(torch.abs(image[:, :, :-1, :] - image[:, :, 1:, :]))# 风格迁移主函数
def style_transfer(content_path, style_path, output_path, num_steps=10000, content_weight=1, style_weight=1e6, tv_weight=1e-6):device = torch.device("cuda" if torch.cuda.is_available() else "cpu")content_image = load_image(content_path, transform, max_size=400)style_image = load_image(style_path, transform, shape=[content_image.size(2), content_image.size(3)])content_image = content_image.to(device)style_image = style_image.to(device)model = StyleTransferNet(content_layers, style_layers).to(device).eval()# 优化器optimizer = optim.Adam([content_image.requires_grad_(), style_image.requires_grad_()], lr=0.01)for step in range(num_steps):optimizer.zero_grad()content_outputs, style_outputs = model(content_image)content_loss_value = 0for target, generated in zip(content_outputs, model(content_image)[0]):content_loss_value += content_loss(target, generated)style_loss_value = 0for target, generated in zip(style_outputs, model(style_image)[1]):style_loss_value += style_loss(target, generated)tv_loss_value = total_variation_loss(content_image)total_loss = content_weight * content_loss_value + style_weight * style_loss_value + tv_weight * tv_loss_valuetotal_loss.backward()optimizer.step()if step % 50 == 0 or step == num_steps - 1:print(f"Step {step}/{num_steps}, Total Loss: {total_loss.item()}")# 保存生成的图像output_image = convert_image(content_image)Image.fromarray((output_image * 255).astype(np.uint8)).save(output_path)# 主程序
content_image_path = "./content.jpg"
style_image_path = "./style.jpg"
output_image_path = "./image.jpg"transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),
])content_layers = [21]
style_layers = [0, 5, 10, 19, 28]style_transfer(content_image_path, style_image_path, output_image_path)

输入的图片是这两张
在这里插入图片描述
在这里插入图片描述

输出的图片是这样(运行了10000轮):

在这里插入图片描述

风格是有了,调整一些参数,结果会有不同。

风格迁移技术的核心思想是通过深度学习网络将图像的内容和风格进行数学建模,然后通过优化损失函数来生成具有目标风格的图像。这使得艺术风格的迁移成为可能,为图像处理领域带来了新的可能性。

笔者水平有限,若有不对的地方欢迎评论指正!

这篇关于完全让ChatGPT写一个风格迁移的例子,不改动任何代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/689425

相关文章

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤