【深度学习】图像风格混合——StyleGAN2原理解析

news2025/6/8 12:20:16

1、前言

上一篇文章,我们详细讲解了StyleGAN的原理。这篇文章,我们就来讲解一下StyleGAN2,也就是StyleGAN的改进版。

原论文:Analyzing and Improving the Image Quality of StyleGAN

参考代码:①Pytorch版本,非官方

​ ②StyleGan 2 (labml.ai)

​ PS:推荐看代码②,里面对每行都进行了注释。

视频:【图像风格混合——StyleGAN2原理解析-哔哩哔哩】

2、StyleGAN存在的问题

在StyleGAN中,大多数的生成的图像容易产生一个类似水滴状的伪影,并且这些伪影在64 x 64 后就便存在在特征图中

在这里插入图片描述

3、StyleGAN2的改进点

3.1、模型图改进

针对上面的问题,作者对模型进行了修改,具体情况如下图

作者经过实验发现,AdaIN的归一化操作,是造成水滴伪影出现了根本原因,于是,作者把AdaIN层里面的归一化去掉。又经过实验,发现,将噪声B和偏置项b移动出style模块之外,取得的效果更好。经过此操作后,作者发现归一化和A映射的时候,只需要标准差就可以了(舍弃均值),如下图的图(c)

在这里插入图片描述

图(a)是传统StyleGAN的生成网络;图(b)是StyleGAN生成网络的细节拆分;图(c)是StyleGAN2的生成网络;

对图(c),首先随机生成一个常数特征图c,然后把它与w latent Code映射成的A进行Mod std操作。由于仅仅是对常数c进行缩放操作,所以可以把这个缩放直接写入到下一个层(Conv 3 x 3),也就是直接对Conv这参数进行缩放
w i , j , k ′ = s i ∗ w i , j , k w'_{i,j,k} = s_i*w_{i,j,k} wi,j,k=siwi,j,k
w 、 w ′ w、w' ww分别表示原始的参数跟缩放后的参数, s s s表示从w latent Code映射过来的缩放权重, i i i表示第几张特征图, j j j表示输出特征图, k k k代表卷积核

同样的,在下面的实例归一化中,作者去掉了减去均值的操作,只对输出值进行缩放而已,所以同样可以写入到卷积层的参数中
w i , j , k ′ ′ = w i , j , k ′ ∑ i , k w ′ i , j , k 2 + ϵ w''_{i,j,k}=\frac{w'_{i,j,k}}{\sqrt{\sum\limits_{i,k}{{w'}^2_{i,j,k}}+\epsilon}} wi,j,k′′=i,kwi,j,k2+ϵ wi,j,k
其中, ϵ \epsilon ϵ一个很小的常数,防止分母为0

于是乎,StyleGAN2的模型图就从图(c)简化成了图(d)

除此之外,在StyleGAN中,每个分辨率都注入两次风格信息w,这些w都是一样的。在StyleGAN2中,作者提出生成不同的w,每次都注入不同的w。记为w+

所以对于StyleGAN中,w latent Code ∈ R [ b a t c h , , 512 ] \in R^{[batch,,512]} R[batch,,512],w+ latent Code ∈ R [ b a t c h , 18 , 512 ] \in R^{[batch,18,512]} R[batch,18,512],因为分辨率从4x4开始上采样8次,每个分辨率注入两次风格信息,再加上在4 x 4 也要注入两次,所以得到 18 x 512 维度的w+。

3.2、损失函数改进

3.2.1、Lazy regularization(惰性正则化)

在StyleGAN中,判别网络,除了正常的判别损失,还加上了一个正则化项,其公式如下
R 1 = γ 2 E x ∼ p d a t a [ ( ∣ ∣ ∇ x D ( x ) ∣ ∣ 2 − 1 ) 2 ] R_1=\frac{\gamma}{2}\mathbb{E}_{x \sim p_{data}}\left[\left(||\nabla_xD(x)||_{2} -1\right)^2\right] R1=2γExpdata[(∣∣xD(x)21)2]
其中, γ \gamma γ是一个自己设定的超参数, P d a t a P_{data} Pdata表示真实数据的分布, ∇ x D ( x ) \nabla_xD(x) xD(x)表示对 D ( x ) D(x) D(x)关于 x x x求梯度

这个正则化项的做法,是为了防止梯度消失或者爆炸而提出的,将其梯度限定在1。

