ComfyUI 遇上 Z-Image:ComfyUI 工作流
本篇介绍 ComfyUI 的一些基本概念和它的工作流,理解了这些就可以构建自己的【文生图】或者【文生动图】的工作流。
1. 一句话概括 ComfyUI
ComfyUI = Stable Diffusion 的"可视化代码",一切图像生成过程都用节点表示,像乐高一样拼。
它是一个「图形化的 AI 计算编排系统」。
2. ComfyUI 核心概念
以下是掌握 ComfyUI 前必须理解的"核心词汇"。
2.1. Stable Diffusion 是什么
Stable Diffusion(稳定扩散)是一个基于**扩散模型(Diffusion Model)**的开源 AI 图像生成系统,能够根据文字描述生成高质量图像,也可以对现有图像进行风格转换、细节增强等操作。
严格来说,它是一个由好几个模型构成的系统,而非单独的一个模型。
举个例子:
- 输入的提示词(Prompt)“Cat, standing on the castle”,随后会交给一个叫做
Text Encoder的东西,它会将提示词转换为特征向量(你可以简单理解为将文字进行数字化),Text Encoder将会输出 77 个等长的向量,每个向量包含 768 个维度。(你可以理解为数字矩阵) - 上面输出的特征向量会结合一个随机的图片,这个图片可以想象成:老式模拟信号电视机出现的那个雪花图像。这个图随机出现,内容又都是"雪花状"(计算机世界里面就是随机出现的数字),它表达不了任何信息,所以我们称它为
充满信息噪声的图。 - 特征向量和噪声图结合后,被放到
Image Information Creator里面。在这一步,机器会将这些特征向量和随机图先转化到一个Latent Space(潜空间)里,然后根据这些特征向量,将随机图「降噪」为一个「中间产物」。你可以简单理解,此时的「中间产物」是人类看不懂的「图」,是一堆数字,但此时这个中间产物所呈现的信息已经是一只站在城堡上的猫了。 - 最后,这个中间产物会被
Image Decoder(图片解码器)解码成一张真正的图片。
其中,在第 2 步的时候,会做一个去噪的操作:从纯噪声开始,逐步去除噪声,在文本条件的引导下,重建出符合语义的清晰图像,大概的过程像这样:
2.2. workflow(工作流)与 Node(节点)
首先打开 ComfyUI 默认的工作流:密密麻麻的看起来好像很复杂,但理解了它的机制其实也没有那么复杂。
上图中的每个框框就是一个节点(Node),Node 和 Node 之间通过多条线连接起来。这样就会有节点起点和终点,起点就是输入,终点就是输出,最终串联起整个 AI 文生图的工作流(workflow)。
我们生成图片不是按下按钮,而是运行一个 workflow。Workflow 可以保存 / 导出 / 分享。
稍微整理一下,这个工作流就是 Stable Diffusion 包含的三大组件,但是它们在 ComfyUI 里面名字不太一样:
| 节点名称 | Stable Diffusion 名称 | 说明 |
|---|---|---|
| CLIP Text Encode(CLIP文本编码) | Text Encoder | 默认的工作流中有两个节点,一个是正向(positive):就是你要什么,还有一个是负向(negative):就是你不要什么 |
| KSampler(K采样器) | Image Information Creator | 这个对应的就是我们的最核心的模型生成图片的部分,在 ComfyUI 里名字差异比较大,且配置项很多 |
| Empty Latent Image(空Latent图像) | Image Information Creator | 生图过程是在 Latent Space(潜空间)里进行,所以在 ComfyUI 里的这个节点叫 Empty Latent Image。 |
| VAE Decoder | Image Decoder | 整个生成过程都在 Latent Space 进行,该过程全称为 Variational Auto Encoder(变分自编码器)简称 VAE,所以这个在 ComfyUI 里就被称为 VAE Decoder 了。 |
2.3. 节点
一个节点就是一个操作。以"CLIP 文本编码"(CLIP Text Encode)为例:
节点左边是输入,右边是输出。左边的输入是它上一个节点的输出。
每个节点会有一些配置项,这些配置项就是参数(Parameter)。
2.3.1. CheckPoint 加载器(Load CheckPoint)
它是加载模型用的。可以看到它没有输入端,右边有三个输出。
它是整个 Workflow 的起点。
它包含了三个部分:模型(MODEL)、CLIP、VAE。这三部分就是 Stable Diffusion 的三大步骤。
- 模型主结构(MODEL),用于生成潜空间表示。
- 文本编码器(CLIP),用于理解提示词。
- 图像解码器(VAE),用于从潜图还原为图像。
点击左侧的"模型",可以看到现在系统中已经有的模型,现在发现 checkpoints 中是空的。
也就是说,现在系统中还没有 v1-5-pruned-emaonly-fp16.safetensors 这个模型文件。
fp16,这是什么意思?
这个是 half-precision floating point format,即半精度浮点格式。这种格式相比标准的 32 位浮点数,占用的存储空间更小,且运算速度更快。但它生成图片的精度,以及多样性相较完整版会稍微差一些。所以如果你想要更快的得出结果,可以考虑 fp16 版本的模型。
这个模型出图效果差,一般不用来作图。主要用来模型训练、模型融合、出图演示。
到 HuggingFace 上搜索 v1-5:
可以到镜像站手动下载:https://hf-mirror.com/Comfy-Org/stable-diffusion-v1-5-archive/tree/main
cd ~/ComfyUI
# 注意要放到 checkpoints 目录, 地址中 huggingface.co 替换成镜像 hf-mirror.com
wget -O models/checkpoints/v1-5-pruned-emaonly-fp16.safetensors \
"https://hf-mirror.com/Comfy-Org/stable-diffusion-v1-5-archive/resolve/main/v1-5-pruned-emaonly-fp16.safetensors?download=true"
下载完成后,更新模型库,就可以看到它了,不用重启服务:(后面要使用的时候,直接将它拖拽到右面即可)
加载了模型后,就可以生成图片了,你现在可以点击右上角的运行按钮来生成图片了。
2.3.2. CLIP 文本编码(CLIP Text Encode)
CLIP 全称是 Contrastive Language-Image Pre-training,即对比文本图像预训练。
这个节点主要是输入 Prompt。
一般会有两个这样的节点,一个是正向的 Prompt,列出你希望在图片中看到的内容;另一个是负向的 Prompt,列出你不希望在图片中出现的内容。
写 Prompt 的几个原则:
Prompt 并不支持中文,你要输入英文。这个你用翻译软件就能解决。
2.3.3. 空 Latent 图像(Empty Latent Image)
决定最终生成的图片的大小,就需要调整 width(宽)、height(高)这两个值。
而 batch_size 则是设置每次运行时生成的图片数量,比如你将这个设置成了 4,就意味着每次会生成 4 张图。
示例中用的是 stable diffusion v1.5 模型,最优的大小是 512 x 512。
常见的比例有:
1:1(正方形):512x512、768x7683:2(横向):768x5122:3(纵向):512x7684:3(横向):768x5763:4(纵向):576x76816:9(宽屏):912x5129:16(竖屏):512x912
需要注意的是:宽度和高度必须能被 8 整除。
2.3.4. K 采样器(KSampler)
2.3.4.1. 输入
- 模型:连线到加载器节点的模型作为输入。
- 正面条件:连线到
CLIP Text Encode节点。 - 负面条件:连线到
CLIP Text Encode节点。 - Latent 图像:连线到
Empty Latent Image节点。
2.3.4.2. 参数
2.3.4.2.1. seed(种子)
这个是随机种子,它主要用于控制潜空间的初始噪声。如果你想重复生成一模一样的图片,就需要用到这个随机种子。需要注意种子和 Prompt 都要相同,才能生成一模一样的图。
2.3.4.2.2. control_after_generate(生成后控制)
每次生成完图片后,上面的 seed 数字都会变化,而这个配置项则是设置这个变化规则:randomize(随机)、increment(递增 1)、decrement(递减 1)、fixed(固定)。
2.3.4.2.3. step(步数)
采样的步数。一般步数越大,效果越好,但也跟使用的模型和采样器有关。
2.3.4.2.4. cfg
全称 Classifier Free Guidance 无分类器引导。这个值一般设置为 6~8 之间会比较好。CFG=1:几乎忽略提示词,图像缺乏活力。CFG=7-9:平衡遵循提示词与图像质量,适用大多数常规生成任务。
2.3.4.2.5. sampler_name(采样器名称)
配置采样器算法。
2.3.4.2.6. scheduler(调度器)
控制每个步骤中去噪的过程。你可以通过它选择不同的调度算法,有些算法是选择每一步减去相同数量的噪声,有些则是每一步都尽可能去掉更多的噪声。
2.3.4.2.7. denoise(降噪)
表示要增加多少初始噪声,1 表示全部。一般文生图你都可以默认将其设置成 1。
2.3.4.3. 输出
输出潜空间图像交给 VAE 解码 节点。
2.3.5. VAE 解码(VAE Decoder)
它需要 K 采样器的输出 Latent 作为输入,还有模型加载器中的 vae。
2.3.6. 保存图像(Save Image)
这就是最终的结果了。完成图片生成后,对着图片点击右键,会看到「Save Image」的选项,点击此按钮就可以下载生成好的图片。节点里的输入框,则是设置图片名称的前缀。比如默认是 ComfyUI,那就意味着你保存的图片的文件名是 ComfyUI 开头,后面跟着一串数字。
3. 工作流实操
这里将 ComfyUI 的语言设置为了英文,对于有些概念,中文翻译得并不是太好。
开始之前,先清空工作流:
3.1. 将 Empty Latent Image 转换为图片
首先回顾一下 Stable Diffusion 的三个流程:Text Encoder → Image Information Creator → Image Decoder。
- 首先这个需求中不需要提示词,所以不用考虑
Text Encoder节点(ComfyUI 中叫做CLIP Text Encode)。 Image Information Creator节点,ComfyUI 中对应有两个:KSampler和Empty Latent Image节点。需求中就是要将Empty Latent Image转换为图片。所以需要添加Empty Latent Image节点:
Image Decoder,ComfyUI 中对应的是VAE Decoder,所以再添加一个节点。
要解码的就是 Empty Latent Image 节点,所以用线将它们连接起来:
VAE Decode 要工作,就需要有个模型才行,所以加入模型节点,然后与它连线。
最终,VAE Decode 输出为图片,所以添加一个保存图片或者预览图片节点,这里我添加的是预览图片节点:
现在就可以运行了,最终结果就是:
3.2. 工作流模板:Z-Image
ComfyUI 内置了很多模板,可以直接通过这些模板来生成图片:
因为千问模型是支持中文的,所以,提示词直接输入中文:
一位身着红色汉服的年轻中国女子,身上绣有精美的图案。妆容精致,额头有红色的花朵图案。高高的发髻,金色的凤凰头饰,红色的花朵和珠子。她手持圆形折扇,身旁是女子、树木和鸟儿的图案。旁边是霓虹灯闪烁的闪电状灯(⚡️),发出明亮的黄色光芒,位于伸出的左手之上。室外夜景柔和,背景是轮廓分明的塔楼(西安大雁塔),远处的色彩斑斓的灯光也变得模糊不清。
然后直接运行,结果: