Stable Diffusion原理说明

news2024/12/28 20:36:11

本文参考:深入浅出讲解Stable Diffusion原理,新手也能看明白 - 知乎

目录

1、Stable Diffusion能做什么?

2、扩散模型(Diffusion model)

(1)前向扩散(Forward Diffusion)

(2)反向扩散(Reverse Diffusion)

(3)如何训练

 3、Stable Diffusion Model

(1)潜在扩散模型(Latent diffusion model)

(2)变分自编码器(Variational Autoencoder)

(3)为什么潜在空间是可能的?

(4)潜空间的反向扩散

(5)什么是VAE文件

(6)条件(Conditioning)

(6.1)文本条件

 (6.2)分词器tokenizer

(6.3)将嵌入(embeddings)送到噪声预测器

(6.4)交叉注意力机制

4、Stable Diffusion 生成步骤

(1)文本到图像

 (2)图像到图像

5、CFG值

(1)分类器引导(Classifier Guidance)

(2)无分类器指导(Classifier-free guidance)

6、Stable Diffusion总结


1、Stable Diffusion能做什么?

在最简单的形式中,Stable Diffusion是一种文本到图像模式,给它一个文本提示(text prompt),它将返回与文本匹配的图像。

2、扩散模型(Diffusion model)

Stable Diffusion是扩散模型(Diffusion model)下的一种模型。

它们是生成式模型,这意味着它们的目的是生成类似于它们训练数据的新数据。对于Stable Diffusion来说,数据就是图像。

 为什么叫扩散模型?

 分为前向扩散反向扩散两个部分,分别对应上图中的加噪和降噪。

(1)前向扩散(Forward Diffusion)

该过程是将噪声添加到训练图像中,逐渐将其转换为没有特点的噪声图像。前向过程会将任何猫或狗的图像变成噪声图像。最终,将无法分辨它们最初是狗还是猫。

就像一滴墨水掉进了一杯水里,墨滴在水中扩散,几分钟后,它会随机分布在整个水中,你再也分不清楚它最初是落在中心还是边缘附近。

下面是一个进行前向扩散的图像示例,猫的图像变成随机噪音。

(2)反向扩散(Reverse Diffusion)

反向过程就像倒着播放视频一样,时光倒流,我们将看到墨滴最初添加的位置。反向过程就是恢复图像。

 从嘈杂、无意义的图像开始,反向扩散恢复了猫或狗的图像。

每个反向扩散过程都有两部分:一是漂移或定向运动,反向扩散向猫或狗的图像漂移;二是随机运动。

(3)如何训练

为了反向扩散,我们需要知道图像中添加了多少噪声,答案是教神经网络模型来预测增加的噪声。它被称为Stable Diffusion中的噪声预测因子(noise predictor),这是一个U-Net模型。训练如下:

  1. 选择一个训练图像,例如猫的照片
  2. 生成随机噪声图像
  3. 通过将此噪声图像添加到一定数量的步骤中来损坏训练图像
  4. 训练噪声预测器告诉我们添加了多少噪声,这是通过调整其权重并向其显示正确答案来完成的。

噪声在每一步按顺序添加, 训练后,我们有一个噪声预测器,能够估计添加到图像中的噪声。

现在我们有了噪声预测器,要如何使用呢?

我们首先生成一个完全随机的图像,并要求噪声预测器告诉我们噪声。然后,我们从原始图像中减去整个估计的噪声。重复此过程几次,就会得到一个猫或一只狗的图像。

 此时,我们无法控制生成猫或狗的图像。当我们后面谈论条件反射时将解决这个问题。目前图像生成是无条件的。

 3、Stable Diffusion Model

 第2部分讲到的是Diffusion model生成图像的原理,但是不是Stable Diffusion Model的原理。原因是上述扩散过程是在图像空间中,它的计算量非常巨大,无法在任何单个GPU上运行。

图像空间是巨大的,具有三个颜色通道(RGB)的3*512*512图像是一个786,432维的空间。

像google的Imagen和OpenAI的DALL-E这样的扩散模型都在像素空间中,他们使用了一些技巧来使模型更快,但仍然不够。

当然用像素空间也有好处,那就是可以比较精确地控制生成地内容,比如显示文字。

