基础篇:Stable Diffusion 基础原理详述

news/2024/7/6 14:59:50/文章来源:https://www.cnblogs.com/LIU-QiuXue/p/18284046

【基础篇】Stable Diffusion 基础原理详述

前言

我认为学习 ComfyUI 应该先从理论学起。

与传统绘图工具(如 Photoshop 或 Figma)相比,AI 绘图工具有着显著不同。首先,许多设置和操作在 AI 绘图工具中是非可视化的,这意味着即使你更改了某个配置,界面上也未必会有任何变化,这使得自学变得更加困难,难以像学习 Figma 那样通过自主探索来掌握。其次,AI 绘图工具的结果具有随机性,即使完全按照别人的教程操作,你也可能无法得到相同的结果,这更容易让人产生挫败感。

那有没有什么解决方案呢?

在我看来,学习这种工具的第一步并不是直接学习如何操作,而是应该先掌握与 AI 相关的理论知识。一旦你理解了这些基础知识,就能够明白这些绘图工具上的各种设置及用途,还能举一反三,开发出更多的使用方法。

因此,基础篇教程将从 Stable Diffusion 的基本概念入手。在你掌握了 Stable Diffusion 的基础知识后,我将进一步讲解如何使用 ComfyUI,这样你就能够真正理解其原理和应用。

目录

1.Stable Diffusion 原理概述

2.Image Information Creator(图像信息生成器)

3.Image Decoder(图片解码器)

4.Text Encoder(文本编码器)

5.总结

Stable Diffusion 原理概述

为了便于理解,我将尽量减少涉及数学和公式的部分,并采用类比的方式来帮助你掌握一些概念。因此,可能会出现一些不够严谨的地方。如果你有更好的解释,欢迎在评论区留言,我们一起讨论。

Stable Diffusion并非是一个单独的模型,而是由多个模型组合起来的一个体系。我将用最基本的文生图工作流来解释Stable Diffusion的基本结构和原理。

当我们输入一句提示词(1gril,sea,sky,sun,clothes)之后,Stable Dissusion将生成一张一个女孩在海边享受阳光的图。

IMG_256

实际上,整个生成过程包括三个主要步骤。我会先概述这三个步骤,让大家对 Stable Diffusion 有一个整体的认识,然后再详细讲解其中的细节:

  1. 首先,用户输入的 Prompt 会经过一个称为 Text Encoder(文本编码器)的模型,将其编译成词特征向量。这一步生成 77 个等长的向量,每个向量有 768 个维度。可以先简单地理解为「将人类能理解的文本转化为计算机能够识别的数字串」,后面我会详细解释这些向量的作用。
  2. 接着,这些特征向量会与一张随机图像(布满噪声的图像)一同放入 Image Information Creator。此时,计算机会将特征向量和随机图像转换到一个 Latent Space(潜空间),并通过特征向量的指导将随机图像“降噪”成一个“中间产物”。尽管这个“中间产物”目前对人类来说是无法理解的“图像”,只是一组数字,但它包含的信息实际上已经描绘了一个女孩在海边享受阳光。
  3. 最后,这个中间产物会被 Image Decoder(图片解码器)解码成一张人眼可以分辨的图片。

IMG_257

总体流程可以简单理解为:用户输入了一段 Prompt 指令,计算机会根据这个指令,在潜空间里将一张随机图降噪成符合指令要求的图片。

整个过程,与其说是 AI 在「生成」图片,不如说是「雕刻」更贴切。就像米开朗基罗在完成大卫雕像后所说的那样:雕像原本就存在于石头中,我只是将多余的部分去掉。

IMG_258

通过上图可以清晰的看出ComfyUI的生图过程。如图所示,ComfyUI生图时会分多次对图片进行「降噪」,这个过程发生在潜空间里,ComfyUI只是将最后一次降噪的结果解码成照片。

Image Information Creator(图像信息生成器)

接着上面所说,我们来详细分析一下降噪这个过程。

