ComfyUI 进阶节点¶
为什么要学 ComfyUI 进阶节点¶
ComfyUI 通过节点式工作流提供了最灵活的 Stable Diffusion 操作方式。进阶节点的掌握意味着你能构建复杂的图像生成管线:多模型切换、条件分支、循环处理、批量生成、视频生成等。理解节点系统的工作原理,可以让你创建其他工具无法实现的创作流程,并将工作流保存和分享给他人。
核心概念¶
| 概念 | 白话解释 | 用途 |
|---|---|---|
| Workflow | 工作流 | 节点连线构成的完整处理管线 |
| Node | 节点 | 单个处理步骤 |
| Widget | 控件 | 节点上的参数设置 |
| Link | 连线 | 节点间的数据传递 |
| Custom Node | 自定义节点 | 社区开发的扩展功能 |
| Group | 节点组 | 将多个节点组合管理 |
安装配置¶
基础安装¶
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI
pip install -r requirements.txt
# 启动
python main.py --listen 0.0.0.0 --port 8188
# 低显存
python main.py --lowvram
自定义节点管理器(必装)¶
cd ComfyUI/custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Manager.git
# 重启 ComfyUI 后在界面中使用 Manager 安装其他节点
推荐自定义节点¶
ComfyUI-Manager # 节点管理器
ComfyUI-Impact-Pack # 检测、分割、修复
ComfyUI-Inspire-Pack # 创意工具集
ComfyUI_IPAdapter_plus # IP-Adapter 风格迁移
ComfyUI-AnimateDiff-Evolved # 视频生成
ComfyUI_Comfyroll # 实用工具节点
ComfyUI-KJNodes # 高级流程控制
efficiency-nodes-comfyui # 效率节点
ComfyUI-Advanced-ControlNet # 高级 ControlNet
rgthree-comfy # 便捷工具
快速上手¶
基础工作流¶
基本 txt2img 工作流节点连接:
CheckpointLoader → MODEL/CLIP/VAE
↓
CLIPTextEncode (positive) → CONDITIONING
CLIPTextEncode (negative) → CONDITIONING
↓
EmptyLatentImage → LATENT
↓
KSampler (model, positive, negative, latent) → LATENT
↓
VAEDecode → IMAGE
↓
SaveImage
常用核心节点¶
模型加载:
- CheckpointLoaderSimple: 加载 Checkpoint
- LoraLoader: 加载 LoRA
- ControlNetLoader: 加载 ControlNet
- VAELoader: 加载 VAE
编码:
- CLIPTextEncode: 文本编码
- CLIPVisionEncode: 图像编码
- VAEEncode: 图像→潜空间
- VAEDecode: 潜空间→图像
采样:
- KSampler: 标准采样器
- KSamplerAdvanced: 高级采样(更多参数控制)
- SamplerCustom: 完全自定义采样
图像处理:
- ImageScale: 缩放
- ImageComposite: 合成
- ImageBlend: 混合
- ImageBatch: 批量处理
进阶用法¶
IP-Adapter 风格迁移¶
工作流:
1. IPAdapterModelLoader → 加载 IP-Adapter 模型
2. CLIPVisionLoader → 加载 CLIP Vision
3. LoadImage → 参考风格图片
4. CLIPVisionEncode → 编码参考图片
5. IPAdapterApply → 应用到模型
6. 正常 KSampler 流程
参数调优:
- weight: 0.5-1.0(风格强度)
- noise: 0.0-0.5(增加变化性)
- weight_type: standard/prompt_is_more_important
ControlNet 多条件控制¶
同时使用 OpenPose + Depth:
ControlNetLoader (openpose) → ControlNet Model 1
ControlNetLoader (depth) → ControlNet Model 2
ControlNetApply:
conditioning → positive
control_net → ControlNet Model 1
image → OpenPose 图
strength → 0.8
↓
ControlNetApply:
conditioning → 上一个输出
control_net → ControlNet Model 2
image → Depth 图
strength → 0.5
↓
KSampler
Inpaint 修复工作流¶
1. LoadImage → 原始图像
2. LoadImage → 遮罩(黑白图,白色=修复区域)
3. VAEEncodeForInpaint:
- pixels: 原始图像
- mask: 遮罩
- grow_mask_by: 6 # 遮罩扩展像素
4. KSampler → 采样
5. VAEDecode → 输出
高清放大工作流¶
两阶段放大(Hires Fix):
第一阶段:正常生成 512x512
EmptyLatentImage(512,512) → KSampler → VAEDecode → IMAGE
第二阶段:放大到 1024x1024
ImageScale(2x) → VAEEncode → KSampler(denoise=0.5) → VAEDecode
或使用 Ultimate SD Upscale 节点:
IMAGE → UltimateSDUpscale → 自动切片放大拼接
批量生成与循环¶
# 通过 API 批量生成
import json
import requests
from pathlib import Path
# 加载工作流
workflow = json.loads(Path("workflow.json").read_text())
# 修改提示词批量生成
prompts = ["a cat", "a dog", "a bird", "a fish"]
for prompt in prompts:
# 找到 CLIPTextEncode 节点并修改
for node_id, node in workflow.items():
if node.get("class_type") == "CLIPTextEncode":
if "positive" in str(node.get("_meta", {}).get("title", "")):
node["inputs"]["text"] = prompt
# 提交到 ComfyUI
response = requests.post(
"http://localhost:8188/prompt",
json={"prompt": workflow}
)
视频生成(AnimateDiff)¶
AnimateDiff 工作流:
1. CheckpointLoader → MODEL
2. AnimateDiffLoader:
- model: AnimateDiff motion module
- model_name: v3_adapter_sd15
3. AnimateDiffCombine → 合并为视频
4. 正常 KSampler 流程
5. VideoCombine → 输出 MP4/GIF
关键参数:
- frames: 16-32(帧数)
- fps: 8-12
- motion_scale: 0.5-1.0
API 集成¶
import websocket
import json
import uuid
def queue_prompt(prompt, server="127.0.0.1:8188"):
"""提交工作流到 ComfyUI"""
client_id = str(uuid.uuid4())
# 通过 WebSocket 监控进度
ws = websocket.WebSocket()
ws.connect(f"ws://{server}/ws?clientId={client_id}")
# 提交
response = requests.post(
f"http://{server}/prompt",
json={"prompt": prompt, "client_id": client_id}
)
prompt_id = response.json()["prompt_id"]
# 等待完成
while True:
msg = json.loads(ws.recv())
if msg["type"] == "executing" and msg["data"]["node"] is None:
break
# 获取结果
history = requests.get(f"http://{server}/history/{prompt_id}").json()
return history[prompt_id]["outputs"]
常见问题¶
Q: 工作流导入报错"节点未找到"?¶
通过 ComfyUI-Manager 安装缺失的自定义节点。Manager 可以自动检测工作流需要的节点并一键安装。
Q: 如何分享工作流?¶
- 在界面中 Save 为 JSON
- 或使用
Save (API Format)导出 - 分享 JSON 文件,其他人 Load 即可使用
Q: 与 WebUI 相比的优势?¶
- 节点系统更灵活,可构建任意复杂流程
- 内存管理更高效
- 工作流可复现和分享
- 更适合批量生产和集成
Q: 显存不足怎么办?¶
--lowvram或--novram参数- 减少批量大小
- 使用更小的模型
- 分步骤生成(先小图后放大)
参考资源¶
- GitHub:https://github.com/comfyanonymous/ComfyUI
- 自定义节点列表:https://github.com/WASasquatch/comfyui-plugins
- ComfyUI Manager:https://github.com/ltdrdata/ComfyUI-Manager
- 工作流分享:https://comfyworkflows.com/
- 教程:https://comfyanonymous.github.io/ComfyUI_examples/