Stable diffusion生图原理

news2024/9/27 12:12:31
  1. 简介

      Stable diffusion 是一种基于扩散技术的深度学习模型,于2022年发布,是Stability AI公司推出的首要产品,它主要用于生成以文本描述为条件的详细图像,同时也可以进行补绘、外绘、重绘等任务,但原理都和文生图原理相似。

      Stable Diffusion是一种隐扩散模型(在扩散模型基础上进行了优化,后面会介绍)。

  1. 主要过程(以文生图为例)

      Stable Diffusion属于深度学习模型里的一个类别,称为diffusion models(扩散模型)。这类模型属于生成式模型,也就是说它们用于生成新的数据,而生成的这部分新数据类似于它们训练时的数据。对于SD来说,这类新数据便是图片,为什么叫扩散模型?这是因为它的数学公式看起来非常像物理上的扩散现象。

      假设我们训练了一个diffusion model,训练时只给了2类图片:猫与狗。如下图所示,左边便是送入训练的猫与狗的图片。

接下来要经过前向扩散和反向扩散两个过程,最终会生成一张我们想要的图片。

  1.   前向扩散(forward diffusion)

    • 前向扩散的过程是给训练图片添加噪点的过程,并逐渐将图片转为一个反常的噪点图。也就是会将任何猫或狗的图片转为一张噪点图,并最终无法辨认噪点图对应的初始图片是猫还是狗(可以调节噪点添加的多少),这个过程就像是滴入了一滴墨水到一杯水里,墨水在水里扩散,在几分钟后,墨水会随机分散并融入水中。且无法判断它最初是从水杯的中心滴入,还是从边缘滴入,所以叫做扩散模型。

    • 前向扩散最后生成的随机噪点图如下:

                    ​​​​​​​

  1.   反向扩散(reverse diffusion)

    • 在前向扩散之后是反向扩散过程,反向扩散过程最理想的效果是:

      • 输入一张噪点图(毫无意义的图),反向扩散可以将这张噪点图恢复为一张猫或狗的图片。这就是反向扩散的主要目标。

    1.     从技术角度来说,每个扩散过程分为2部:

      • 漂移或定向运动(例如,所举的例子来说,噪点图要么偏向狗的方向,要么偏向于猫的方向)

      • 随机移动

            反向扩散会朝着猫或狗的图片方向进行漂移,最后生成一张猫或狗的图片。
  1. 技术原理