首先,整个降噪过程会在一个潜空间(Latent Space)中进行,并经过多步降噪。这些步骤(Steps)可以自己设置,通常步骤越多,图片质量越高,同时生图所需的时间也会更长。当然,这也取决于模型的性能。例如,Stable Diffusion XL Turbo 能在1步内生成图像,耗时不到1秒,并且生成的图片质量相当不错。那这个过程到底是怎么样的呢?如果我们将整个Denoise过程可视化,如下所示:

IMG_259

上图看起来很复杂,但不用害怕,只要懂得基本的加减乘除,我们就能理解每个降噪步骤:

IMG_260

  1. 首先,在降噪过程中有一个名为 Noise Predictor(噪音预测器)的模型,它的作用是预测随机图中的噪音成分。除了输入随机图像和 Prompt 的词特征向量外,还需要输入当前步骤的序号。在上面的可视化流程中,你可能会看到多个降噪步骤,但实际上程序运行的始终是同一个降噪模型,因此需要将步骤序号告知噪音预测器,以便它了解当前进行到哪一步。
  2. 接下来,我们先来看蓝色的线条,Noise Predictor 会使用随机图(例如一张 512*512 的图)和 Prompt 的词特征向量来预测出一张噪声图 B。注意,这里不是实际输出的图像,而是一张噪声图。换句话说,Noise Predictor 根据词向量来预测这张随机图中有哪些不需要的噪声。如果用前面雕刻的例子来类比,它输出的是雕像制作中不需要的废料。同时,Noise Predictor 还会使用不包含 Prompt 的词特征向量来预测出另一张噪声图 C(图中的橙色线条)。

注意:如果你想要改变最终生成图像的大小,例如将512*512改为1024*1024,不是通过提示词下达指令修改,而是通过修改随机图的比例或大小。就好比前面举得“雕刻”的例子,用 1 立方米的石头进行雕刻,不管雕刻师技艺有多好,都没法雕刻出一个高 10 米的雕像。它最多只能雕刻一个高 1 米的雕像。

  1. 接着,降噪步骤会将噪音图 B 和噪音图 C 相减,得到图 D。我们可以用简单的数学来解释这张图的意义。首先,图 B 是通过 Prompt 和随机图预测的噪声,可以简单理解为包含「根据 Prompt 预测的噪声」和「根据随机图预测的噪声」,而图 C 则仅包含「根据随机图预测的噪声」。因此,B 减去 C,就得到「根据 Prompt 预测的噪声」。
  2. 然后,降噪过程会将噪声图 D 通过乘以一个系数放大,这个系数在 Stable Diffusion 设置中被称为CFG。接着,将放大后的图与噪声图 C 相加,得到图 E。这样做的目的是提高图片生成的准确性,通过增加「根据 Prompt 预测的噪声」的权重来确保生成的图像与 Prompt 更加相关。如果没有这一步,生成的图片可能与 Prompt 的关联度较低。这种方法被称为 Classifier Free Guidance(无分类引导法)。
  3. 最后,降噪过程会将图 A 减去图 E,得到一张新的图像。这就像之前提到的“雕刻”过程,通过去除不需要的噪声来精炼图像。

如果你使用过 Stable Diffusion 工具,你会注意到 Prompt 输入框有两个,一个是正向的,一个是负向的。那么负向的 Prompt 如何起作用呢?用上面的数学方法来简单解释,当输入负向 Prompt 时,会生成一张噪声图 B2。此时,我们会用正向 Prompt 生成的噪声图 B1 减去 B2,然后再减去 C 得出 D。这意味着最终生成的图片会更加远离 B2,因为去除了更多与 B2 相关的噪声。

Image Decoder(图片解码器)

接下来,我们来讨论一下潜空间(Latent Space)。在学习这个概念时,我最大的疑惑是,为什么要在潜空间中进行处理,而不是直接对图像进行降噪?

要回答这个问题,首先需要理解什么是潜空间。

潜空间是机器学习和深度学习中用于表示数据的低维空间。它通过对原始数据进行编码和降维而生成的一组潜在变量。潜空间的维度通常比原始数据低,因此可以提取出数据中最关键的特征和结构。

虽然看起来很复杂,但简单来说,潜空间将图片编码成一组数字,同时对这些数字进行压缩。让我们通过可视化的方式来看看这个过程:

IMG_261

