前言
个人认为学习 ComfyUI 应该先从理论学起。
与传统绘图工具(如 Photoshop 或 Figma)相比,AI 绘图工具有着显著不同。首先,许多设置和操作在 AI 绘图工具中是非可视化的,这意味着即使你更改了某个配置,界面上也未必会有任何变化,这使得自学变得更加困难,难以像学习 Figma 那样通过自主探索来掌握。其次,AI 绘图工具的结果具有随机性,即使完全按照别人的教程操作,你也可能无法得到相同的结果,这更容易让人产生挫败感。
那有没有什么解决方案呢?
在我看来,学习这种工具的第一步并不是直接学习如何操作,而是应该先掌握与 AI 相关的理论知识。一旦你理解了这些基础知识,就能够明白这些绘图工具上的各种设置及用途,还能举一反三,开发出更多的使用方法。
因此,
目录
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 变得更加轻松。
孜孜以求,方能超越自我。坚持不懈,乃是成功关键。
总结
前言
个人认为学习 ComfyUI 应该先从理论学起。
与传统绘图工具(如 Photoshop 或 Figma)相比,AI 绘图工具有着显著不同。首先,许多设置和操作在 AI 绘图工具中是非可视化的,这意味着即使你更改了某个配置,界面上也未必会有任何变化,这使得自学变得更加困难,难以像学习 Figma 那样通过自主探索来掌握。其次,AI 绘图工具的结果具有随机性,即使完全按照别人的教程操作,你也可能无法得到相同的结果,这更容易让人产生挫败感。
那有没有什么解决方案呢?
在我看来,学习这种工具的第一步并不是直接学习如何操作,而是应该先掌握与 AI 相关的理论知识。一旦你理解了这些基础知识,就能够明白这些绘图工具上的各种设置及用途,还能举一反三,开发出更多的使用方法。
因此,
目录
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 变得更加轻松。
孜孜以求,方能超越自我。坚持不懈,乃是成功关键。