Stable Diffusion旨在解决速度问题。

(1)潜在扩散模型(Latent diffusion model)

Stable Diffusion是一种潜在空间扩散的模型。它不是在高维图像空间中操作,而是首先将图像压缩到潜空间(latent space)中(ps:类似于图像中的centerNet算法,也是在隐藏层512*512->128*128空间中进行训练和推理)。对比原像素空间,潜空间小了48倍,因此速度变得更快。

(2)变分自编码器(Variational Autoencoder)

Stable Diffusion使用变分自编码器实现图像潜空间压缩。变分自编码器神经网络由两部分组成:编码器和解码器,编码器将图像压缩为潜在空间中的低维表示,解码器从潜在空间恢复图像。

 Stable Diffusion模型的潜空间为4*64*64,对比原图像像素空间3*512*512小了48倍。我们所谈到的所有正向和反向扩散实际上是在潜在空间中完成的

因此,在训练过程中,它不会生成噪声图像,而是在潜在空间中生成随机张量(潜在噪声)。它不是用噪声破坏图像,而是用潜在噪声 破坏图像在潜空间中的表示。 这样做的原因是它的速度要快得多。

(3)为什么潜在空间是可能的?

为什么VAE可以将图像压缩到更小的潜在空间而不会丢失信息。原因是:自然图像不是随机的,它们具有很高的规律性:面部遵循眼睛、鼻子、脸颊和嘴巴之间的特定空间关系;狗有4条腿,是一种特殊的形状。

这可能和机器学习里的流形假设(Manifold hypothesis)有关。如果认为自然数据是由低维的流形所表示在空间里,那它本身就是一个假象,可以直接去低维空间中计算它而得到和高维度相似的结果。这种将高维图像压缩到低维去理解,好像恰恰是人类视觉神经的一个运作原理。也就是说,更有助于AI将注意力放在低频段的、总体性的形态上去,相当于让AI把更多的精力放在判断一张图像的整体构造上

不过从输出结果来看,流形假设并不完全正确。因为Latent Diffusion在人脸、手这种在图像整体中占比小的,但细节又不可忽视的地方,表现还不如Dall-E这种像素级的Diffusion。所以这种低维的计算还是有损的,这也是为何Stable Diffusion的VAE解码中,加入了人脸修正等加强模块,更换更好的VAE似乎也是一种增强Stable Diffusion效能的方式。

(4)潜空间的反向扩散

  1. 生成随机潜在空间矩阵
  2. 噪声预测器估计潜在矩阵的噪声
  3. 然后从原始潜空间矩阵中减去估计的噪声
  4. 重复步骤2和3直至特定采样步骤
  5. VAE的解码器将潜空间矩阵转换为最终图像。

(5)什么是VAE文件

VAE文件在Stable Diffusion V1中使用,以改善眼睛和面部的绘画效果。他们是我们刚刚谈到的自编码器的解码器。通过进一步微调解码器,模型可以绘制更精细的细节。

(6)条件(Conditioning)

文本提示(text prompt)在哪里注入到图片?需要用到条件。

条件的目的是引导噪声预测器,以便预测的噪声在从图像中减去后会给出我们想要的东西。

(6.1)文本条件

分词器(Tokenizer)首先将提示中的每个单词转换为标记(token)的数字,然后将每个标记转换为称为Embedding的768值向量,其次Embedding由文本转换器处理,并准备好供噪声预测器使用。

 (6.2)分词器tokenizer

文本提示首先由CLIP标记器进行标记化。CLIP是由Open AI开发的深度学习模型,用于生成任何图像的文本描述。Stable Diffusion v1使用CLIP的分词器。

分词器只能对它在训练期间看到的单词进行分词。例如,CLIP模型中有"dream"和"beach",但没有"dreambeach"。Tokenizer将"dreambeach"这个词分解为两个标记"dream"和"beach"。所以,一个词并不总是意味着一个token

Stable Diffusion模型仅限于在提示中使用75个token。

(6.3)将嵌入(embeddings)送到噪声预测器

在送入噪声预测器之前,文本转换器需要进一步处理embedding。它的输入是文本嵌入向量,但它也可以是其他东西,如类标签、图像和深度图。转换器不仅进一步处理数据,而且还提供了一种包含不同调节模式的机制。