图片会首先通过一个图像编码器(Image Encoder)被编码成一组数据,并进行压缩。如果从像素的角度来衡量这种数据压缩效果,原始图像可能是 512x512 像素,而压缩后变为 64x64 像素,数据量大幅减少。然后再使用图像解码器(Image Decoder)进行还原。这个编码器和解码器组合的组件被称为变分自编码器(Variational Auto Encoder),简称 VAE。因此,图像解码器在一些产品中也称为 VAE 解码器。

那使用这个技术有什么益处和弊处呢?

益处:

  1. 首先,效率得到了极大提升。使用 VAE 后,即使是民用 GPU 也能以相对较快的速度完成降噪运算。同时,模型的训练时间也会显著缩短。
  2. 此外,潜空间的维度通常远低于原始图像的维度,这意味着它能更高效地表示图像特征。通过在潜空间中进行操作和插值,可以更精细地控制和编辑图像。这使得在生成图像时,可以更好地掌控图像的细节和风格,从而提升生成图像的质量和逼真度。

弊处:

  1. 编码和还原数据的过程中会导致一些数据丢失。由于潜空间的维度较低,它可能无法完全捕捉原始数据中的所有细节和特征,最终导致还原后的图片显得有些奇怪。

为什么 Stable Diffusion 生成的图片中的文字通常看起来很奇怪呢?原因有两方面。一方面,文字的一些 细节特征在这个过程中丢失了。另一方面,在预测噪声时,文字的预测相比图像的预测不那么连贯。例如, 预测猫的特征相对简单,因为猫通常有两个眼睛,眼睛下是鼻子,这些特征是连贯的。而英文单词“Cat”和中文字符“猫”差别很大,且很难预测。例如,中文的笔画大多由横、竖、勾、撇、捺组成,但很难预测撇之后是什么。

Text Encoder(文本编码器)

在最前面的流程中,我提到过,Text Encoder(文本编码器)会将你输入的 Prompt 编译成词特征向量。这一步会生成77个等长的向量,每个向量包含768个维度。那么这些向量具体有什么作用呢?

还有一个更有趣的问题是,当我们在 Prompt 中只输入“Cat”,并没有加入“stripe”这个词,为什么最后生成的猫是有斑点条纹的呢?要回答这个问题,我们需要先理解 Text Encoder 的实现原理。

目前,Stable Diffusion 常用的 Text Encoder 是 OpenAI 开源的 CLIP 模型,全称为对比语言图像预训练(Contrastive Language Image Pre-training)。我们先画个图来解释一下:

IMG_262

首先,CLIP 模型包含一个 Text Encoder,用于将文本转换为特征向量。同时,它还有一个 Image Encoder,将图像也转换成特征向量。如果这两个向量越接近,意味着文本描述与图像内容越匹配;相反,如果向量距离越远,则表明两者的相关性越低。

OpenAI 用 4 亿组图片和文本对对 CLIP 模型进行了训练,最终效果如图所示。当我们输入图片描述时,CLIP 能识别出与描述最接近的图片。例如,第四行描述为“一张斑点猫面部照片”,与第四张图片的相似度最高,达到 0.31,而与第一张书本截图的相似度仅为 0.12。

IMG_263

回到 Stable Diffusion,我们只使用了 CLIP 的 Text Encoder 部分,因为它能够将文本转换为对应的特征向量,并且这些特征向量与现实中的图像存在相关性。

再回到之前提到的两个问题,其实它们互为答案。

为什么当我们输入 "Cat" 时,生成的图像很可能是一只橘猫或斑点猫?这是因为 Text Encoder 将 "Cat" 转换成的 77 个等长向量 Embedding 中包含了与 "Cat" 相关的一些特征和意义:

  1. 形态特征:向量表示可能会捕捉到 "Cat" 的形态特征,例如它的体型、头部形状、四肢位置等。这些特征有助于区分 "Cat" 与其他动物或物体。
  2. 视觉特征:向量表示可能包含 "Cat" 的视觉特征,例如颜色、斑纹、眼睛的形状等。这些特征有助于识别 "Cat" 的外观特点。
  3. 语义含义:向量表示可能包含与 "Cat" 相关的语义信息,例如它是一种宠物、一种独立的动物,以及与人类的亲密关系等。这些含义有助于理解 "Cat" 在人类文化和社会中的角色和意义。

