图像生成GAN和风格迁移

news2025/3/12 18:53:48

文章目录

  • 摘要
  • abstract
  • 1.生成对抗网络 GAN
    • 1.1 算法步骤
  • 2.风格迁移
    • 2.1 损失函数
    • 2.2 论文阅读
      • 2.2.1 简介
      • 2.2.2 方法
      • 2.2.3 实验
      • 2.2.4 结论
  • 3.总结

摘要

本周学习了生成对抗网络(GAN)与风格迁移技术在图像生成中的应用。首先介绍了GAN模型中生成器与判别器通过对抗训练,使随机噪声逐步转换为逼真图像,展示了其在动漫人物生成中的潜力。其次阐述了风格迁移方法,通过预训练卷积网络提取图像内容和风格特征,并构建内容、风格及总变差损失,实现艺术风格转换。

abstract

This week we learned the application of generative adversarial network (GAN) and style transfer techniques in image generation. Firstly, the generator and discriminator in GAN model are trained to convert random noise into realistic image step by step, which shows its potential in the generation of cartoon characters. Secondly, the style transfer method is described, which extracts the image content and style features by pre-training convolutional network, constructs the content, style and total variation loss, and realizes the artistic style transformation.

1.生成对抗网络 GAN

在这里插入图片描述
上述的图简而言之就是,一个简单的分布经过Generator 后变成一个复杂的分布(给定一个低维的向量,对应生成一个动漫人物)
在这里插入图片描述
Discriminator的作用是将一张图片输出一个Scalar,其数值越大表示这张图片越像真实的二次元人物的额图像。
Generator 和Discriminator都是神经网络,其架构可以自己设计。

思考:为什么需要Discriminator?
联想演化理论
在这里插入图片描述
上述枯叶蝶为更好的生存不断地进化(相当于generator),而天敌波波鸟为了捕获食物也需要进化(相当于discriminator)
在这里插入图片描述
generator生成一张图,discriminator通过对比真实图片来判断生成的图片是否真实,generator为“欺骗”discriminator不断地调整参数使得更加其生成地图片接近真实图片类型,上述过程也就是两者对抗过程。
在这里插入图片描述

1.1 算法步骤

在这里插入图片描述
第一步:先固定generator,训练discriminator ,其学习sample中人物特征,对于初始随机化参数地generator进行判别其是否符合真实地漫画人物形象。
在这里插入图片描述
将第一步训练好的discriminator和generator看成一个大网络,输入一个向量,输出一个分数,discirminator里面的参数是固定的,不断调整generator的参数使其输出的scaler值越大越好。

在这里插入图片描述
重复上述1,2两个步骤,直到generator产生的图片和真实图片很接近停止迭代。
对于discirminator的目标函数为: G ∗ = a r g min ⁡ G D i v ( P G , P d a t a ) G^*=arg\min_GDiv(P_G,P_{data}) G=argGminDiv(PG,Pdata)
在这里插入图片描述
上述training的目标函数和js divergence 是有关系的,具体的推导过程参考GAN
经过文章中所提及的推导过程最后的公式可以变换成如下:
G ∗ = a r g min ⁡ G D i v ( P G , P d a t a ) G^*=arg\min_GDiv(P_G,P_{data}) G=argminGDiv(PG,Pdata) D ∗ = a r g max ⁡ D V ( D , G ) D^*=arg\max_DV(D,G) D=argmaxDV(D,G)
其中max objective value 和div是相关的,公式改写成如下:
G ∗ = a r g min ⁡ G ( m a x D V ( D , G ) ) G^*=arg\min_G(max_DV(D,G)) G=argGmin(maxDV(D,G))

下面是一个简单的GAN生成一张图片的代码示例:

