图像生成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 遍历,然后执行删…...
内容中台重构企业内容管理流程驱动智能协作升级
内容概要 内容中台作为企业数字化转型的核心基础设施,通过技术架构革新与功能模块整合,重构了传统内容管理流程的底层逻辑。其核心价值在于构建动态化、智能化的内容生产与流转体系,将分散的创作、存储、审核及分发环节纳入统一平台管理。基…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