请注意,由于模型在某些方面具有不可解释性,这些向量实际上不一定包含上述特征。我举这些具体的例子主要是为了更好地解释这个概念。

最后,由于在 Stable Diffusion 中只使用了 CLIP 的 Text Encoder 部分,所以在某些产品中,它被称为 CLIP Text Encoder 或 CLIP Text Encode。

为什么在使用 Stable Diffusion 或 Midjourney 时,输入的 Prompt 不需要考虑语法且对大小写不敏感呢?这是因为这些 Prompt 会被 Text Encoder 转换成特征向量。语法和大小写在转换成特征向量后,都会变成 一串数字,这些细节在没有对模型进行特别调整的情况下,影响不大。

总结

感谢你阅读完这篇关于 Stable Diffusion 的基础详细解释。相信我,掌握了这些基础概念后,你会发现学习 ComfyUI 变得更加轻松。

孜孜以求,方能超越自我。坚持不懈,乃是成功关键。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信云开发数据库连接

//.js文件const db = wx.cloud.database()Page({//页面的初始数据data: {dataObj:"" //定义对象dataObj}, //查询数据getData(){db.collection("pro1").where({ //pro1为数据库名author:"张三" …

Camstar里拿到Grid的行数据

两种方法: 1.GridDataMode属性为Geceric的:拿到的数据直接放在datatable里,并且赋值给grid,这里我把拿来的数据放在了一个集合里,测试用的 随便写写 2.GridDataMode属性为ItemList的:这里是用了一个集合去接收datatable的值,再把集合赋值给grid这里和第一种的区别是我没有…

MQTT专题

什么是Mqtt MQTT协议 全称是(Message Queuing Telemetry Transport),即消息队列遥测传输协议。 是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,并且该协议构建于TCP/IP协议之上,我们知道TCP协议本身就具有高可靠性的特点,因此基于其上的MQTT协议同样也…

安装visual studio失败,组策略阻止安装webview2

排查安装和升级问题 - Visual Studio | Microsoft Learn 需要修改注册表 ,将 InstallDefault值改为1注册表路径 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\EdgeUpdate

appium 使用

refer to: python+appium2~inspector工具使用及定位操作元素~_哔哩哔哩_bilibili 1 APPium Inspector 可以查看Android应用的 包名 和activity 打开APP,且处于启动页面 Q1 noReset=True 设置每次APP启动 不重头 初始化环境 怎么实现呢 Q1 那我们现在用的是appium1 还是 appi…

7月11日云技术研讨会 | 车载信息安全全流程实施方案

7月11日,经纬恒润《车载信息安全全流程实施方案》云技术研讨会,与您相聚云端,不见不散! 伴随着汽车的智能网联化发展,网络攻击也逐渐渗透漫延至汽车领域,汽车行业面临着重大的信息安全挑战。此外,UNECE WP.29 R155和ISO/SAE 21434等标准也对汽车的信息安全提出了规…

基于全数字实时仿真的嵌入式DevOps解决方案

​为丰富浙江省信息技术应用创新(以下简称“信创”)产业生态,在全社会各领域形成示范效应,浙江省经信厅联合省密码管理局开展2023年浙江省深化信创典型案例评选工作。经过征集申报、专家评选、名单公示等程序,确定36个应用示范案例和24个典型解决方案。【典型解决方案】 基…

巴图自动化PN转Modbus RTU协议转换网关模块快速配置

巴图自动化推出Profinet转Modbus网关模块BT-MDPN10,实现Modbus和Profinet设备互联互通。配置简便,提高系统智能化和生产效率。工业领域中常用的通讯协议有:Profinet协议,Modbus协议,ModbusTCP协议,Profibus协议,Profibus DP协议,EtherCAT协议,EtherNET协议,CAN,CanO…

springboot+vue前后端分离项目-项目搭建7-服务器上安装部署

