【6.1】图片风格迁移 Neural Style Transfer

article/2025/9/18 7:47:58

完整代码: 

from __future__ import division
from torchvision import models
from torchvision import transforms
from PIL import Image
import torch
import torch.nn as nn
import numpy as npimport matplotlib.pyplot as pltdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")# -------------------------------------------------加载图片---------------------------------------------------------------
# 加载图片 + 图像预处理为相同的shape,这样vgg提取出来feature vector才是一样的大小,否则不能直接计算L2 loss
def load_image(image_path, transform=None, max_size=None, shape=None):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.ANTIALIAS)if shape:image = image.resize(shape, Image.LANCZOS)if transform:image = transform(image).unsqueeze(0)return image.to(device)transform = transforms.Compose([transforms.ToTensor(),# 因为我要用VGG,在ImageNet上做的处理,transforms.Normalize(mean=[0.485, 0.456, 0.406],std= [0.229, 0.224, 0.225])
])  # 来自ImageNet的mean和variance# 此处是经过标准化后的照片
content = load_image("png/content.png", transform, max_size=400)
style = load_image("png/style.png", transform, shape=[content.size(2), content.size(3)]) # 这里是想得到和content大小一样的样式print(content.shape,style.shape) # torch.Size([1, 3, 400, 311]) torch.Size([1, 3, 311, 400])# -------------------------------------------------图片展示给大家看---------------------------------------------------------
unloader = transforms.ToPILImage()  # reconvert into PIL image
plt.ion()
def imshow(tensor, title=None):image = tensor.cpu().clone()  # we clone the tensor to not do changes on itimage = image.squeeze(0)      # remove the fake batch dimensionimage = unloader(image)plt.imshow(image)if title is not None:plt.title(title)plt.pause(0.001) # pause a bit so that plots are updatedplt.figure()
imshow(style[0], title='Image')# 并不是训练这个VGGNet,他只是一个特征提取器,真正要优化的是这一张target图片
class VGGNet(nn.Module):def __init__(self):super(VGGNet, self).__init__()# 有些层取出来当feature,基本上就可以拿到图片的内容和textureself.select = ['0', '5', '10', '19', '28']# 拿到VGG network,此时我们只需要features部分(即只需要拿到这些层就可以了,其余的信息不需要)self.vgg = models.vgg19(pretrained=True).features# 取出 self.select 中的层,组成一个新的featuresdef forward(self, x):features = []for name, layer in self.vgg._modules.items(): # _modules 可以把vgg一层层拿出来x = layer(x)if name in self.select:features.append(x)return features# target拿到的就是和content.png内容上相似,但是风格上更倾向于style.png的图片,内容是会变化的所以requires_grad_
target = content.clone().requires_grad_(True)
# 优化的是target这张图片,
optimizer = torch.optim.Adam([target], lr=0.003, betas=[0.5, 0.999])
vgg = VGGNet().to(device).eval()  # 所以设置为eval(),它是不会被优化的# 打印出每一层拿到的 feature vector
# torch.Size([1, 64, 400, 311])
# torch.Size([1, 128, 200, 155])
# torch.Size([1, 256, 100, 77])
# torch.Size([1, 512, 50, 38])
# torch.Size([1, 512, 25, 19])
feature = vgg(content)  # list,里面包含不同的features
for feat in feature:print(feat.shape)# 开始优化我们的target图片
target_features = vgg(target)total_step = 2000
style_weight = 100.
for step in range(total_step):target_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):content_loss += torch.mean((f1 - f2) ** 2)  # 使用L2 loss_, c, h, w = f1.size()f1 = f1.view(c, h * w)f3 = f3.view(c, h * w)# 计算gram matrixf1 = torch.mm(f1, f1.t())  # 此处做了点积运算,(c, h * w) × (h * w, c) = (c,c)f3 = torch.mm(f3, f3.t())style_loss += torch.mean((f1 - f3) ** 2) / (c * h * w) # 使用L2 loss,只是多个了除数而已# 由于损失是不同的,我们将内容和风格损失的和作为总的loss,此处我们给他们各自合适的权重,会让总的loss看起来更符合真实的lossloss = content_loss + style_weight * style_loss# 更新target image 的 Tensoroptimizer.zero_grad()loss.backward()optimizer.step()if step % 10 == 0:print("Step [{}/{}], Content Loss: {:.4f}, Style Loss: {:.4f}".format(step, total_step, content_loss.item(), style_loss.item()))# 将图片打印出来
denorm = transforms.Normalize((-2.12, -2.04, -1.80), (4.37, 4.46, 4.44))
img = target.clone().squeeze()
img = denorm(img).clamp_(0, 1)
plt.figure() # Create a new figure, or activate an existing figure.
imshow(img, title='Target Image')

   

                     content.png                                                   style.png

                      target .png


http://chatgpt.dhexx.cn/article/AKmdbT9j.shtml

相关文章

图像风格迁移基础入门及实践案例总结

目录 1图像的不同风格 2何为图像风格迁移 2.1基础概念及方法 2.2示例 3图像风格迁移的典型研究成果 3.1deep-photo-styletransfer 3.2CycleGAN 3.3U-…

图像处理:图像风格迁移(Style Transfer)

本文翻译自:《A brief introduction to Neural Style Transfer》 在图像风格迁移中,涉及两张图像,内容图像和风格(样式)图像。我们需要将风格图像的样式应用到内容图像上。 为此我们使用预训练好的模型 VGG-16n 卷积…

实战二:手把手教你图像风格迁移