具体过程已经了解了,那么怎么在技术层面实现这些过程,训练出这样一个模型呢?

  1.   模型训练过程

        从反向扩散的角度来说,我们需要知道有多少“噪点”加入到了某张图片里,然后将这些噪点去除,便可以得到我们想要的图片。因此我们首先需要训练一个神经网络来预测添加的噪点有多少。这个模型在SD里称为噪点预测器(noise predicator)。

    1.     训练噪点预测模型流程:

      1. Step1:选择一张训练图(例如一张猫的图片)

      2. Step2:生成随机的噪点图

      3. Step3:给这张图继续增加多轮噪点

      4. Step4:训练noise predictor,预测加入了多少噪点。通过神经网络训练权重,并展示其正确答案

            经过训练,便可得到一个noise predictor,它可以预测一张噪点图中,加入到图片的噪点信息。

        现在已经有了noise predictor(噪点预测器),应该如何使用呢?

    1.     通过反向扩散过程生成图片

            我们首先生成一张完全随机的图片,并让noise predictor告诉我们噪点是什么。然后从原图中移除噪点。并重复此过程多次,最终遍得到一张猫或狗的图片,反向扩散通过逐步从图像中减去预测出的噪声来生成最终的图片。

        所以,通过前向扩散和反向扩散就可以生成一张猫和狗的图片,但现在距离我们所说的文生图还有一些差距,因为大家也注意到了,反向扩散去除噪点的过程是基于我们之前noise predictor 噪点预测器的训练数据的,所以只会生成猫或者狗的图片,那么如何生成符合我们输入文本的图像呢?这个篇幅比较多,后面会详细介绍,现在先介绍一下另一个重要的前置知识。
  1.   重要的名词解释

    • 采样

      • 反向扩散中去除噪声过程被称为采样,在每一步都会生成一个新的样本图像。采样所用的方法称为采样器或采样方法。

        • 下面是一个正在进行的采样过程。采样器逐渐产生越来越清晰的图像(经过多轮采样,噪声逐渐减少)

   通过前面的过程,我们可以看出,生成一张图片的过程包括前向扩散生成一张完全随机的噪点图,然后在反向扩散的过程中,预测噪声并去除,多轮采样(降噪)后生成最终的图片。。但实际上,生成一张随机的噪声图,然后通过反向扩散逐步预测并去除噪声图中的噪点,这个计算过程非常缓慢,基本上无法在单个GPU上处理,所以stable diffusion选择了先将图像降维,把图片压缩到一个“潜空间”(latent space)中,而不是在高维的图片空间里工作,因此,stable diffusion是一个潜扩散模型(latent diffusion model),潜空间比图片空间小了48倍,所以它可以节省大量计算,继而运行速度更快。

  在此基础上,我们就可以把之前介绍的前向扩散和反向扩散过程用SD采用的潜扩散原理来更准确的描述了。
  1.   SD的潜扩散原理

    1.     将图片压缩到潜空间

      • 使用的技术是variational autoencoder(变分自动编码器),即VAE。

      • VAE神经网络包含2部分:Encoder与Decoder,Encoder将一张图片压缩到“潜空间”里的一个低维空间表示。Decoder从“潜空间”里的表示恢复为一张图片。

      • 前面提到的前向与反向扩散都是在潜空间里完成。

      • 所以在训练时,不再是生成一张噪点图,而是在潜空间里生成一个随机张量(tensor)。并且在给图片每一步增加噪点时,也不再是给图片增加噪点,而是给图片在潜空间里的张量增加潜噪点,潜空间更小,执行速度更快。

            所以就诞生了一个问题
    1.     为什么潜空间是合理的?

            为什么VAE可以压缩一张图片到非常小的一个潜空间而不损失信息呢?

      • 这是因为:自然图片并非是随机的,它们有很高的规律性。例如,一张脸上鼻子、脸颊和嘴巴之间有特定的空间关系;一只狗有4只腿并且有特定的形状。

      • 换句话说,高维的图片是人为的。自然图像可以轻松地压缩到较小的潜空间中,而不会丢失任何信息。

    1.     结合上面的前置知识介绍,SD模型工作流程可以概括如下:

      • Step1:生成随机的潜空间矩阵

      • Step2:Noise predictor预测潜矩阵的噪点

      • Step3:将预测的噪点从潜矩阵中去除

      • Step4:重复步骤2与3,直到特定的采样步数

      • Step5:VAE的decoder将潜矩阵转为最终图片

    1.     添加文本控制

            到目前为止,我们还没介绍文本是如何影响图片生成的。如果没有文本prompt的影响,SD模型也不会是一个text-to-image模型。我们可以得到一张猫或狗的图片,但是没有方式来控制它。

    • 这部分就是“条件”(conditioning)要做的事情。“条件”的目的便是引导noise predictor,让其知道:在抽取预测的噪点后,我们需要的是什么。

    • 下面展示的是:文本提示(text prompt)如何处理并输入到noise predictor的过程:

      • Step1:首先,Tokenizer(分词器)将每个输入的单词转为一个数,称为token。

      • Step2:每个token然后转为一个768维的向量,称为词嵌入(embedding)。

      • Step3:词嵌入然后由Text Transformer处理,并可以被Noise predictor进行消费。

      • Step4:Noise predictor便可以通过文本提示(text prompt)转化成的词嵌入来预测添加的噪声,然后将其去除。

      • Step5:通过多轮采样(去噪)便可以得到文本提示(text prompt)预期的图片。

  1. 示例

      下面结合几个例子具体介绍一下SD工作的流程:

    1.   文生图

          文生图:

      • 即给SD模型输入一组文本提示词,它可以返回一张文本提示词对应的图片。

      1.     具体过程如下

        • Step 1. Stable Diffusion在潜空间里生成一个随机张量。我们通过设置随机种子seed来控制这个张量的生成。如果我们设置这个随机种子为一个特定的值,则会得到相同的随机张量。这就是我们在潜空间里的图片。但是当前还全是噪点。

        • Step 2. Noise predictor 将潜噪点图以及文本提示词作为输入,并预测噪点,此噪点同样也在潜空间内

        • Step 3. 从潜图片中抽取潜噪点,并生成了新的潜图片。

                  Step 2 与 Step 3 重复特定采样次数,例如20次。

        • Step 4. 最后,VAE的decoder将潜图片转回像素图片空间,这便是我们通过SD模型最终得到的图片。

        • 现在再看这张图,就可以很容易理解了:

    1.   图生图

          图生图:

      • 即输入是一张输入图片以及一组文本提示词。生成的图片会由输入图片以及文本提示词两者共同调节。例如,使用下面的简笔画,以及提示词“带茎、水滴和戏剧性照明的完美绿色苹果照片”作为输入,图生图可以将其转换成专业绘画。

      1.     具体流程如下:

        • Step 1. 输入图片编码到潜空间

        • Step 2. 加入噪点到潜图片。Denoising strength控制加入多少噪点。如果为0,则不会加入噪点。如果为1,则会加入最多的噪点,这样潜图片则转为一张完全随机的张量。

        • Step 3. Noise predictor U-Net使用潜噪点图以及文本提示词作为输入,并预测潜空间内的噪点

        • Step 4. 从潜图片中剔除潜噪点,并生成新的潜图片

        • Step 3 与 4 重复多次,直到特定采样步数,例如20次。

        • Step 5. 最后,VAE的解码器将潜图片转回像素空间,便得到了最终生成的图片。

        • 图生图的原理,简单来说就是设置一个初始的、带噪点的潜图片,作为输入图片,然后经过多轮采样(去除噪点),最终得到预期的图片,如果denoising strength设置为1,则等同于文本生成图了,因为初始的潜图片是完全随机的噪点。

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

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

