图像生成GAN和风格迁移
文章目录
- 摘要
- 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_shapeself.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_weightfor Y_hat,Y in zip(content_Y_hat,contents_Y)]styles_l = [style_loss(Y_hat,Y)*style_weightfor Y_hat,Y in zip(styles_Y_hat,styles_Y_gram)]tv_l = tv_loss(X) * tv_weightreturn 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通过生成器和判别器的对抗训练,使随机噪声转化为真实感图像,展现出在动漫人物生成方面的优势,其缺点就是不好训练;风格迁移则利用卷积网络提取内容与风格特征,通过损失函数实现艺术风格转换。
相关文章:

图像生成GAN和风格迁移
文章目录 摘要abstract1.生成对抗网络 GAN1.1 算法步骤 2.风格迁移2.1 损失函数2.2 论文阅读2.2.1 简介2.2.2 方法2.2.3 实验2.2.4 结论 3.总结 摘要 本周学习了生成对抗网络(GAN)与风格迁移技术在图像生成中的应用。首先介绍了GAN模型中生成器与判别器…...
【06】泛型
文章目录 泛型函数中的泛型结构体中的泛型结构体中的方法 枚举中的泛型 泛型 RUST通过在编译时对泛型代码的单态化(monomorphization)来保证运行效率。即,在编译时对泛型填充具体数据类型转换为特定代码进行编译。 由于RUST编译试图穷举所有…...

1-13 tortoiseGit忽略文件与文件夹
前言: 基于本人对小乌龟操作的学习和思考,仅供参考 1-1 忽略问价和文件夹 有时候我们的一些文件是不想要提交,那么我们可以使用stash的方式给这个文件添加忽略,那么我们现在来给这个实际操作创建一个操作的环境。 右键选中添加到忽…...

ASR强力模型「Whisper」:解密Whisper:AI驱动的语音识别新时代 -
解密Whisper:AI驱动的语音识别新时代 原创 AI小信 别慌G个PT 2024年10月18日 17:54 北京 ❝ 前两天分享了两个TTS模型,今天分享个ASR强力模型「Whisper」。Whisper是OpenAI开发的一个「ASR」(AutomatedSpeechRecognition,自动语音识别)开源模型…...

【机器学习】向量化使得简单线性回归性能提升
向量化使得简单线性回归性能提升 一、摘要二、向量化运算概述三、向量化运算在简单线性回归中的应用四、性能测试与结果分析 一、摘要 本文主要讲述了向量化运算在简单线性回归算法中的应用。通过回顾传统for循环方式实现的简单线性回归算法,介绍了如何通过最小二乘…...

【kafka系列】消费者
目录 获取消息 1. 消费者获取消息的流程逻辑分析 阶段一:消费者初始化 阶段二:分区分配与重平衡(Rebalance) 阶段三:消息拉取与处理 阶段四:偏移量提交 核心设计思想 2. 流程 关键点总结 常见参数…...
HackerRank C++面试,中等难度题目 - Attribute Parser
去除字符串首尾的空白字符(包括空格、制表符、换行符和回车符) void trim(string &s) {size_t start s.find_first_not_of(" \t\n\r");size_t end s.find_last_not_of(" \t\n\r");if (start string::npos) {s ""…...

【ARM】解决ArmDS Fast Models 中部分内核无法上电的问题
1、 文档目标 解决ArmDS Fast Models 中部分内核无法上电的问题。 2、 问题场景 在调用ArmDS的Fast Models中的Cortex-A55的模型,只有Core 0是上电状态,而Core 1处于掉电状态,如图2-1所示: 图2-1 3、软硬件环境 1)…...

节目选择器安卓软件编写(针对老年人)
文章目录 需求来源软件界面演示效果源码获取 对爬虫、逆向感兴趣的同学可以查看文章,一对一小班教学:https://blog.csdn.net/weixin_35770067/article/details/142514698 需求来源 由于现在的视频软件过于复杂,某客户想开发一个针对老年人、…...

蓝桥杯之图
图: 对于图来说,重点在于之后的最短路径算法,这边简单做一下了解即可 代码: #include<iostream> #include<string> #include<vector> #include<list> #include<queue> using namespace std; clas…...

中兴光猫修改SN,MAC,修改地区,异地注册,改桥接,路由拨号
前言 请先阅读上一篇博客获取到光猫超级密码电信光猫获取超级密码 电信光猫天翼网关4.0获取超级密码教程 四川电信光猫 中兴 F1855V2 ZXHN F1855V2 telent权限 实战 实测_天翼4.0光猫超级密码-CSDN博客 修改SN-修改地区,光猫异地注册,设置桥接模式&#…...
【kafka系列】Kafka如何保证消息不丢失?
目录 1. 生产者端:确保消息成功发送到Broker 核心机制: 关键步骤: 2. Broker端:持久化与副本同步 核心机制: 关键源码逻辑: 3. 消费者端:可靠消费与Offset提交 核心机制: 关…...
AtCoder Beginner Contest 393 —— E - GCD of Subset 补题 + 题解 python
AtCoder Beginner Contest 393 E - GCD of Subset Problem Statement You are given a sequence A ( A 1 , A 2 , … , A N ) A (A_1, A_2, \dots, A_N) A(A1,A2,…,AN) of length N N N and a positive integer K K K (at most N N N). For each i 1 , 2 , … …...
vue3响应式丢失解决办法(三)
vue3的响应式的理解,与普通对象的区别(一) vue3 分析总结响应式丢失问题原因(二) 经过前面2篇文章,知道了响应式为什么丢失了,但是还是碰到了丢失情况,并且通过之前的内容还不能解…...

BY组态:构建灵活、可扩展的自动化系统
引言 在现代工业自动化领域,BY组态(Build Your Own Configuration)作为一种灵活、可扩展的解决方案,正逐渐成为工程师和系统集成商的首选。BY组态允许用户根据具体需求自定义系统配置,从而优化生产效率、降低成本并提…...

2025 (ISC)²CCSP 回忆录
2025.1.20 广州,周一,我一次性通过了CCSP的考试。 为什么要考证? 个人成长所需 职业热情:做一行爱一行,既然我投入了美好的青春年华到网络安全行业当中,那么对于这个行业最有权威的认证,是肯定…...

强化学习笔记7——DDPG到TD3
前提:基于TD 的方法多少都会有高估问题,即Q值偏大。原因两个:一、TD目标是真实动作的高估。 二:自举法高估。 DDPG 属于AC方法:异策略,适合连续动作空间,因为他的策略网络直接输出的动作&#…...

win10 系统 自定义Ollama安装路径 及模型下载位置
win10 系统 自定义Ollama安装路径 及模型下载位置 由于Ollama的exe安装软件双击安装的时候默认是在C盘,以及后续的模型数据下载也在C盘,导致会占用C盘空间,所以这里单独写了一个自定义安装Ollama安装目录的教程。 Ollama官网地址࿱…...
-bash:/usr/bin/rm: Argument list too long 解决办法
问题概述 小文件日志太多导致无法使用rm命令,因为命令行参数列表的长度超过了系统允许的最大值。 需要删除/tmp目录下的所有文件,文件数量比较多。 ls -lt /tmp | wc -l 5682452 解决方法如下: 使用find -exec 遍历,然后执行删…...

内容中台重构企业内容管理流程驱动智能协作升级
内容概要 内容中台作为企业数字化转型的核心基础设施,通过技术架构革新与功能模块整合,重构了传统内容管理流程的底层逻辑。其核心价值在于构建动态化、智能化的内容生产与流转体系,将分散的创作、存储、审核及分发环节纳入统一平台管理。基…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...