# 定义生成器模型
class Generator(nn.Module):
    def __init__(self, latent_dim=100, img_shape=(1, 28, 28)):
        super(Generator, self).__init__()
        self.img_shape = img_shape
        self.model = nn.Sequential(
            nn.Linear(latent_dim, 128),
            nn.ReLU(inplace=True),
            nn.Linear(128, 256),
            nn.BatchNorm1d(256, momentum=0.8),
            nn.ReLU(inplace=True),
            nn.Linear(256, 512),
            nn.BatchNorm1d(512, momentum=0.8),
            nn.ReLU(inplace=True),
            nn.Linear(512, int(torch.prod(torch.tensor(img_shape)))),
            nn.Tanh()  # 输出范围在 [-1, 1]
        )

    def forward(self, z):
        img = self.model(z)
        img = img.view(img.size(0), *self.img_shape)
        return img

# 利用生成器生成一张图片
latent_dim = 100
generator = Generator(latent_dim=latent_dim)
generator.eval()  # 设置为评估模式

# 随机生成一个噪声向量
z = torch.randn(1, latent_dim)
# 利用生成器生成图片
gen_img = generator(z).detach().numpy().squeeze()

# 由于 Tanh 激活函数输出在 [-1, 1],需将其转换到 [0, 1] 以便显示
gen_img = (gen_img + 1) / 2.0

# 显示生成的图片
plt.imshow(gen_img, cmap='gray')
plt.title("Generated Image")
plt.axis("off")
plt.show()

2.风格迁移

风格迁移时一种计算机视觉技术,其核心思想将一幅图片的内容(物体的结构、布局、形状等信息)与另一幅图像的风格(如颜色、纹理、笔触等艺术特征)分离,并将两者重新组合,生成一幅既保留内容图像主体又具有风格图像艺术效果的新图像。
在这里插入图片描述

2.1 损失函数

import torch

# 内容一阶方差
def content_loss(Y_hat,Y):
    return torch.square(Y_hat-Y.detach()).mean()
# 二阶协方差
def gram(X):
    num_channels,n = X.shape[1],X.numel() // X.shape[1]
    X = X.reshape(num_channels,n)
    return torch.matmul(X,X.T) / (num_channels * n)

# 风格一阶方差
def style_loss(Y_hat,gram_Y):
    return torch.square((gram(Y_hat)-gram_Y.detach())).mean()

## 图像上下左右减少噪声的损失函数 总变差损失函数
def tv_loss(Y_hat):
    diff_v = torch.abs(Y_hat[:, :, 1:, :] - Y_hat[:, :, :-1, :]) #计算竖直方向上的差分
    diff_h = torch.abs(Y_hat[:, :, :, 1:] - Y_hat[:, :, :, :-1]) #计算水平方向的差分
    loss = (diff_v.sum()+diff_h.sum())/(Y_hat.size(0) * Y_hat.size(1))  # 假设按批次和通道求平均
    return loss

# 风格迁移的损失函数  内容损失+风格损失
content_weight,style_weight,tv_weight = 1,1e3,10
def computer_loss(X,content_Y_hat,styles_Y_hat,contents_Y,styles_Y_gram):
    contents_l = [content_loss(Y_hat,Y) * content_weight
                  for Y_hat,Y in zip(content_Y_hat,contents_Y)]
    styles_l = [style_loss(Y_hat,Y)*style_weight
                for Y_hat,Y in zip(styles_Y_hat,styles_Y_gram)]
    tv_l = tv_loss(X) * tv_weight
    return contents_l,styles_l,tv_l

2.2 论文阅读

2.2.1 简介

本周阅读论文《Perceptual Losses for Real-Time Style Transfer and Super-Resolution》文章地址原始的风格迁移的速度非常慢,在GPU上,生成一张图片需要10分钟,并且这个时间会随着图片尺度的增大而迅速增大。这其中的原因在于把生成图片的过程当中一个训练的过程。正是基于上面的原因,提出一种方法:不把图片当做一个训练过程,而当成一个执行的过程。

2.2.2 方法