(6.4)交叉注意力机制

文本转换器的输出在整个U-Net中的噪声预测器多次使用,U-Net通过交叉注意力机制消耗它,这就是提示与图像相遇的地方。

以提示"蓝眼睛的男人"为例。Stable Diffusion通过提示中的自注意力机制将“蓝色”和“眼睛”这两个词配对在一起,这样它就会生成一个蓝眼睛的男人,而不是一个蓝衬衫的男人。然后,它使用这些信息,通过提示prompt和图像prompt之间的交叉注意力机制将反向扩散引导到包含蓝眼睛的图像。

Lora模型修改交叉注意力模块的权重以更改样式。仅修改此模块就可以微调Stable Diffusion模型这一事实说明了该模块的重要性。

4、Stable Diffusion 生成步骤

(1)文本到图像

第1步,Stable Diffusion在潜空间中生成随机张量。此时可以通过设置随机数生成器的种子来控制此张量。生成的是潜在空间中的图像,但现在都是噪声。

第2步,噪声预测器U-Net将潜在噪声图像和文本提示作为输入,并预测噪声,也在潜在空间4*64*64的张量中。

第3步,从潜在图像中减去潜在噪声,这将成为新的潜在图像。

 步骤2和3重复一定数量的采样步骤,比如20次。

第4步,VAE的解码器将潜在图像转换回像素空间。这是运行Stable Diffusion后获得的图像。

 (2)图像到图像

图像到图像是SDEdit方法中首次提出的一种方法,SDEdit可以应用于任何扩模型,所以有Stable Diffusion的图像到图像的功能。

输入图像和文本提示作为图像到图像的输入提供,生成的图像将由输入图像和文本提示调节。例如,使用这幅素人画和提示“photo of perfect green apple with stem, water droplets, dramatic lighting”作为输入,图像到图像可以将其变成专业绘图。

第1步,输入图像被编码为潜在空间

第2步,噪声被添加到潜在图像中。降噪强度控制添加的噪声量。如果为0,则不添加噪声;如果为1,则添加最大噪声量,以便潜在图像成为完整的随机张量。

 第3步,噪声预测器U-Net将潜在噪声图像和文本提示作为输入,并预测潜在空间(4*64*64张量)中的噪声。

第4步,从潜在图像中减去潜在噪声,这将成为新的潜在图像。

步骤3和4重复一定数量的采样步骤,例如20次。

第5步,VAE解码器将潜在图像转换回像素空间,这是运行图像到图像后获得的图像。

 总结,图像到图像所做的只是设置带有一点噪声和一点输入图像的初始潜在图像。将降噪强度设置为1等效于文本到图像,因为初始潜在图像完全是随机噪声。

5、CFG值

 CFG:Classifier-Free Guidance无分类器引导,这是AI艺术家每天调来调去的值。

(1)分类器引导(Classifier Guidance)

分类器引导是一种在扩散模型中合并图像标签的方法,它可以使用标签来指导扩散过程。例如,标签“猫”引导反向扩散过程中生成猫的照片。

分类器指导强度(classifier guidance scale)是用于控制扩散过程应与标签保持多近的参数。

假设有3组带有标签“猫”、“狗”和“人类”的图像。如果扩散是无指导的,模型将从每个组的总数据中(有点“均匀”的意思)提取样本,但有时它可能会绘制适合两个标签的图像,例如男孩抚摸狗。

在高分类器指导下,扩散模型生成的图像将偏向极端或明确的例子。如果你向模型询问一只猫,它将返回一个明确的猫的图像,没有别的。

(2)无分类器指导(Classifier-free guidance)

 尽管分类器指导实现了破记录的性能,但它需要一个额外的模型来提供该指导,这给训练带来了一些困难。

无分类器指导是一种实现“没有分类器的分类器指导”的方法,文本提示以文本到图像的形式提供此指导。

他们将分类器部分作为噪声预测器U-Nett的条件,在图像生成中实现所谓的“无分类器”(即没有单独的图像分类器)指导。