相关文章

C++中矩阵的介绍及相关应用扩展详解

1. 矩阵概念 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵。这一概念由19世纪英国数学家凯利首先提出。 矩阵是高等代数学中的常见工具,也常见于统计分析…

Qt-QPushButton按钮类控件(22)

目录 描述 使用 给按钮添加图片 给按钮添加快捷键 添加槽函数 添加快捷键 添加组合键 开启鼠标的连发功能 描述 经过上面的一些介绍,我们也尝试的使用过了这个控件,接下来我们就要详细介绍这些比较重要的控件了 使用 给按钮添加图片 我们创建…

线性表之单链表

在上一节我们学习了线性表中的顺序表,今天我们来学习一下线性表中的另一种结构——单链表 前言 我们在之前已经初步了解了数据结构中的两种逻辑结构,但线性结构中并非只有顺序表一种,它还有不少兄弟姐妹,今天我们再来学习一下单链…

RealityCapture全面讲解:摄影测量软件的新纪元

随着数字化技术的迅猛发展,摄影测量软件在各行各业中的应用日益广泛。其中,RealityCapture作为一款领先的摄影测量解决方案,以其卓越的速度、精度和易用性,赢得了全球众多专业人士的青睐。本文将全面讲解RealityCapture的功能特点…

演示:基于WPF自绘的中国省份、城市、区县矢量地图

一、目的:演示一个基于WPF自绘的中国省份、城市、区县矢量地图 二、效果 国 省 市 三、功能 支持实际经纬度显示 支持平移,缩放等功能 显示中国地图 显示各个省份地图 显示各个省份地图(包含在表格中,包含缩率图) 显…

UE4_后期处理五—饱和度调整、隔离、扭曲、重影

一、色彩饱和度调整: 原图 后期处理材质节点: 效果图: 可以根据参数saturation调整饱和还是去饱和。 当saturation为1时:去饱和度,如下图: 当saturation为0时:原始的一个状态,如下…

JS import export export default ES6 modules 玩的明白吗

export (ES6) 导出 一个文件可以有多个,不可重名 命名导出: 使用export关键字导出变量、函数、类或值时,需要为它们指定名称。这些名称将在其他模块中用于导入。 export default 单一导出: export default 只能用于导出一个模块、…

