图像生成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_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通过生成器和判别器的对抗训练,使随机噪声转化为真实感图像,展现出在动漫人物生成方面的优势,其缺点就是不好训练;风格迁移则利用卷积网络提取内容与风格特征,通过损失函数实现艺术风格转换。

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

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

相关文章

three.js+WebGL踩坑经验合集(8.1):用于解决z-fighting叠面问题的polygonOffset远没我们想象中那么简单

初八开工后,笔者又停了下来,今天总算又抽出来了一丢丢的时间继续。今天打算给大家聊聊困扰很多3D开发者的z-fighting叠面闪烁问题。 该问题从严格意义上说,是属于业务问题,因为现实中是不会有完全重叠的两个平面物体存在&#xf…

2025年-G4-Lc78--121. 买卖股票的最佳时机--(java版)

1.题目描述 2.思路 思路1: 做两轮排序,第一轮排序找到最小的那个数,然后再判断最小的那个数之后还有其他数吗,如果有在进行排序,选出最大的那个数,然后值相减。 问题要点: (1)你需要…

AI 编程工具—Cursor 进阶篇 数据分析

AI 编程工具—Cursor 进阶篇 数据分析 上一节课我们使用Cursor 生成了北京房产的销售数据,这一节我们使用Cursor对这些数据进行分析,也是我们尝试使用Cursor 去帮我们做数据分析,从而进一步发挥Cursor的能力,来帮助我们完成更多的事情 案例一 房产销售数据分析 @北京202…

【Python】错误异常

个人主页:Guiat 归属专栏:Python 文章目录 1. 错误和异常的概念1.1 错误1.2 异常 2. 常见的内置异常类型2.1 ZeroDivisionError2.2 IndexError2.3 KeyError2.4 TypeError 3. 异常处理机制3.1 try-except 语句3.2 try-except-else 语句3.3 try-except-fin…

ICASSP2023 | IE-FGSM | 通过增强欧拉方法提高对抗样本的可迁移性

Boosting Transferability of Adversarial Example via an Enhanced Euler’s Method 摘要-Abstract引言-Introduction相关工作-Related Work方法-Methodology实验-Experiments结论-Conclusion 论文链接 本文 “Boosting Transferability of Adversarial Example via an Enhan…

力扣 470. 用 Rand7() 实现 Rand10() 拒绝采样 等概率随机数生成

Problem: 470. 用 Rand7() 实现 Rand10() 文章目录 🍻 k 进制诸位生成 拒绝采样🍺 朴素版🍺 优化版 🍻 等概率生成任何数大法 🍻 k 进制诸位生成 拒绝采样 👩‍🏫 参考题解 ⏰ 时间复杂度&a…

Jvascript网页设计案例:通过js实现一款密码强度检测,适用于等保测评整改

本文目录 前言功能预览样式特点总结:1. 整体视觉风格2. 密码输入框设计3. 强度指示条4. 结果文本与原因说明 功能特点总结:1. 密码强度检测2. 实时反馈机制3. 详细原因说明4. 视觉提示5. 交互体验优化 密码强度检测逻辑总Html代码Javascript代码 前言 能…

无人机航迹规划: 梦境优化算法(Dream Optimization Algorithm,DOA)求解无人机路径规划MATLAB

一、梦境优化算法 梦境优化算法(Dream Optimization Algorithm,DOA)是一种新型的元启发式算法,其灵感来源于人类的梦境行为。该算法结合了基础记忆策略、遗忘和补充策略以及梦境共享策略,通过模拟人类梦境中的部分记忆…

【c++】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗?

【c】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗? 1.线程终止会导致进程终止吗? 在操作系统中,线程是进程的基本执行单元,一个进程可以包含一个或多个线程。 当一个子线程终止时,进程并不会因此自动终…

【动手学运动规划】5.5 基于PiecewiseJerk的路径优化方法