实战二:手把手教你图像风格迁移 一、简介 图像风格迁移是指,将一幅内容图的内容,和一幅或多幅风格图融合在一起,从而生成一些有意思的图片。 有兴趣的可以看一下外文文献 Leon A. Gatys paper, A Neural Algorithm of Artisti…

VGG19-图像风格迁移

先导入包 import tensorflow as tf import IPython.display as display import matplotlib.pyplot as plt import numpy as np import PIL.Image import time import functools 迭代了50次(次数过少)的效果 迭代800次 定义一个加载图像的函数&#xff0…

图像风格迁移试玩

风格迁移 图像风格迁移原理内容损失函数风格损失函数 现成工具:tensorflow hub手工实现风格迁移我们对风格有失恭敬 神经风格转换是深度学习领域中一个很有趣的技术。它可以改变图像的风格。 如下图所示,根据一张内容图片和一张风格图片,生成…

迁移网络的应用-图像风格迁移

图片风格迁移指的是将一个图片的风格转换到另一个图片中,如图所示: 原图片经过一系列的特征变换,具有了新的纹理特征,这就叫做风格迁移。 VGG网络 在实现风格迁移之前,需要先简单了解一下VGG网络(由于VGG…

图像风格迁移算法学习总结

目录 一、简要说明 二、具体实施步骤 2.1综述 2.2基本思路 2.3核心思路 2.4基本问题处理 三、代码的简要描述 四、成果展示 一、简要说明 本次学习的图像风格迁移算法是基于一个2015年由Gatys等人发表的文章A Neural Algorithm of Artistic Style_的一个代码复…

【数字图像处理】图像风格迁移

代码和实验报告下载:http://download.csdn.net/detail/jsgaobiao/9523313 【作业要求】 设计自己的算法完成一个附图所示的图像风格迁移算法(基于matlab的快速实现)(很可能用到,并且鼓励使用)基于频率域…

图像风格迁移 CycleGAN原理

CycleGAN是一种很方便使用的用于进行图像风格转换的模型。它的一大优势就在于不需要成对的数据集就可以进行训练。比如我们只需要随便一大堆真人图像和随便另一大堆动漫图像,就可以训练出这两类风格互相转换的模型。 CycleGAN进行风格转换的原理是这样的&#xff1a…

Python实现基于深度学习的图像风格迁移

目录 一、选题意义与背景介绍 3 1.1背景介绍 3 1.2选题意义 3 二、相关方法介绍 4 2.1纹理建模 4 2.2图像重建 4 2.3图像风格迁移 4 2.3.1基于在线图像优化的慢速图像风格化迁移算法 4 2.3.2基于离线模型优化的快速图像风格化迁移算法 5 2.4图像风格迁移效果评估 6 三、具体方法…

图片风格迁移

##将图片进行风格迁移,将第一幅图片的均值平均差换成第二幅图的均值平方差。第三张是生成的图片 from numpy.lib.type_check import _imag_dispatcher from builtins import print from os import pread import sys from PIL import Image,ImageStat import numpy …

图像风格迁移及代码实现

图像风格迁移其实非常好理解,就是将一张图像的“风格”(风格图像)迁移至另外一张图像(内容图像),但是这所谓的另外一张图像只是在“风格”上与之前有所不同,图像的“内容”仍要与之前相同。Luan…

(一)图像风格迁移

图像风格迁移即把图像A的风格和图像B的内容按照一定比例结合,输出具备图像A风格和图像B内容的图像C. [github传送门1]https://github.com/anishathalye/neural-style [github传送门2]https://github.com/Quanfita/Neural-Style/tree/master/examples 系列文章 (二)快速图像风格…

图像风格迁移与快速风格迁移的对比(感知损失)

最近一段时间要写数字图像处理的文献综述,《深度学习在图像风格迁移中的原理与应用综述》。只能感慨自己一时选题不审,导致期末火葬场啊…… 这个问题我纠结了一天,看了N多篇文献(全是英文的…),结果还是没…

图像风格迁移【老版】

深度学习目前为止最有用的东西是图像处理,我们可以用它在极早期判断癌症, 也可以用它在茫茫人海里寻找犯人,但是要我说你能写一个小程序取悦女朋友, 你就不一定能信, 这一招叫艺术风格变换,就是你点击一下&…

图像风格迁移-DSTN

样式传输的目的是从参考图像中再现具有样式的内容图像。现有的通用风格转换方法成功地以艺术或照片逼真的方式将任意风格传递给原始图像。然而,现有作品所定义的“任意风格”的范围由于其结构限制而在特定领域内受到限制。具体而言,根据预定义的目标域来…

学习笔记:图像风格迁移

所谓图像风格迁移,是指利用算法学习著名画作的风格,然后再把这种风格应用到另外一张图片上的技术。著名的国像处理应用Prisma是利用风格迁移技术,将普通用户的照片自动变换为具有艺术家的风格的图片。这篇文章会介绍这项技术背后的原理&#…

图像风格迁移实战

最近看了一些基于深度学习的Style Transfer, 也就是风格迁移相关的paper,感觉挺有意思的。 所谓风格迁移,其实就是提供一幅画(Reference style image),将任意一张照片转化成这个风格,并尽量保留原照的内容(Content)。之前比较火的…

Pytorch实现图像风格迁移(一)

图像风格迁移是图像纹理迁移研究的进一步拓展,可以理解为针对一张风格图像和一张内容图像,通过将风格图像的风格添加到内容图像上,从而对内容图像进行进一步创作,获得具有不同风格的目标图像。基于深度学习网络的图像风格迁移主要有三种类型,分别为固定风格固定内容的风格…

毕设 深度学习图像风格迁移 - opencv python

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这…