【基础篇】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将生成一张一个女孩在海边享受阳光的图。

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

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

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

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

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

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

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

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

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

  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)。在学习这个概念时,我最大的疑惑是,为什么要在潜空间中进行处理,而不是直接对图像进行降噪?

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

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

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

图片会首先通过一个图像编码器(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)。我们先画个图来解释一下:

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

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

回到 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 变得更加轻松。

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

基础篇:Stable Diffusion 基础原理详述的更多相关文章

  1. Hybrid APP基础篇(四)->JSBridge的原理

    说明 JSBridge实现原理 目录 前言 参考来源 前置技术要求 楔子 原理概述 简介 url scheme介绍 实现流程 实现思路 第一步:设计出一个Native与JS交互的全局桥对象 第二步:J ...

  2. 与你一起学习MS Project——基础篇:Project基础应用

    为了更清晰容易地熟悉掌握Project的基础应用,我们在基础篇中一起来学习掌握在Project中如何做进度计划.资源计划.成本计划以及跟踪项目的执行情况并生成所需的项目报表. 一.进度计划 这里,首先 ...

  3. 【matlab 基础篇 02】基础知识一键扫盲,看完即可无障碍编程(超详细+图文并茂)

    博主快速入门matlab,系统地整理一遍,如何你和我一样是一个新手,那么此文很适合你: 本人能力有限,文中难免有错误和纰漏之处,请大佬们不吝赐教 创作不易,如果本文帮到了您: 请帮忙点个赞

  4. Java基础篇——JVM之GC原理(干货满满)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10697554.html ,多多支持哈! 一.什么是GC? GC是垃圾收集的意思,内存处理是 ...

  5. 网络基础篇之NAT(原理)

    一.NAT的产生 由于网络的飞速发展和网络应用的极速增多,致使IPv4可用地址空间逐渐枯竭.尽管IPv6可以在根本上解决地址枯竭问题,但IPv4发展到IPv6还需要一个过渡,而这便产生了NAT. 二. ...

  6. 基础篇:详解锁原理,volatile+cas、synchronized的底层实现

    目录 1 锁的分类 2 synchronized底层原理 3 Object的wait和notify方法原理 4 jvm对synchronized的优化 5 CAS的底层原理 6 CAS同步操作的问题 ...

  7. python基础篇:Python基础知识,帮助初学者快速入门

    Python是一种高级编程语言,它易于学习和使用,因此成为了许多人的首选编程语言.本文将介绍Python的基础知识,以帮助初学者快速入门. 安装Python 在开始学习Python之前,您需要安装Py ...

  8. 一、基础篇--1.1Java基础-面向对象的特征

    面向对象的特征 封装.继承和多态 https://blog.csdn.net/jianyuerensheng/article/details/51602015 封装: 定义:封装就是将数据或函数等集合 ...

  9. 一、基础篇--1.1Java基础-Session和Cookie的区别【转】

    https://www.cnblogs.com/zlw-xf/p/8001383.html 1:cookie数据存放在客户的浏览器上(客户端),session数据放 @1:cookie不是很安全,别人 ...

  10. 一、基础篇--1.1Java基础-HTTP请求的GET与POST方式的区别【转】

    http://www.cnblogs.com/logsharing/p/8448446.html 转载的这篇文章,很有意思,说的也很全面,学习下,防丢失,备份记录下 GET和POST是HTTP请求的两 ...

随机推荐

  1. ruby rails 批量插入数据,bulk_insert-----Gem包使用

    Gemfile文件里添加 gem 'bulk_insert' #批量插入 命令行执行安装依赖 bundle install 数据源 ["1.180.3.187", 161, 260 ...

  2. JS实现下拉框切换和tab标签切换

    现在商城网页上会有下拉框切换内容,是如何实现的呢,研究了一天,在调整js代码和查找bug.最终完成了自己想要的效果,我没有写CSS样式,只是实现了基本功能,如果对你有所帮助,可以自己写css,使其更加 ...

  3. CSS样式第四篇

    ​针对现在网站的图片过大问题,可以用相应的工具进行压缩,并且可对图片进行切割处理. 1.如果一个页面的图片过大,可以对其切割,代码<img src="1.jpg">&l ...

  4. Git 合并冲突

    目录 文章目录 目录 合并冲突 合并分支 合并最近的两次提交 合并冲突 步骤: git status 找到冲突的文件 将冲突去除 将冲突文件重新加入临时区 git add egis/api/v1/ro ...

  5. Your lock file does not contain a compatible set of packages. Please run composer update.

    执行composer install遇到错误:Your requirements could not be resolved to an installable set of packages. 这是 ...

  6. 【C# mvc5】使用mvc5 +bootstrap+EF6搭建一个权限管理系统的心得体会

    使用mvc5的体会,是 业务代码都可以独立分层,比如搭配多层架构,通过controller控制器传递需要渲染的列表,按钮.接受前端返回的实体模型等.总之我觉得要在前端渲染的数据可以写在controll ...

  7. Java JVM——1.JVM与Java体系结构

    前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题? ✘ 运行着的线上系统突然卡死,系统无法访问,甚至直接OOMM! ✘ 想解决线上JVM GC问题,但却无从下手. ✘ 新项目上线,对各 ...

  8. nginx的11个阶段

    nginx处理请求的11个阶段 阶段 模块 第一阶段 POST_READ realip 第二阶段 SERVER_REWRITE rewrite 第三阶段 FIND_CONFIG 第四阶段 REWRIT ...

  9. gin 使用 jwt

    作用 JWT 的主要作用是方便客戶端與伺服器之間的身份驗證. 使用JWT 可以在不需要每次登入的情況下,在客戶端與伺服器之間安全地傳遞封裝身份信息. 它還可以用於許多其他用途,例如串接多個服務,並將數 ...

  10. NOIP模拟68

    T1 玩水 解题思路 我们称一个点合法当且仅当 \(s_{i-1,j}=s_{i,j-1}\) . 于是如果一个合法点在它的左上或者右下也可以相邻有一个合法点就是一个合法的图. 树状数组维护即可 co ...