现在我们通过条件反射有一个无分类器的扩散过程,那么如何控制应该遵循多少指导?无分类器引导(CFG)刻度是一个值,用于控制文本提示对扩散过程的调节程度。当图像生成设置为0时,图像生成是无条件的(即忽略提示),较高的值将扩散引导向提示。

6、Stable Diffusion总结


1、它使用扩散模型,分为前向扩散和反向扩散两部分,对应加噪和降噪的过程
2、前向扩散:类似墨滴在水中扩散,变成随机噪声;反向扩散:恢复图像。
3、训练:教神经网络U-Net预测噪声
4、潜在空间的反向扩散:
(1)生成随机潜在空间矩阵
(2)噪声预测器估计潜在矩阵的噪声
(3)从原始潜在空间矩阵减去估计的噪声
(4)重复步骤(2)和(3)直至特定采样步骤
(5)VAE的解码器将潜在空间矩阵转换为最终图像
5、文生图的步骤
(1)在潜空间中生成随机张量
(2)噪声预测器将潜在噪声图像和文本提示作为输入,并预测噪声
(3)从潜在图像中减去潜在噪声得到新的潜在图像
(4)重复步骤(2)和(3)直至特定采样步骤 
(5)VAE的解码器将潜在空间矩阵转换为最终图像
6、图生图的步骤
(1)输入图像被编码为潜在空间,噪声被添加到潜在图像中。
(2)噪声预测器将潜在噪声图像和文本提示作为输入,并预测噪声
(3)从潜在图像中减去潜在噪声得到新的潜在图像
(4)重复步骤(2)和(3)直至特定采样步骤 
(5)VAE的解码器将潜在空间矩阵转换为最终图像
7、CFG:classifier-free guidance无分类器引导,指的是不需要单独分类模型而使用文本提示来进行引导,该值用于控制文本提示对扩散过程的调节程度

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

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

相关文章

Simple-BEV:多传感器BEV感知中真正重要的是什么?

文章:Simple-BEV: What Really Matters for Multi-Sensor BEV Perception? 作者:Adam W. Harley , Zhaoyuan Fang,Jie Li,Rares Ambrus , Katerina Fragkiadaki 编辑:点云PCL 代码:…

华为OD机试之查找接口成功率最优时间段(Java源码)