python 读取excel

一、安装依赖: pandas 二、新建excel 示例数据:students.xlsx 三、定义类:student.py Student class Student:def __init__(self, name, sex):self.name nameself.sex sexdef show(self):print(f姓名:{self.name} 性别&#…

全面理解tensor编程中矩阵的行和列

经常会在编程中遇到理解矩阵行和列的事情。 1、要明确无论这个张量有多少维度,它的矩阵乘法都只能作用于最后两个维度。 例如: import torcha torch.rand([64, 32, 3, 4]) b torch.rand([64, 32, 3, 4])c torch.matmul(a, b.transpose(2, 3)) # 交…

3.接口测试的基础/接口关联(Jmeter工具/场景一:我一个人负责所有的接口,项目规模不大)

一、Jmeter接口测试实战 1.场景一:我一个人负责所有的接口:项目规模不大 http:80 https:443 接口文档一般是开发给的,如果没有那就需要抓包。 请求默认值: 2.请求: 请求方式:get,post 请求路径 请求参数 查询字符串参数…

sh文件执行提示语法错误: 未预期的文件结尾

在执行sh文件时总是提示:语法错误: 未预期的文件结尾,尝试删除最后的空格也不对 最后发现在notepad中转换的问题 需要把windows换成unix就行了

时间序列中的多尺度问题-近期值得关注的8篇多尺度建模工作

时间序列的多尺度建模 多尺度是时序研究必须要考虑的问题。一方面,不同特征的周期模式有长有短,需要用不同尺度进行刻画。另一方面,尺度越小越精细,计算越复杂;尺度越大越粗糙,相应计算量减少,…

容器化安装jenkins稳定版长期维护版本LTS

前提已有 docker-compose和docker-ce环境,这里安装稳定的Lts版本即可。 选择稳定版本 这里选择LTS 稳定长期维护的版本 在docker镜像找到LTS稳定版本 部署jenkins服务 创建持久化数据目录 jenkinsdata]# pwd /data/jenkinsdata编写docker-compose文件 jenkins_…

DAY 13 : 排序

定义 稳定排序和非稳定排序 设文件f(R1……Ri……Rj……Rn)中记录Ri、Rj(i≠j,i、j1……n)的key相等,即KiKj。 若在排序前Ri领先于Rj,排序后Ri仍领先于Rj,则称这种排序是稳定的&…

Linux操作系统入门(三)

_______________________________________________ 一.Linux操作系统的文件结构 相比于Windows操作系统的C,D,E等盘符,Linux操作系统仅有一个"/"符号的根目录. 这其中存在一个显著的不同,Linux操作系统使用的是斜杠"/",而Windows…

【LLM多模态】文生视频评测基准VBench

note VBench的16个维度自动化评估指标代码实践(待完成)16个维度的prompt举例人类偏好标注:计算VBench评估结果与人类偏好之间的相关性、用于DPO微调 文章目录 note一、相关背景二、VBench评测基准概述:论文如何解决这个问题&…

AJAX 入门 day1

目录 1.AJAX 概念和 axios 使用 2.认识 URL 3.URL 查询参数 4.常用请求方法和数据提交 5.HTTP协议-报文 5.1 HTTP 协议-请求报文 5.2 HTTP 协议-响应报文 6.接口文档 7.案例 - 用户登录 8.form-serialize 插件 1.AJAX 概念和 axios 使用 “Aj…

华为OD机试 - 找出作弊的人(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

JNI 详细介绍

一 介绍 java调⽤c,c代码可以通过JNIEnv执行java代码。 安卓NDK 已经对JNI环境进行了集成,我们可以通过android studio来快速搭建一个项目。 二 项目搭建 打开android studio 创建工程,创建工程选择模板Native C 三 模板格式介绍 生成的…

char 的整数存储解释

目录 1.原因讲解 1.有符号类型的char 2.无符号类型的char(0-255) 练习题1. 练习题2. 练习题3. 小心!VS2022不可直接接触,否则!没这个必要,方源面色淡然一把抓住!顷刻炼化! 1.原因讲解 1.有符号类型的…