本周所阅读的这篇文章把快速风格迁移网络结构包含两个部分。一个是生成网络(Transform Network),一个是损失网络(Loss network)。生成网络接收一个图片当作输入,然后输出也是一种图片(风格迁移后的结果)。如下图,左侧是生成网络,右侧是损失网络:
在这里插入图片描述
训练阶段: 首先选定一张风格图片。训练的目标是让生成网络可以有效生成图片。目标是由损失网络定义。
执行阶段: 给定一张图片,将其输入生成网络,输出这张图片风格迁移后的结果。
上述过程模型在执行阶段可以完成风格图片的生成。因此生成一张图片的速度非常快,在GPU上一般小于1秒。

2.2.3 实验

进行风格迁移的结果相比于Gatys等人的实验结果相似,但是生成的速度要快的多。
在这里插入图片描述
在这里插入图片描述

2.2.4 结论

通过训练具有感知损失函数的前馈变换网络,结合了前馈图像变换任务和基于优化的图像生成方法的优点。将这种方法应用于风格转移,与Gatys等人提出的方法相比,获得了相当的性能和大幅提高的速度。

3.总结

本周系统学习了生成对抗网络与风格迁移技术在图像生成中的表现。GAN通过生成器和判别器的对抗训练,使随机噪声转化为真实感图像,展现出在动漫人物生成方面的优势,其缺点就是不好训练;风格迁移则利用卷积网络提取内容与风格特征,通过损失函数实现艺术风格转换。

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

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

相关文章

golangAPI调用deepseek

目录 1.deepseek官方API调用文档1.访问格式2.curl组装 2.go代码1. config 配置2.模型相关3.错误处理4.deepseekAPI接口实现5. 调用使用 3.响应实例 1.deepseek官方API调用文档 1.访问格式 现在我们来解析这个curl 2.curl组装 // 这是请求头要加的参数-H "Content-Type:…

【第15章:量子深度学习与未来趋势—15.3 量子深度学习在图像处理、自然语言处理等领域的应用潜力分析】

一、开篇:为什么我们需要关注这场"量子+AI"的世纪联姻? 各位技术爱好者们,今天我们要聊的这个话题,可能是未来十年最值得押注的技术革命——量子深度学习。这不是简单的"1+1=2"的物理叠加,而是一场可能彻底改写AI发展轨迹的范式转移。 想象这样一个…

JAVA安全—Shiro反序列化DNS利用链CC利用链AES动态调试

前言 讲了FastJson反序列化的原理和利用链,今天讲一下Shiro的反序列化利用,这个也是目前比较热门的。 原生态反序列化 我们先来复习一下原生态的反序列化,之前也是讲过的,打开我们写过的serialization_demo。代码也很简单&…

LangChain大模型应用开发:提示词工程应用与实践

介绍 大家好,博主又来给大家分享知识了。今天给大家分享的内容是LangChain提示词工程应用与实践。 在如今火热的大语言模型应用领域里,LangChain可是一个相当强大且实用的工具。而其中的提示词(Prompt),更是我们与语言模型进行有效沟通的关…

2025 N1CTF crypto 复现

近一个月都没有学习了,一些比赛也没有打,很惭愧自己还是处在刚放假时的水平啊,马上开学了,抓紧做一些训练来康复。 CheckIn import os from Crypto.Util.number import * from secret import FLAGp, q getPrime(512), getPrime…

Windows Defender Control--禁用Windows安全中心

Windows Defender Control--禁用Windows安全中心 链接:https://pan.xunlei.com/s/VOJDuy2ZEqswU4sEgf12JthZA1?pwdtre6#

mount 出现 2038 问题

在 linux 上挂载 ext4 文件系统时出现了 2038 年问题,如下: [ 236.388500] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null) [ 236.388560] ext4 filesystem being mounted at /root/tmp supports timestamps until 2…

【第12章:深度学习与伦理、隐私—12.4 深度学习与伦理、隐私领域的未来挑战与应对策略】

