ComfyUI基础篇:Stable Diffusion 基础原理详述
赣州/设计爱好者/1年前/111浏览
版权
ComfyUI基础篇: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 有一个整体的认识,然后再详细讲解其中的细节:
- 首先,用户输入的 Prompt 会经过一个称为Text Encoder(文本编码器)的模型,将其编译成词特征向量。这一步生成 77 个等长的向量,每个向量有 768 个维度。可以先简单地理解为「将人类能理解的文本转化为计算机能够识别的数字串」,后面我会详细解释这些向量的作用。
- 接着,这些特征向量会与一张随机图像(布满噪声的图像)一同放入Image Information Creator。此时,计算机会将特征向量和随机图像转换到一个Latent Space(潜空间),并通过特征向量的指导将随机图像“降噪”成一个“中间产物”。尽管这个“中间产物”目前对人类来说是无法理解的“图像”,只是一组数字,但它包含的信息实际上已经描绘了一个女孩在海边享受阳光。
- 最后,这个中间产物会被Image Decoder(图片解码器)解码成一张人眼可以分辨的图片。
总体流程可以简单理解为:用户输入了一段 Prompt 指令,计算机会根据这个指令,在潜空间里将一张随机图降噪成符合指令要求的图片。
整个过程,与其说是 AI 在「生成」图片,不如说是「雕刻」更贴切。就像米开朗基罗在完成大卫雕像后所说的那样:雕像原本就存在于石头中,我只是将多余的部分去掉。
通过上图可以清晰的看出ComfyUI的生图过程。如图所示,ComfyUI生图时会分多次对图片进行「降噪」,这个过程发生在潜空间里,ComfyUI只是将最后一次降噪的结果解码成照片。
Image Information Creator(图像信息生成器)
接着上面所说,我们来详细分析一下降噪这个过程。
首先,整个降噪过程会在一个潜空间(Latent Space)中进行,并经过多步降噪。这些步骤(Steps)可以自己设置,通常步骤越多,图片质量越高,同时生图所需的时间也会更长。当然,这也取决于模型的性能。例如,Stable Diffusion XL Turbo 能在1步内生成图像,耗时不到1秒,并且生成的图片质量相当不错。那这个过程到底是怎么样的呢?如果我们将整个Denoise过程可视化,如下所示:
上图看起来很复杂,但不用害怕,只要懂得基本的加减乘除,我们就能理解每个降噪步骤:
- 首先,在降噪过程中有一个名为 Noise Predictor(噪音预测器)的模型,它的作用是预测随机图中的噪音成分。除了输入随机图像和 Prompt 的词特征向量外,还需要输入当前步骤的序号。在上面的可视化流程中,你可能会看到多个降噪步骤,但实际上程序运行的始终是同一个降噪模型,因此需要将步骤序号告知噪音预测器,以便它了解当前进行到哪一步。
- 接下来,我们先来看蓝色的线条,Noise Predictor 会使用随机图(例如一张 512*512 的图)和 Prompt 的词特征向量来预测出一张噪声图 B。注意,这里不是实际输出的图像,而是一张噪声图。换句话说,Noise Predictor 根据词向量来预测这张随机图中有哪些不需要的噪声。如果用前面雕刻的例子来类比,它输出的是雕像制作中不需要的废料。同时,Noise Predictor 还会使用不包含 Prompt 的词特征向量来预测出另一张噪声图 C(图中的橙色线条)。
注意:如果你想要改变最终生成图像的大小,例如将512*512改为1024*1024,不是通过提示词下达指令修改,而是通过修改随机图的比例或大小。就好比前面举得“雕刻”的例子,用 1 立方米的石头进行雕刻,不管雕刻师技艺有多好,都没法雕刻出一个高 10 米的雕像。它最多只能雕刻一个高 1 米的雕像。
- 接着,降噪步骤会将噪音图 B 和噪音图 C 相减,得到图 D。我们可以用简单的数学来解释这张图的意义。首先,图 B 是通过 Prompt 和随机图预测的噪声,可以简单理解为包含「根据 Prompt 预测的噪声」和「根据随机图预测的噪声」,而图 C 则仅包含「根据随机图预测的噪声」。因此,B 减去 C,就得到「根据 Prompt 预测的噪声」。
- 然后,降噪过程会将噪声图 D 通过乘以一个系数放大,这个系数在 Stable Diffusion 设置中被称为CFG。接着,将放大后的图与噪声图 C 相加,得到图 E。这样做的目的是提高图片生成的准确性,通过增加「根据 Prompt 预测的噪声」的权重来确保生成的图像与 Prompt 更加相关。如果没有这一步,生成的图片可能与 Prompt 的关联度较低。这种方法被称为 Classifier Free Guidance(无分类引导法)。
- 最后,降噪过程会将图 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 解码器。
那使用这个技术有什么益处和弊处呢?
益处:
- 首先,效率得到了极大提升。使用 VAE 后,即使是民用 GPU 也能以相对较快的速度完成降噪运算。同时,模型的训练时间也会显著缩短。
- 此外,潜空间的维度通常远低于原始图像的维度,这意味着它能更高效地表示图像特征。通过在潜空间中进行操作和插值,可以更精细地控制和编辑图像。这使得在生成图像时,可以更好地掌控图像的细节和风格,从而提升生成图像的质量和逼真度。
弊处:
- 编码和还原数据的过程中会导致一些数据丢失。由于潜空间的维度较低,它可能无法完全捕捉原始数据中的所有细节和特征,最终导致还原后的图片显得有些奇怪。
为什么 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" 相关的一些特征和意义:
- 形态特征:向量表示可能会捕捉到 "Cat" 的形态特征,例如它的体型、头部形状、四肢位置等。这些特征有助于区分 "Cat" 与其他动物或物体。
- 视觉特征:向量表示可能包含 "Cat" 的视觉特征,例如颜色、斑纹、眼睛的形状等。这些特征有助于识别 "Cat" 的外观特点。
- 语义含义:向量表示可能包含与 "Cat" 相关的语义信息,例如它是一种宠物、一种独立的动物,以及与人类的亲密关系等。这些含义有助于理解 "Cat" 在人类文化和社会中的角色和意义。
请注意,由于模型在某些方面具有不可解释性,这些向量实际上不一定包含上述特征。我举这些具体的例子主要是为了更好地解释这个概念。
最后,由于在 Stable Diffusion 中只使用了 CLIP 的 Text Encoder 部分,所以在某些产品中,它被称为 CLIP Text Encoder 或 CLIP Text Encode。
为什么在使用 Stable Diffusion 或 Midjourney 时,输入的 Prompt 不需要考虑语法且对大小写不敏感呢?这是因为这些 Prompt 会被 Text Encoder 转换成特征向量。语法和大小写在转换成特征向量后,都会变成 一串数字,这些细节在没有对模型进行特别调整的情况下,影响不大。
总结
感谢你阅读完这篇关于 Stable Diffusion 的基础详细解释。相信我,掌握了这些基础概念后,你会发现学习 ComfyUI 变得更加轻松。
孜孜以求,方能超越自我。坚持不懈,乃是成功关键。
0
Report
声明
收藏
Share
相关推荐
in to comment
Add emoji
喜欢TA的作品吗?喜欢就快来夸夸TA吧!
You may like
相关收藏夹
Log in
推荐Log in and synchronize recommended records
收藏Log in and add to My Favorites
评论Log in and comment your thoughts
分享Share





















































































