ComfyUI 遇上 Z-Image:ComfyUI 工作流

本篇介绍 ComfyUI 的一些基本概念和它的工作流,理解了这些就可以构建自己的【文生图】或者【文生动图】的工作流。

ComfyUI工作流节点连接示意图,展示AI图像生成过程中的节点关系

1. 一句话概括 ComfyUI

ComfyUI = Stable Diffusion 的"可视化代码",一切图像生成过程都用节点表示,像乐高一样拼。

它是一个「图形化的 AI 计算编排系统」。

2. ComfyUI 核心概念

以下是掌握 ComfyUI 前必须理解的"核心词汇"。

2.1. Stable Diffusion 是什么

Stable Diffusion(稳定扩散)是一个基于**扩散模型(Diffusion Model)**的开源 AI 图像生成系统,能够根据文字描述生成高质量图像,也可以对现有图像进行风格转换、细节增强等操作。

严格来说,它是一个由好几个模型构成的系统,而非单独的一个模型。

举个例子:

Stable Diffusion工作原理流程图,展示从文本编码到图像解码的完整过程

  1. 输入的提示词(Prompt)“Cat, standing on the castle”,随后会交给一个叫做 Text Encoder 的东西,它会将提示词转换为特征向量(你可以简单理解为将文字进行数字化),Text Encoder 将会输出 77 个等长的向量,每个向量包含 768 个维度。(你可以理解为数字矩阵)
  2. 上面输出的特征向量会结合一个随机的图片,这个图片可以想象成:老式模拟信号电视机出现的那个雪花图像。这个图随机出现,内容又都是"雪花状"(计算机世界里面就是随机出现的数字),它表达不了任何信息,所以我们称它为充满信息噪声的图。
  3. 特征向量和噪声图结合后,被放到 Image Information Creator 里面。在这一步,机器会将这些特征向量和随机图先转化到一个 Latent Space(潜空间) 里,然后根据这些特征向量,将随机图「降噪」为一个「中间产物」。你可以简单理解,此时的「中间产物」是人类看不懂的「图」,是一堆数字,但此时这个中间产物所呈现的信息已经是一只站在城堡上的猫了。
  4. 最后,这个中间产物会被 Image Decoder(图片解码器)解码成一张真正的图片。

Stable Diffusion三个主要步骤示意图,展示文本编码、潜空间处理和图像解码过程

其中,在第 2 步的时候,会做一个去噪的操作:从纯噪声开始,逐步去除噪声,在文本条件的引导下,重建出符合语义的清晰图像,大概的过程像这样:

Stable Diffusion去噪过程示意图,展示从纯噪声到清晰图像的逐步转换过程

2.2. workflow(工作流)与 Node(节点)

首先打开 ComfyUI 默认的工作流:密密麻麻的看起来好像很复杂,但理解了它的机制其实也没有那么复杂。

ComfyUI默认工作流节点图,展示各种节点之间的连接关系

上图中的每个框框就是一个节点(Node),Node 和 Node 之间通过多条线连接起来。这样就会有节点起点和终点,起点就是输入,终点就是输出,最终串联起整个 AI 文生图的工作流(workflow)。

我们生成图片不是按下按钮,而是运行一个 workflow。Workflow 可以保存 / 导出 / 分享。

稍微整理一下,这个工作流就是 Stable Diffusion 包含的三大组件,但是它们在 ComfyUI 里面名字不太一样:

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)为例:

CLIP文本编码节点示意图,展示节点的输入输出和参数配置

节点左边是输入,右边是输出。左边的输入是它上一个节点的输出。

每个节点会有一些配置项,这些配置项就是参数(Parameter)。

2.3.1. CheckPoint 加载器(Load CheckPoint)

它是加载模型用的。可以看到它没有输入端,右边有三个输出。

它是整个 Workflow 的起点。

CheckPoint加载器节点示意图,展示模型加载器的三个输出端口

它包含了三个部分:模型(MODEL)、CLIP、VAE。这三部分就是 Stable Diffusion 的三大步骤。

  • 模型主结构(MODEL),用于生成潜空间表示。
  • 文本编码器(CLIP),用于理解提示词。
  • 图像解码器(VAE),用于从潜图还原为图像。

点击左侧的"模型",可以看到现在系统中已经有的模型,现在发现 checkpoints 中是空的。

也就是说,现在系统中还没有 v1-5-pruned-emaonly-fp16.safetensors 这个模型文件。

fp16,这是什么意思?
这个是 half-precision floating point format,即半精度浮点格式。这种格式相比标准的 32 位浮点数,占用的存储空间更小,且运算速度更快。但它生成图片的精度,以及多样性相较完整版会稍微差一些。所以如果你想要更快的得出结果,可以考虑 fp16 版本的模型。
这个模型出图效果差,一般不用来作图。主要用来模型训练、模型融合、出图演示。