凌晨三点的自动驾驶测试场,AI系统突然在暴雨中做出惊人决策——它选择撞向隔离带而不是紧急变道,因为算法推演发现隔离带后的应急车道站着五个工程师。这个惊悚的伦理困境,揭开了深度学习伦理危机最尖锐的冰山一角。 一、潘多拉魔盒已开:深度学习伦理的四大原罪 1.1 数据原…

RL--2

强化学习当中最难的两个点是: 1.reward delay; 2.agent的行为会影响到之后看到的东西,所以agent要学会探索世界; 关于强化学习的不同类型,可以分为以下三种: 一种是policy based:可以理解为它是…

SpringMVC新版本踩坑[已解决]

问题: 在使用最新版本springMVC做项目部署时,浏览器反复500,如下图: 异常描述: 类型异常报告 消息Request processing failed: java.lang.IllegalArgumentException: Name for argument of type [int] not specifie…

2025 pwn_A_childs_dream

文章目录 fc/sfc mesen下载和使用推荐 fc/sfc https://www.mesen.ca/docs/ mesen2安装,vscode安装zg 任天堂yyds w d 左右移动 u结束游戏 i崩溃或者卡死了 L暂停 D658地方有个flag 发现DEEE会使用他。且只有这个地方,maybe会输出flag,应…

pandas(11 分类数据和数据可视化)

前面内容:pandas(10 日期和Timedelta) 目录 一、Python Pandas 分类数据 1.1 pd.Categorical() 1.2 describe() 1.3 获取类别的属性 1.4 分类操作 1.5 分类数据的比较 二、Python Pandas 数据可视化 2.1 基础绘图:plot 2.2 条形图 2.3 直方…

Redis 03章——10大数据类型概述

一、which10 (1)一图 (2)提前声明 这里说的数据类型是value的数据类型,key的类型都是字符串 官网:Understand Redis data types | Docs (3)分别是 1.3.1redis字符串&#xff0…

bps是什么意思

本文来自DeepSeek "bps" 是 "bits per second" 的缩写,表示每秒传输的比特数,用于衡量数据传输速率。1 bps 即每秒传输 1 比特。 常见单位 bps:比特每秒 Kbps:千比特每秒(1 Kbps 1,000 bps&am…

撕碎QT面具(1):Tab Widget转到某个Tab页

笔者未系统学过C语法,仅有Java基础,具体写法仿照于大模型以及其它博客。自我感觉,如果会一门对象语言,没必要先刻意学C,因为自己具有对象语言的基础,等需要用什么再学也不迟。毕竟不是专门学C去搞算法。 1…

项目版本号生成

需求 项目想要生成一个更新版本号,格式为v2.0.20250101。 其中v2.0为版本号,更新时进行配置;20250101为更新日期,版本更新时自动生成。 实现思路 创建一个配置文件version.properties,在其中配置版本号&#xff1b…

善筹网设计与实现(代码+数据库+LW)

摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自…

使用 MindSpore 训练 DeepSeek-V3 模型

MindeSpore 已经适配 DeepSeek-V3 的训练推理啦,下面是使用 MindSpore 对DeepSeek-V3做训练的过程。 一、环境确认 这里呢我使用的是 8张 910B2 的显卡: 其中 MindSpore Transformers 的环境依赖如下: PythonMindSporeCANN固件与驱动3.1…

DeepSeek R1完全本地部署实战教程01-课程大纲

一、课程体系 二、学习目标: 了解基础知识掌握安装部署学会搭建可视化界面能力水平进阶三、课程特点: 案例驱动工程实战完整体系四、课程大纲 1.DeepSeek R1 项目运行演示 【视频课程】 (1)可视化交互 (2)联网搜索 (3)本地知识库 2.环境安装部署 【视频课程】 (1)软…

redis cluster测试

集群节点信息这时候停掉一个master 172.30.60.31 从集群信息集中我们可以看到172.30.60.31的slave是172.30.60.41,查看41的日志,发现他成为了新的master 这时候我们在将172.30.60.41也杀死,会发现集群异常了 尝试把172.30.60.31启动&#xff…