而在StyleGAN2中,作者发现,这个正则化项的计算频次要低于主要的损失函数,经过实验,每16个minbatchs执行一次正则化项即可,这样可以大大降低计算成本和总内存的使用。

3.2.2、Path length regularization(路径长度正则化)

**论文原话翻译:**我们鼓励固定大小的步长𝒲在图像中产生非零的、固定大小的变化。我们可以通过在图像空间中步入随机方向并观察相应的𝐰梯度来根据经验测量与该理想的偏差。无论𝐰图像空间方向如何,这些梯度的长度都应该接近相等,这表明从潜在空间到图像空间的映射是有条件的。

其实就是在生成网络中加入另一个损失项,其公式如下
E w , y ∼ N ( 0 , I ) ( ∣ ∣ J w T y ∣ ∣ 2 − a ) 2 \mathbb{E}_{w,y\sim\mathbf{N(0,\mathbf{I})}}\left(||\mathbf{J}^T_{w}\mathbb{y}||_2-a\right)^2 Ew,yN(0,I)(∣∣JwTy2a)2
其中, J w \mathbf{J}_w Jw是生成图像对w的雅可比矩阵,即 J w = ∂ g ( w ) / ∂ w \mathbf{J}_w=\partial{g(w)}/\partial{w} Jw=g(w)/w。y是从标准正态分布中采样出来的随机图像。为了避免雅可比矩阵的显式运算,对其进行恒等变化 J w T y = ∇ w ( g ( w ) ∗ y ) \mathbf{J}^T_{w}\mathbb{y}=\nabla_w(g(w)*y) JwTy=w(g(w)y) a a a J w T y \mathbf{J}^T_{w}\mathbb{y} JwTy的指数移动平均。

这个公式怎么理解呢,emmmmm…

我们从矩阵与向量的乘法角度去理解吧,y是一个随机图像,其维度为 y ∈ R M y \in R^M yRM(M=3wh,即RGB图像维度),而对于 J w T ∈ R L × m \mathbf{J}_w^T\in R^{L\times m} JwTRL×m J w \mathbf{J}_w Jw代表的是生成图像在w上面的变化,y为随机采样出来的图像,这两个值做矩阵乘法,就是将图像y映射到 J w \mathbf{J}_w Jw所在空间,其实也就是将变化送到图像y中,取L2范数,代表的就是图像变化的长度。减去 a a a再取平方自然就是希望图像变化的长度等于 a a a

最最最最最重要的是,作者在论文里面证明,当 J w \mathbf{J}_w Jw这个矩阵正交,损失达到最小。当矩阵正交时,意味着w的各个分量之间相互正交垂直,线性无关,也就达到了解耦的目的。

怎么证明的?emmmmm…我看了很多人的文章,想找到其中推导,都未曾找到…感兴趣的自己看论文吧,在下才疏学浅,资质驽钝,未能参透。

3.3、训练方式改进

在StyleGAN中,使用的是PGGAN的渐进式训练方法,这种方法可以很好地生成高分辨率大图,但是,他有一个缺陷,即某些细节丧失了移动不变性。

在这里插入图片描述

当人脸旋转的时候,牙齿却没有跟着旋转。作者认为,造成这种情况的原因是,每个分辨率都会生成一张图像,在低分辨率的时候,生成器会尽量生成细节,如果在低分辨率区域生成很多次中间牙齿,这会导致在中间层(中分辨率)的时候,中间牙齿的频率过高,没有办法调节过来。

作者提出其他训练方法取代渐进式训练

在这里插入图片描述

图(a)代表的是MSG-GAN的模型训练方法,中间的虚线将模型分为生成网络(上)和判别网络两部分(下),作者对其进行简化,在每一个分辨率tRGB后直接与上一个分辨率的上采样图像简单相加,即图(b),Ps:图(b)里面的上采样和下采样均使用双线性插值。

而图(c)是经过图(b)进一步修改成残差网络的。

作者经过实验发现,残差网络对判别器的作用很大。但是,将残差网络用在生成器却造成了损害。于是,作者使用图(b)作为生成器结构和图(c)作为判别器结构。

除此之外,里面的tRGB等等操作,与StyleGAN中的不一样,具体的在代码中有体现,更具体的,请参考StyleGan 2 (labml.ai)