知我者,谓我心忧. 不知我者,谓我何求。— 佚名 黍离 🏰代码及环境配置:请参考 环境配置和代码运行! PiecewiseJerkOptimizer是Apollo中planning模块生成Path/Speed曲线的优化方法. 基于Frenet坐标系, 生成平滑, 安全的目标曲线. …

图论入门算法:拓扑排序(C++)

上文中我们了解了图的遍历(DFS/BFS), 本节我们来学习拓扑排序. 在图论中, 拓扑排序(Topological Sorting)是对一个有向无环图(Directed Acyclic Graph, DAG)的所有顶点进行排序的一种算法, 使得如果存在一条从顶点 u 到顶点 v 的有向边 (u, v) , 那么在排序后的序列中, u 一定…

英国学术论文规范,学术来源的基本知识

学术来源(scholarly source),指的是在某一特定的学术研究领域由专家所写,给同行或者对此专业领域有兴趣的人所阅读,提供相关分析素材的研究成果。在国外留学中,虽然平时学校要求完成的作业多为reports&…

Java运维实战:问题定位-CPU突增排查

java程序最常见的故障场景就是CPU徒增的情况了,本片文章为你讲解java程序CPU突增的情况怎么进行排查 1、获取CPU消耗高的线程ID top -Hp 进程ID 然后输入大写P(shiftp),就会将这个进程下的线程按照CPU消耗进行排序展示。 举例 然…

使用 Ansys MotorCAD 进行轴向磁通电机设计

新的 MotorCAD 机器拓扑:轴向磁通电机 轴向磁通量可用拓扑 Ansys MotorCAD支持3种不同的轴向磁通拓扑,包括(双转子 - 单定子)、(单转子 - 单定子)和(单转子 - 双定子) 双转子 - 单…

【深度学习】深度学习和强化学习算法——深度 Q 网络DQN

深度 Q 网络(Deep Q-Network, DQN) 详解 什么是DQNDQN 的背景DQN 训练流程 2 DQN 的核心思想2.1 经验回放(Experience Replay)2.2 目标网络(Target Network)2.3 ε-贪心策略(ε-Greedy Policy&a…

学习数据结构(10)栈和队列下+二叉树(堆)上

1.关于栈和队列的算法题 (1)用队列实现栈 解法一:(参考代码) 题目要求实现六个函数,分别是栈初始化,入栈,移除并返回栈顶元素,返回栈顶元素,判空&#xff0…

芯片引脚描述或电路原理图中的Ipd、Ipu是什么意思?

问:物理层芯片KSZ8081RNB的Data Sheet对某些引脚类型的说明如下: 请说明其中Ipd、Ipu的意思是什么? 答: I:表示该引脚是一个 输入引脚,即该引脚用于接收信号。O:表示该引脚是一个 输出引脚&a…

[操作系统] 基础IO:系统文件I/O

在 Linux 操作系统中,文件 I/O(输入/输出)是程序与文件系统交互的基础。理解文件 I/O 的工作原理对于编写高效、可靠的程序至关重要。本文将深入探讨系统文件 I/O 的机制。 一种传递标志位的方法 在 Linux 中,文件的打开操作通常…

Mybatis-扩展功能

逻辑删除乐观锁 MyBatisPlus从入门到精通-3(含mp代码生成器) Db静态工具类 Spring依赖循环问题 代码生成器 MybatisPlus代码生成器 枚举处理器 我们这里用int来存储状态 需要注解,很不灵活 希望用枚举类来代替这个Integer 这样的话我…

ECharts 实战指南:组件封装+地图轮廓高亮 + 自定义 Tooltip+轮播+锥形柱子

大家好,我是一诺。今天我们将深入探讨 ECharts,这个功能强大的数据可视化库。 无论你是已经在使用 ECharts,还是正计划用它来创建一些炫酷的图表,这篇文章都会对你有所帮助。 我们将从渲染模式开始,逐步深入到如何封…