查找接口成功率最优时间段 题目描述 服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,数组中每个元素都是单位时间内失败率数值,数组中的数值为0~100的整数,给定一个数值(minAverag…

【Web服务应用】Apache配置与应用

Apache配置与应用 一、构建虚拟Web主机1.1httpd服务支持的虚拟主机类型包括以下三种 二、基于域名的虚拟主机三、基于IP地址的虚拟主机四、基于端口的虚拟机五、Apache连接保持六、构建Web虚拟目录与用户授权限制七、日志分割 一、构建虚拟Web主机 虚拟Web主机指的是在同一台服…

手把手教你部署FreeYOLO

作者:Kissrabbit 原文链接: https://zhuanlan.zhihu.com/p/578830729 本章将讲解如何将torch训练好的权重文件转换为ONNX文件,并如何部署回到OpenVINO、TensorRT等框架下。笔者将以自己的FreeYOLO项目为例,来完成本章的内容讲解,相关代码如下…

企业数字化转型转什么?怎么转?这份攻略请收好...

数字化转型,转什么?怎么转?这些问题仍在困扰不少企业,也是每个企业转型升级不得不思考的重要问题。 对此,中关村数字经济产业联盟、元年研究院、《管理会计研究》联合发布了《成就数据驱动型企业 中国企业数字化转型白…

ROS订阅与发布话题

目录 一、新建一个ROS工作空间并创建功能包 二、创建一个msg消息 三、发布话题 四、订阅话题 前言 Ubuntu18.04 ROS Melodic 一、新建一个ROS工作空间并创建功能包 mkdir -p catkin_ws/src cd ~/catkin_ws/src/ catkin_init_workspace cd ~/catkin_ws/ catkin_make echo &…

USB接口的演变与升级

USB接口是计算机与外部设备之间传输数据的重要接口之一,它的演变和升级经历了多年的发展。本文将详细介绍USB接口的发展历程、应用领域、标准化进程以及未来趋势。 USB接口最早出现在1994年,当时是由英特尔公司、微软公司和惠普公司共同开发的。这个接口…

React中useEffect的源码解读

对源码的解读有利于搞清楚Hooks到底做了什么,如果您觉得useEffect很“魔法”,这篇文章也许对您有些帮助。 本篇博客篇幅有限,只看useEffect,力求简单明了,带您到React Hooks的深处看看 按图索骥找到Hook相关源码&…

JavaWeb之Servlet

1、什么是JavaWeb? Servlet 是 JavaEE 规范之一。规范就是接口 Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。 Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的…

Python plt; ax 设置tick

Python中绘图可以基于plt;也可基于ax 在 Matplotlib 中,Axes 对象(常简写为 ax)是在图(Figure)中进行大部分的绘图操作的地方。一个 Axes 对象代表了一个具体的绘图区域。 利用 plt 绘图 简单的图像测试…

继续探索Roop(单张图视频换脸)的各方面:比如喜闻乐见的“加速”

文章目录 (一)Roop项目的特点(二)Roop也能加速***(三)Roop更新和依赖(3.1)飞速更新(3.2)依赖问题(3.3)需要CUDA么 前两天写了&#x1…

如何修复vcruntime140.dll文件?多种解决vcruntime140.dll的方法分享

在使用Windows操作系统时,经常会遇到一些错误提示,比如缺少vcruntime140.dll文件。这个文件是Visual C Redistributable Package的一部分,它负责运行C程序。如果你在运行某些软件或游戏时收到了“缺少vcruntime140.dll文件”的错误提示&#…

电子科技大学计算机系统结构半期考试参考答案

2023 答案-半期试题(15分) 1、试分析采用哪种设计方案实现求浮点数乘法FPMUL对系统性能提高更大。假定FPMUL操作占整个测试程序执行时间的10%。 一种设计方案是增加专门的FPMUL硬件,可以将FPMUL操作的速度加快到10倍&#…

IP协议与ethernet协议

一、IP协议 1.IP协议作用和意义 (1)计算机网络体系结构 (2)网络互联使用路由器 (3)IP网的意义 当互联网上的主机进行通信时,就好像在一个网络上通信一样,看不见互连的各具体的网络…

Vue.js 中的渲染函数是什么?如何使用渲染函数?

Vue.js 中的渲染函数是什么?如何使用渲染函数? Vue.js 是一款流行的前端框架,它提供了许多方便的工具和 API,用于构建交互式的用户界面。其中,渲染函数是 Vue.js 中一个强大的工具,它可以让我们以编程的方…

深度解析java异步多线程优化版

快速使用需求:我不要理解一堆理论想直接用 操作说明 ITask.java PutEsTask.java TaskExecutor.java TaskQueue.java TestMain.java请把这几个类文件复制下去,运行testMain的方法,根据TestMain的运行日志,【1】-> 【8】不同需求…

2.3 网络设计与redis、memcached、nginx组件

目录 一、网络模块需要处理哪些事情二、reactor网络设计模型三、网络模块与业务的关系四、redis、memcached、nginx1、redis2、memcached3、ngnix4、总结 一、网络模块需要处理哪些事情 网络编程主要关注客户端与服务端交互的四个问题: 1、连接建立 2、消息到达 3、…

《不要挑战人性》笔记(一)

恒河猴实验 代母实验 将刚出生的小猴子与母亲分开,让它与绒布妈妈跟铁丝妈妈生活在一起。铁丝妈妈身上有食物,绒布没有食物,小猴子更喜欢绒布妈妈,即使它在铁丝妈妈那里得到了食物。绒布妈妈身上设置机关,攻击小猴子&a…

OAuth2 工作流程详解

我们之前谈到了使用saml作为SSO单点登录认证。本文讲解oauth2.0协议,oauth2.0协议避免了客户端直接访问受保护资源 什么是OAuth OAuth是一种安全的开放协议,用于在不相关的服务之间授权用户。换句话说,它使一个服务能够访问托管在其他服务上…

Flutter 笔记 | GetX

官网:https://pub.dev/packages/get 中文文档:https://github.com/jonataslaw/getx/blob/master/README.zh-cn.md 关于 GetX 现在Flutter的状态管理方案很多,redux、bloc、state、provider、Getx。 provider是官方提供的状态管理解决方案&…