4、Projection of images to latent space(将图像投影到隐空间)

其实就是把我们现实的真实图像投影到w空间,将图像的风格信息提取出来,然后对该风格进行修改,以达到修改我们真实图像的目的

论文里面没有对具体方法进行展开,但是我在拜读其他人的文章时,里面提到了两种具体方法StyleGAN 和 StyleGAN2 的深度理解 - 知乎 (zhihu.com)

①在训练StyleGAN的时候,训练一个编码器,将真实图片喂进去,输出隐空间的向量。

②将预训练好的StyleGAN,随机采样z latent Code映射成w latent Code,然后生成的图像与真实图像计算损失,更新w latent Code,直到收敛。

显然,第一个方法不能处理训练数据集以外的图像;而第二种虽然可以,但是每次都要迭代训练更新w,也颇为麻烦。

论文里面用到的时第二种,对这些感兴趣的,参考论文Image2StyleGAN: How to Embed Images Into the StyleGAN Latent Space?

5、结束

以上,便是StyleGAN的全部内容,如有问题,还望指出,阿里嘎多!

在这里插入图片描述

6、参考

图像生成典中典:StyleGAN & StyleGAN2 论文&代码精读 - 知乎 (zhihu.com)

StyleGAN 和 StyleGAN2 的深度理解 - 知乎 (zhihu.com)

StyleGan 2 (labml.ai)

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

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

相关文章

腐蚀Rust 服务端搭建架设个人社区服务器Windows教程

腐蚀Rust 服务端搭建架设个人社区服务器Windows教程 大家好我是艾西,一个做服务器租用的网络架构师也是游戏热爱者。最近在steam发现rust腐蚀自建的服务器以及玩家还是非常多的,那么作为服务器供应商对这商机肯定是不会放过的哈哈哈! 艾西这…

wangeditor与deaftjs的停止维护,2024编辑器该如何做技术选型(一)

wangeditor暂停维护的声明: wangeditor是国内开发者开发的编辑器,用户也挺多,但是由于作者时间关系,暂停维护。 deaft的弃坑的声明: draft是Facebook开源的,但是也弃坑了,说明设计的时候存在很大…

第二证券策略:股指预计维持震荡格局 关注汽车、工程机械等板块

第二证券指出,指数自今年2月份阶段低点反弹以来,3月份持续高位整理。进入4月份之后面对年报和一季报的双重财报发表期,预计指数短期保持高位整理概率比较大。前期缺乏成绩支撑的概念股或有回落的危险,主张重视成绩稳定、估值低、分…

Redis队列与Stream

Redis队列与Stream、Redis 6多线程详解 Redis队列与StreamStream总述常用操作命令生产端消费端单消费者消费组消息消费 Redis队列几种实现的总结基于List的 LPUSHBRPOP 的实现基于Sorted-Set的实现PUB/SUB,订阅/发布模式基于Stream类型的实现与Java的集成消息队列问…

Tuxera Ntfs for mac 2023中文解锁版安装、密钥下载与激活教程 Tuxera激活码 tuxera破解

Tuxera Ntfs for mac2023是Mac中专用于读写外置存储的工具,具有强大的磁盘管理和修复功能,它在Mac上完全读写NTFS格式硬盘,快捷的访问、编辑、存储和传输文件。能够在 Mac 上读写 Windows NTFS 文件系统。Tuxera NTFS 实现在Mac OS X系统读写…

根据ELK官网指引部署ELK- ECK-Elastic-​ Kibana​-Learn-ELK-(一)

**Attention: 1、You need open the ELK official website and step by step to deploy . 2、If you copy my command ,you must check them if it not match your environment . 一、official website Elastic documentation | Elastic Check there. 二、 ECK简介…

napi系列学习高阶篇——通过IDE集成C/C++三方库并开发napi接口

简介 应用在调用系统固件集成的C/C三方库时,可能会由于系统固件集成端与IDE的NDK中libc版本不一致导致调用失败,而且系统固件集成的C/C三方库对于应用的调式也很不友好,需要多方编译调试,很不方便。因此本文将通过在IDE上适配ope…

文件IO/标准IO

1.标准I/O 标准: 任何操作系统皆可使用;使用范围很广 系统调用和库函数 系统调用:操作系统给我们提供的接口 man 2 printf 可以调用内核中的接口 直接驱动显卡运行 printf实际是库函数中的函数,然后调用系…