HuggingFace模型搜索示意图,展示在HuggingFace网站上搜索v1-5模型的过程

到 HuggingFace 上搜索 v1-5

HuggingFace模型搜索结果示意图,展示v1-5模型的搜索结果列表

HuggingFace模型下载页面示意图,展示v1-5-pruned-emaonly-fp16模型的下载界面

可以到镜像站手动下载: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"

下载完成后,更新模型库,就可以看到它了,不用重启服务:(后面要使用的时候,直接将它拖拽到右面即可)

ComfyUI模型加载完成后显示示意图,展示模型已成功加载到checkpoints列表中

加载了模型后,就可以生成图片了,你现在可以点击右上角的运行按钮来生成图片了。

ComfyUI运行按钮位置示意图,展示右上角的队列提示和运行按钮

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、768x768
  • 3:2(横向):768x512
  • 2:3(纵向):512x768
  • 4:3(横向):768x576
  • 3:4(纵向):576x768
  • 16:9(宽屏):912x512
  • 9:16(竖屏):512x912

需要注意的是:宽度和高度必须能被 8 整除。

空Latent图像节点参数设置示意图,展示宽度、高度和批量大小等参数配置

2.3.4. K 采样器(KSampler)

K采样器节点参数设置示意图,展示种子、步数、CFG等参数配置选项

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)

VAE解码节点参数设置示意图,展示VAE解码器的输入输出端口

它需要 K 采样器的输出 Latent 作为输入,还有模型加载器中的 vae

2.3.6. 保存图像(Save Image)

这就是最终的结果了。完成图片生成后,对着图片点击右键,会看到「Save Image」的选项,点击此按钮就可以下载生成好的图片。节点里的输入框,则是设置图片名称的前缀。比如默认是 ComfyUI,那就意味着你保存的图片的文件名是 ComfyUI 开头,后面跟着一串数字。

保存图像节点参数设置示意图,展示文件名前缀设置选项

3. 工作流实操

这里将 ComfyUI 的语言设置为了英文,对于有些概念,中文翻译得并不是太好。

开始之前,先清空工作流:

ComfyUI清空工作流操作示意图,展示如何清空当前工作流节点

3.1. 将 Empty Latent Image 转换为图片

首先回顾一下 Stable Diffusion 的三个流程:Text EncoderImage Information CreatorImage Decoder

  • 首先这个需求中不需要提示词,所以不用考虑 Text Encoder 节点(ComfyUI 中叫做 CLIP Text Encode)。
  • Image Information Creator 节点,ComfyUI 中对应有两个:KSamplerEmpty Latent Image 节点。需求中就是要将 Empty Latent Image 转换为图片。所以需要添加 Empty Latent Image 节点:

添加Empty Latent Image节点示意图,展示在节点菜单中选择Empty Latent Image节点

  • Image Decoder,ComfyUI 中对应的是 VAE Decoder,所以再添加一个节点。

添加VAE Decoder节点示意图,展示在节点菜单中选择VAE Decoder节点

要解码的就是 Empty Latent Image 节点,所以用线将它们连接起来:

连接Empty Latent Image和VAE Decoder节点示意图,展示两个节点之间的连线操作

VAE Decode 要工作,就需要有个模型才行,所以加入模型节点,然后与它连线。

添加模型节点并连接到VAE Decoder示意图,展示CheckPoint加载器与VAE Decoder的连接

完整的Empty Latent Image转图片工作流示意图,展示所有节点连接完成后的工作流

添加预览图片节点示意图,展示在节点菜单中选择预览图片节点

最终,VAE Decode 输出为图片,所以添加一个保存图片或者预览图片节点,这里我添加的是预览图片节点:

完成所有节点连接的工作流示意图,展示预览图片节点与VAE Decoder的连接

最终完整的工作流示意图,展示Empty Latent Image转换为图片的完整工作流

现在就可以运行了,最终结果就是:

Empty Latent Image转换结果示意图,展示生成的纯色噪声图像

3.2. 工作流模板:Z-Image

ComfyUI 内置了很多模板,可以直接通过这些模板来生成图片:

ComfyUI内置模板选择示意图

选择Z-Image模板示意图

因为千问模型是支持中文的,所以,提示词直接输入中文:

一位身着红色汉服的年轻中国女子,身上绣有精美的图案。妆容精致,额头有红色的花朵图案。高高的发髻,金色的凤凰头饰,红色的花朵和珠子。她手持圆形折扇,身旁是女子、树木和鸟儿的图案。旁边是霓虹灯闪烁的闪电状灯(⚡️),发出明亮的黄色光芒,位于伸出的左手之上。室外夜景柔和,背景是轮廓分明的塔楼(西安大雁塔),远处的色彩斑斓的灯光也变得模糊不清。

然后直接运行,结果:

使用Z-Image模板生成的汉服女子图像