1.下载VMware(个人使用版),官网下载,需要先用邮箱注册,下载地址:https://support.broadcom.com/group/ecx/productdownloads?subfamily=VMware%20Workstation%20Pro 2.下载镜像dvd类型的,华为云官网下载,需要先注册,下载地址:https://mirrors.huaweicloud.com/mirro…

linux进程被杀掉日志,Linux进程突然被杀掉(OOM killer),查看系统日志

Linux进程被杀掉(OOM killer),查看系统日志 基本概念: Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉。内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参…

Salesforce开发入门指南:零基础学习宝典!

开发人员将Salesforce组织扩展到声明式配置之外,构建应用程序,进而优化业务运营。Salesforce开发人员通常会使用两种编程语言:Apex和JavaScript。 然而,Salesforce开发不仅仅只包括代码。为了在职业道路上脱颖而出,开发人员还需要了解声明性功能,将组织的设计和性能保持最…

Apache SeaTunnel社区首位学生Committer诞生!

采访对象 | 陈炳烨 采访人&编辑 | Debra Chen Apache SeaTunnel社区第一位学生Committer就此诞生!这位来自西安交通大学软件工程专业的同学从较为简单的文档修改工作,逐步深入到代码层面,到最后独立负责开发模块,为Apache SeaTunnel项目的发展添砖加瓦的同时,他本人也…

VMware vSphere Tanzu部署_13_创建TKC集群

1.登录tanzu集群登录语法为:kubectl vsphere login --server= --vsphere-username --insecure-skip-tls-verify$ kubectl vsphere login --server=192.168.203.194 --vsphere-username administrator@vsphere.local --insecure-skip-tls-verify登录示例jianhua@napp:~$ kubec…

“东数西算”长三角(苏州)算力调度中心正式启用!

近日,“东数西算”长三角(苏州)算力调度中心启用暨智算点亮仪式在苏州吴江区举办,在智算产业园举行了算力调度中心启用、智算点亮和智算合作签约。近日,“东数西算”长三角(苏州)算力调度中心启用暨智算点亮仪式在苏州吴江区举办,在智算产业园举行了算力调度中心启用、…

2024 MWC上海,“翼”彩纷呈!

2024年6月26日,2024世界移动通信大会上海(简称“MWC上海”)盛大开幕。围绕“未来先行”主题,来自全球的产业、技术和社区等各界代表齐聚一堂,共话产业高质量发展。 在“智启云领 向新未来”主题馆内,天翼云展出了“息壤”“云骁”“慧聚”三大智算平台和“天翼AI云电脑”…

Ubuntu20.04中 ORBSLAM3的安装和测试

ORBSLAM3 安装以及测试教程(Ubuntu20.04) 1.前期准备工作 1.1安装相关依赖sudo apt install git cmake gcc g++ mlocate1.2下载ORBSLAM3源码 可以直接通过github下载源码: (https://github.com/UZ-SLAMLab/ORB_SLAM3) 2.安装一些所需的库 2.1 安装Eigen3库 直接通过命令安装 su…

vue3 父组件【属性】传值给子组件【props】接收

父组件文件:parentcomponent.vue 子组件文件:childcomponent.vue传普通值 传动态值 传对象 传数组<!-- 父组件 --> <template><h1>I am ParentComponent</h1><ChildComponent msg="nice"/></template> <script setup>im…

K8S学习教程(二):在 PetaExpress KubeSphere容器平台部署高可用 Redis 集群

前言 Redis 是在开发过程中经常用到的缓存中间件,为了考虑在生产环境中稳定性和高可用,Redis通常采用集群模式的部署方式。 在制定Redis集群的部署策略时,常规部署在虚拟机上的方式配置繁琐并且需要手动重启节点,相较之下,使用 PetaExpress 提供的 Kubernetes(k8s) 服务 进…

火山引擎数据飞轮实践:在电商场景中,如何建设全链路数据血缘?

数据作为新型生产要素,正支撑企业的数智化转型。但企业数字化建设也存在管理成本高、数据产品使用门槛高、数据资产价值不够的问题,其原因在于业务和数据之间没有形成双向良性驱动。DataLeap可以帮助企业实现数据驱动,通过具体业务中的数据消费数据,实现决策科学、行动敏捷…