目标检测笔记

目标检测笔记 one-stage和two-stage目标检测算法Two-Stage 目标检测算法One-Stage 目标检测算法既然Faster R-CNN使得候选区域生成和目标检测可以在同一个网络中端到端训练,为什么它还是属于Two-stage算法? 目标检测模型,训练中的正负样本是什…

分布式技术--------------ELK大规模日志实时收集分析系统

目录 一、ELK日志分析系统 1.1ELK介绍 1.2ELK各组件介绍 1.2.1ElasticSearch 1.2.2Kiabana 1.2.3Logstash 1.2.4可以添加的其它组件 1.2.4.1Filebeat filebeat 结合logstash 带来好处 1.2.4.2缓存/消息队列(redis、kafka、RabbitMQ等) 1.2.4.…

AI PC元年,华为的一张航海图、一艘渡轮和一张船票

今天,从学术研究者到产业投资者,无不认为大模型掀起了一场人工智能的完美风暴。 所谓“完美风暴”,指的是一项新技术的各个要素,以新的方式互相影响、彼此加强,组合在一起形成了摧枯拉朽般的力量。 而我们每个人&#…

Singleton单例设计模式详解

目录 模式定义应用场景实现方式1.懒汉模式:2.饿汉模式:3.静态内部类反射如何防止反射攻击破坏? 枚举类型序列化 部分源码中的应用定位Spring & JDKTomcat反序列化指定数据源 模式定义 保证一个类只有一个实例,并且提供一个全…

jmeter使用之生成html测试报告

测试的最终结果是需要给出一份报告,那么在用jmeter测试时怎么生成一份报告呢,以下针对jmeter如何生成html报告进行简单介绍 一、首先把测试脚本写好二、利用命令生成html报告 命令:jmeter -n -t 【Jmx脚本位置】-l 【结果文件result.jtl存放…

DBSCAN简介

1. 简介 常用聚类方法有: 1. 层次的方法(hierarchical method); 2. 划分方法(partitioning method); 3. 基于密度的方法(density-based method); 4. 基于网格的方法(grid-based method); 5. 基于模型的方法(model-base…

[MAUI]集成富文本编辑器Editor.js至.NET MAUI Blazor项目

文章目录 获取资源从源码构建从CDN获取获取扩展插件 创建项目创建控件创建Blazor组件初始化保存销毁编写渲染逻辑 实现只读/编辑功能切换模式获取只读模式状态响应切换事件 实现明/暗主题切换项目地址 Editor.js 是一个基于 Web 的所见即所得富文本编辑器,它由CodeX…

【opencv】示例-npr_demo.cpp 非真实感渲染:边缘保留平滑、细节增强、铅笔素描/彩色铅笔绘图和风格化处理...

Edge Preserve Smoothing- Using Normalized convolution Filter Edge Preserve Smoothing-Using Recursive Filter Detail Enhancement Pencil sketch/Color Pencil Drawing Stylization /* * npr_demo.cpp * * 作者: * Siddharth Kherada <siddharthkherada27[at]gmail[do…

最优算法100例之46-单链表逆置-头插法

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 单链表逆置-头插法 题解报告 1)带头结点 带头结点的反转链表,头结点一直不动,后移head->next。不带头结点的反转,后移…

【vue】defineEmits 传值 子传父

先行知识 【vue】导入组件【vue】defineProps 传数据 父传子 传值流程 App.vue <template><Header getWeb"emitsGetWeb" userAdd"emitsUserAdd"/><hr /><p>web.name: {{ web.name }}</p><p>web.url: {{ web.url }}&…

HarmonyOS实战开发-横竖屏切换

介绍 本实例展示如何使用媒体查询&#xff0c;通过ohos.mediaquery 接口完成在不同设备上显示不同的界面效果。 效果预览 使用说明 1.在竖屏设备上&#xff0c;首页展示新闻列表&#xff0c;点击新闻进入详情界面。 2.在横屏设备上&#xff0c;首页左侧展示新闻列表&#x…

MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64)

MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64) 一、算法介绍二、算法步骤三、算法实现1.代码 (完整,注释清晰,可直接用)2.结果一、算法介绍 首先说明: ------这里代码手动实现,不调用matlab提供的法向量计算接口,更有助于大家了解法向量和曲率的计算方法,…