完全让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).features
    for 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_layers
        self.style_layers = style_layers

    def 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 gram

def 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 = 0
        for target, generated in zip(content_outputs, model(content_image)[0]):
            content_loss_value += content_loss(target, generated)

        style_loss_value = 0
        for 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_value
        total_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轮):

在这里插入图片描述

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

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

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

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

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

相关文章

基于 SpringBoot 和 Vue.js 的权限管理系统部署教程

大家后,我是 jonssonyan 在上一篇文章我介绍了我的新项目——基于 SpringBoot 和 Vue.js 的权限管理系统,本文主要介绍该系统的部署 部署教程 这里使用 Docker 进行部署,Docker 基于容器技术,它可以占用更少的资源,…

详解C++类和对象(中(类的6个默认成员函数))

文章目录 写在前面1. 类的6个默认成员函数2. 构造函数2.1 构造函数的引入2.1 构造函数的特性 3. 析构函数3.1 析构函数的引入3.2 析构函数的特性 4. 拷贝构造函数4.1 拷贝构造函数概念4.2 拷贝构造函数的特性4.3 拷贝构造函数典型调用场景 5. 赋值运算符重载5.1 运算符重载5.2 …

力扣面试150 数字范围按位与 公共前缀 位运算

Problem: 201. 数字范围按位与 文章目录 思路复杂度Code 思路 👨‍🏫 参考 复杂度 时间复杂度: O ( 1 ) O(1) O(1) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public int rangeBitwiseAnd(int left, int right){int shift 0;while…

五、机器学习模型及其实现1

1_机器学习 1)基础要求:所有的数据全部变为了特征,而不是eeg信号了 python基础已经实现了特征提取、特征选择(可选)进行了数据预处理.预处理指对数据进行清洗、转换等处理,使数据更适合机器学习的工具。S…

图数据库 之 Neo4j - Browser 介绍(3)

Neo4j Browser 介绍 Neo4j Browser 中有 3 个模块,侧边栏,Cypher 编辑器与结果栏,在进入 Neo4j Browser 时结果栏会展示欢迎界面。 Cypher 编辑器 Cypher 是一种图形查询语言,用于查询和操作图形数据库。它是 Neo4j 图形数据库的…

极限的反问题【高数笔记】

1. 什么是极限反问题? 2. 极限反问题分为几类? 3. 每一类极限反问题的具体做法是什么? 4. 每一类极限反问题具体做法是否有前提条件? 5. 例题?

板块一 Servlet编程:第一节 HTTP协议理论与服务器请求响应原理 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程:第一节 HTTP协议理论与服务器请求响应原理 一、HTTP特点二、HTTP中的 URL三、两种 HTTP 请求方法:GET 和 POST四、请求响应的底层请求头在服务器中表现响应头在服务器中表现 在上一个板块中我们完成了所有IDEA的基础配置工作&#xf…

深度测评:ONLYOFFICE 桌面编辑器 v8.0新功能

目录 前言 一、PDF表单处理:提升办公效率 二、RTL(从右到左)支持:满足不同语言习惯 三、Moodle集成:教育行业的新助力 四、本地界面主题:个性化办公体验 五、性能优化与稳定性提升 六、性能与稳定性…

C++泛编程(3)

类模板基础 1.类模板的基本概念2.类模板的分文件编写3.类模板的嵌套 在往节内容中,我们详细介绍了函数模板,这节开始我们就来聊一聊类模板。C中,类的细节远比函数多,所以这个专题也会更复杂。 1.类模板的基本概念 和函数模板一样…

Javascript入门学(基础)

软件篇 JS基础语法第一天 1.javascript介绍 1.1 js是什么 是什么 是一种运行在客户端(浏览器)的编程语言,实现人机交互效果,而html和css是标记性语言,并非编程语言有什么用 js的组成 htmlcssjs实现按钮点击功能 …

为什么程序员都不喜欢关电脑?

​​​​​​​我们百战卓越班的监管老师总是和我抱怨:这些学生们上完晚自习以后总是不记得关电脑,或者有的直接显示器都不管,直接把作业一交,拿上手机就走人了,这都是什么不好的习惯?难道他们都不喜欢关电…

树莓派智能自行车灯:亲,小心后方大卡车~

Raspberry Pi 计算模块 4 成本低、功耗低、结构紧凑、性能卓越,是 Velo AI 首次推出的道路安全产品的核心,该产品可提醒骑车人注意身后的车辆移动。 位于匹兹堡的 Velo AI 公司由机器人专家 Clarke Haynes 和人工智能专家 Micol Marchetti-Bowick 共同创…

政安晨:示例演绎TensorFlow的官方指南(一){基础知识}

为什么要示例演绎? 既然有了官方指南,咱们在官方指南上看看就可以了,为什么还要写示例演绎的文章呢? 其实对于初步了解TensorFlow的小伙伴们而言,示例演绎才是最重要的。 官方文档已经假定了您已经具备了相当合适的…

在容器中使用buildah构建镜像

简介 buildah是一个构建OCI标准镜像的工具,可以用来替代docker build 在常见的linux发行版中可直接通过包管理工具安装使用 # centos yum install buildah# ubuntu/debian apt install buildah# alpine apk add buildah其他发行版安装方法详见 github&#xff0c…

jsp教务管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 教务管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

【C生万物】C语言分支和循环语句

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…

C++重新入门-C++变量作用域

目录 1.C变量定义 2.C作用域 3.局部变量 4.全局变量 5.块作用域变量 6.初始化局部变量和全局变量 1.C变量定义 一般来说有三个地方可以定义变量: 在函数或一个代码块内部声明的变量,称为局部变量。 在函数参数的定义中声明的变量,称为…

逆向工程:揭开科技神秘面纱的艺术

在当今这个科技飞速发展的时代,我们每天都在与各种电子产品、软件应用打交道。然而,你是否想过,这些看似复杂的高科技产品是如何被创造出来的?今天,我们就来探讨一下逆向工程这一神秘而又令人着迷的领域。 一、什么是…

WireShark使用教程(TCP/IP 部分情况居然变成三次挥手了???)

WireShark自学 WrieShark介绍WrieShark的应用常见协议包的抓取 WrieShark常用手段混杂模式 和 普通模式混杂模式打开方式普通模式 过滤器过滤器类型捕获过滤器显示过滤器语法捕获到的数据的列的含义常见的 Protocols - Values 键盘快捷键常用的过滤命令常用协议分析ARP 协议分析…

阿里云游戏服务器租用价格表,2024最新报价

阿里云游戏服务器租用价格表:4核16G服务器26元1个月、146元半年,游戏专业服务器8核32G配置90元一个月、271元3个月,阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价: 阿里云游戏服务器租用价格表 阿…