ComfyUI AI绘图工作流完全教程
🎨 适用人群:AI绘画爱好者、设计师、摄影师、内容创作者 ⏱️ 预计学习时间:6-8小时 📋 前置要求:基本的电脑操作能力,了解Stable Diffusion基础概念 💻 硬件要求:NVIDIA GPU,建议8GB+显存(最低4GB可用低显存模式)
📑 目录
- ComfyUI概述与优势对比
- 安装部署
- 界面详解与基本操作
- 节点系统核心概念
- 文生图 Text-to-Image 工作流
- 图生图 Image-to-Image 工作流
- ControlNet 精确控制
- IP-Adapter 风格迁移
- LoRA 模型加载与融合
- 图像修复 Inpainting
- AnimateDiff 视频生成
- 自定义节点开发
- 工作流导入导出与共享
- 性能优化与显存管理
- 常见问题排查
- 实战项目:完整AI绘图工作流搭建
1. ComfyUI概述与优势对比
1.1 什么是ComfyUI
ComfyUI 是一个基于节点式工作流的 Stable Diffusion 图形界面工具,由 Comfyanonymous 于2023年开发。与传统的 WebUI 不同,ComfyUI 将 AI 绘图的每个步骤(加载模型、编码提示词、采样、解码等)拆解为独立的节点(Node),用户通过连线将节点组合成完整的工作流。
1.2 ComfyUI vs 其他工具
| 特性 | ComfyUI | Automatic1111 WebUI | Fooocus |
|---|---|---|---|
| 界面类型 | 节点式/图形化 | 传统表单式 | 简化表单式 |
| 灵活性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| 学习曲线 | 较陡峭 | 中等 | 简单 |
| 工作流复用 | 原生支持JSON导出 | 依赖插件 | 不支持 |
| 显存占用 | 较低(智能调度) | 中等 | 中等 |
| 扩展性 | 极强(自定义节点) | 强(插件系统) | 有限 |
| 批量处理 | 原生支持 | 需要脚本 | 有限 |
| 版本控制 | 工作流即代码 | 困难 | 不支持 |
| 社区生态 | 活跃且快速增长 | 成熟稳定 | 较新 |
1.3 选择ComfyUI的理由
- 可视化工作流:一目了然地看到数据如何在各节点间流动
- 极致灵活性:任何工作流都可以通过节点组合实现
- 高性能:智能的显存管理和批处理优化
- 可复现:工作流导出为JSON,完美版本控制
- 社区丰富:数千个自定义节点扩展功能
- 持续更新:紧跟最新的AI模型和技术
2. 安装部署
2.1 Windows 安装
方法1:一键安装包(推荐新手)
# 1. 从GitHub下载最新发布版本
# 访问:https://github.com/comfyanonymous/ComfyUI/releases
# 下载 ComfyUI_windows_portable.zip
# 2. 解压到无中文的路径
# 例如:D:\ComfyUI
# 3. 双击运行
# 运行 run_nvidia_gpu.bat(NVIDIA显卡)
# 或 run_cpu.bat(无独立显卡)
# 4. 浏览器自动打开 http://127.0.0.1:8188
方法2:手动安装(推荐有经验的用户)
# 1. 确保已安装Python 3.10+和Git
python --version # 应显示 3.10.x 或更高
git --version
# 2. 克隆仓库
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI
# 3. 创建虚拟环境
python -m venv venv
venv\Scripts\activate
# 4. 安装PyTorch(根据你的CUDA版本选择)
# CUDA 11.8
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# CUDA 12.1
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# 5. 安装依赖
pip install -r requirements.txt
# 6. 启动
python main.py
2.2 Linux 安装
# 1. 安装系统依赖(Ubuntu/Debian)
sudo apt update
sudo apt install python3 python3-pip python3-venv git
# 2. 克隆仓库
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI
# 3. 创建虚拟环境
python3 -m venv venv
source venv/bin/activate
# 4. 安装PyTorch
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# 5. 安装依赖
pip install -r requirements.txt
# 6. 启动(支持自定义参数)
python main.py --listen 0.0.0.0 --port 8188
# 常用启动参数:
# --listen 0.0.0.0 允许外部访问
# --port 8188 指定端口
# --lowvram 低显存模式(4-6GB)
# --cpu 使用CPU运行(慢但可用)
# --preview-method auto 启用预览
2.3 Docker 部署
# 1. 拉取官方Docker镜像
docker pull ghcr.io/ai-dock/comfyui:latest
# 2. 运行容器(NVIDIA GPU)
docker run -d \
--name comfyui \
--gpus all \
-p 8188:8188 \
-v /path/to/models:/workspace/ComfyUI/models \
-v /path/to/output:/workspace/ComfyUI/output \
-v /path/to/custom_nodes:/workspace/ComfyUI/custom_nodes \
ghcr.io/ai-dock/comfyui:latest
# 3. 访问 http://localhost:8188
# 使用docker-compose(推荐)
# docker-compose.yml
version: '3.8'
services:
comfyui:
image: ghcr.io/ai-dock/comfyui:latest
ports:
- "8188:8188"
volumes:
- ./models:/workspace/ComfyUI/models
- ./output:/workspace/ComfyUI/output
- ./custom_nodes:/workspace/ComfyUI/custom_nodes
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
restart: unless-stopped
2.4 模型文件放置
ComfyUI/
├── models/
│ ├── checkpoints/ # 主模型(SD1.5、SDXL等.safetensors文件)
│ ├── loras/ # LoRA模型
│ ├── vae/ # VAE模型
│ ├── controlnet/ # ControlNet模型
│ ├── clip/ # CLIP模型
│ ├── clip_vision/ # CLIP Vision模型(用于IP-Adapter)
│ ├── upscale_models/ # 超分辨率模型
│ ├── animatediff/ # AnimateDiff运动模块
│ ├── ipadapter/ # IP-Adapter模型
│ └── embeddings/ # Textual Inversion嵌入
模型下载推荐来源:
- Civitai - 最大的SD模型社区
- HuggingFace - 官方模型托管
- HuggingFace镜像站 - 国内加速下载
3. 界面详解与基本操作
3.1 主界面布局
┌─────────────────────────────────────────────────┐
│ 菜单栏:Queue | Save | Load | Manager | Help │
├─────────────────────────────────────────────────┤
│ │
│ 工 作 流 画 布 区 域 │
│ (在这里拖拽、连接节点) │
│ │
│ ┌──────┐ ┌──────┐ │
│ │节点A │───────→│节点B │ │
│ └──────┘ └──────┘ │
│ │
├─────────────────────────────────────────────────┤
│ 右键菜单(添加节点) | 底部状态栏 │
└─────────────────────────────────────────────────┘
3.2 基本操作速查
| 操作 | 方式 |
|---|---|
| 添加节点 | 右键画布 → 选择节点类别 → 选择具体节点 |
| 连接节点 | 从输出端口(右侧)拖拽到输入端口(左侧) |
| 删除节点/连线 | 选中后按 Delete 或 Backspace |
| 移动画布 | 按住鼠标中键/右键拖拽 |
| 缩放 | 滚轮滚动 |
| 多选 | 按住 Ctrl 点击节点,或拖拽框选 |
| 复制节点 | Ctrl+C → Ctrl+V |
| 撤销 | Ctrl+Z |
| 重做 | Ctrl+Y |
| 执行工作流 | 点击右侧 Queue Prompt 按钮 |
| 保存工作流 | Ctrl+S 或菜单 Save |
| 加载工作流 | Ctrl+O 或拖拽JSON文件到画布 |
3.3 节点颜色与类型
ComfyUI 使用颜色编码区分不同的数据类型:
| 颜色 | 数据类型 | 说明 |
|---|---|---|
| 🟣 紫色 | MODEL | 模型数据(Checkpoint、LoRA等) |
| 🟡 黄色 | CLIP | 文本编码器 |
| 🟠 橙色 | CONDITIONING | 条件数据(提示词编码后的结果) |
| 🔴 红色 | LATENT | 潜空间数据 |
| 🔵 蓝色 | IMAGE | 图像数据 |
| 🟢 绿色 | VAE | VAE编解码器 |
| ⚪ 白色 | INT/FLOAT/STRING | 基础数据类型 |
4. 节点系统核心概念
4.1 节点的结构
每个节点由三部分组成:
┌─────────────────────────────────┐
│ 节点标题 │
├─────────────────────────────────┤
│ 输入端口(●) │ 参数/设置 │ 输出端口(●)
│ │ │
│ ● model │ [slider] │ ● MODEL
│ ● clip │ [dropdown] │ ● CLIP
│ ● vae │ [text] │ ● VAE
│ │ │
└─────────────────────────────────┘
- 输入端口(左侧):接收来自其他节点的数据
- 输出端口(右侧):将处理结果传递给下游节点
- 参数控件:可调节的设置(滑块、下拉框、文本框等)
4.2 核心节点详解
# ComfyUI中最常用的节点及其功能:
核心节点 = {
"Load Checkpoint": "加载主模型(SD1.5/SDXL/Flux等)",
"CLIP Text Encode": "将文本提示词编码为条件向量",
"KSampler": "核心采样器,执行扩散去噪过程",
"Empty Latent Image": "创建空白潜空间图像",
"VAE Decode": "将潜空间解码为可见图像",
"Save Image": "保存图像到本地",
"Load Image": "加载本地图像",
"KSampler Advanced": "高级采样器,支持更多参数",
"Upscale Image": "图像超分辨率放大",
"ControlNet Loader": "加载ControlNet模型",
"Apply ControlNet": "应用ControlNet控制",
"Lora Loader": "加载LoRA微调模型",
}
4.3 节点连接规则
# 连接规则:
# 1. 同类型端口才能连接(紫色→紫色,蓝色→蓝色)
# 2. 一个输出端口可以连接多个输入端口(分发)
# 3. 一个输入端口只能接收一个连接(合并需用Merge节点)
# 4. 某些输入是必需的(实线端口),某些是可选的(虚线端口)
# 示例:正确的连接方式
"""
Load Checkpoint
├── MODEL output → KSampler.model 输入
├── CLIP output → CLIP Text Encode (正向).clip 输入
└── CLIP output → CLIP Text Encode (反向).clip 输入
CLIP Text Encode (正向)
└── CONDITIONING output → KSampler.positive 输入
CLIP Text Encode (反向)
└── CONDITIONING output → KSampler.negative 输入
Empty Latent Image
└── LATENT output → KSampler.latent_image 输入
KSampler
└── LATENT output → VAE Decode.samples 输入
VAE Decode
└── IMAGE output → Save Image.images 输入
"""
5. 文生图 Text-to-Image 工作流
5.1 基础文生图工作流
这是最基础也是最重要的工作流,掌握它是学习其他工作流的前提。
节点连接流程:
Load Checkpoint ──┬── MODEL ──→ KSampler (model)
├── CLIP ──→ CLIP Text Encode (正向) ──CONDITIONING──→ KSampler (positive)
├── CLIP ──→ CLIP Text Encode (反向) ──CONDITIONING──→ KSampler (negative)
└── VAE ──→ VAE Decode (vae)
Empty Latent Image ──LATENT──→ KSampler (latent_image)
KSampler ──LATENT──→ VAE Decode (samples)
VAE Decode ──IMAGE──→ Save Image
5.2 各节点参数设置
Load Checkpoint:
ckpt_name: "sd_xl_base_1.0.safetensors" # 选择模型
CLIP Text Encode (正向提示词):
text: "a beautiful sunset over the ocean, golden hour,
detailed clouds, reflections on water, 8k uhd,
professional photography"
CLIP Text Encode (反向提示词):
text: "blurry, low quality, distorted, ugly, watermark,
text, bad anatomy, extra limbs"
Empty Latent Image:
width: 1024 # SDXL推荐1024
height: 1024 # SD1.5推荐512
batch_size: 1 # 一次生成几张
KSampler:
seed: 42 # 随机种子(-1为随机)
steps: 30 # 采样步数(20-40)
cfg: 7.0 # 提示词引导强度(5-12)
sampler_name: "euler" # 采样器
scheduler: "normal" # 调度器
denoise: 1.0 # 去噪强度(文生图用1.0)
Save Image:
filename_prefix: "ComfyUI" # 文件名前缀
5.3 提示词编写技巧
# 正向提示词结构:
"[主体描述], [环境/场景], [风格/媒介], [质量修饰词], [技术参数]"
# 示例:
"a young woman reading a book in a cozy cafe, soft natural lighting,
warm color palette, bokeh background, detailed face and hands,
masterpiece, best quality, ultra detailed, 8k uhd"
# 反向提示词(通用模板):
"worst quality, low quality, normal quality, lowres, blurry,
bad anatomy, bad hands, extra fingers, missing fingers,
watermark, text, signature, jpeg artifacts"
# SDXL风格提示词技巧:
# 使用自然语言描述,而非标签堆砌
"A serene Japanese garden in autumn, with red maple leaves
reflecting in a still pond. A small wooden bridge crosses
the water. The scene is captured in the style of traditional
Japanese watercolor painting."
5.4 采样器选择指南
| 采样器 | 速度 | 质量 | 推荐场景 |
|---|---|---|---|
euler |
⭐⭐⭐⭐⭐ | ⭐⭐⭐ | 快速预览 |
euler_ancestral |
⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 多样性好的结果 |
dpmpp_2m |
⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 通用推荐 |
dpmpp_sde |
⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 高质量细节 |
dpmpp_2m_sde |
⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 细节与速度平衡 |
uni_pc |
⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 快速出图 |
ddim |
⭐⭐⭐⭐ | ⭐⭐⭐ | 确定性结果 |
6. 图生图 Image-to-Image 工作流
6.1 基础图生图工作流
图生图与文生图的区别在于:不使用空白潜空间,而是将参考图像编码为潜空间后作为起点。
Load Image ──IMAGE──→ VAE Encode ──LATENT──→ KSampler
↑
Load Checkpoint ──VAE ──────────────────→ VAE Encode
6.2 关键参数:Denoise强度
# denoise参数决定了对原图的改变程度:
denoise = 0.3 → 轻微修改,保留原图大部分内容(适合风格微调)
denoise = 0.5 → 中等修改,保留原图构图和主要元素
denoise = 0.7 → 较大修改,保留原图大致轮廓
denoise = 1.0 → 完全重绘(等于文生图,忽略原图内容)
# 推荐工作流程:
# 1. 先用 denoise=0.4 预览效果
# 2. 根据需要逐步调整到 0.5-0.7
# 3. 超过0.7基本等于重新生成了
6.3 图生图高级技巧
# 技巧1:ControlNet + 图生图(更精确的控制)
# 在图生图基础上添加ControlNet,可以同时保持原图结构并改变风格
# 技巧2:分区域图生图
# 使用Mask遮罩,只对图像的特定区域进行重绘(见第10节Inpainting)
# 技巧3:多参考图混合
"""
Load Image A ──→ VAE Encode ──→ Latent Composite
↓
Load Image B ──→ VAE Encode ──→ Latent Composite ──→ KSampler
"""
7. ControlNet 精确控制
7.1 ControlNet概述
ControlNet 是一种条件控制技术,允许你通过参考图的特定特征(边缘、姿态、深度等)精确控制生成图像的结构。它是ComfyUI中最强大的控制工具之一。
7.2 安装ControlNet预处理器
# 方法1:通过ComfyUI Manager安装(推荐)
# 在ComfyUI界面中点击 Manager 按钮 → 搜索 "comfyui_controlnet_aux" → 安装
# 方法2:手动安装
cd ComfyUI/custom_nodes
git clone https://github.com/Fannovel16/comfyui_controlnet_aux.git
cd comfyui_controlnet_aux
pip install -r requirements.txt
# 重启ComfyUI
7.3 Canny边缘检测
# 工作流节点连接:
Load Image ──→ Canny Edge Preprocessor ──→ Apply ControlNet
↑
ControlNet Loader ──→ Apply ControlNet ──CONDITIONING──→ KSampler (positive)
# Canny Edge Preprocessor 参数:
low_threshold: 100 # 低阈值(控制细节保留)
high_threshold: 200 # 高阈值(控制边缘检测灵敏度)
# Apply ControlNet 参数:
strength: 0.8 # 控制强度(0-1,越高越严格遵循边缘)
start_percent: 0.0 # 开始应用的步数百分比
end_percent: 1.0 # 结束应用的步数百分比
# 适用场景:建筑、产品、线稿上色
7.4 OpenPose姿态控制
# 工作流节点连接:
Load Image ──→ OpenPose Preprocessor ──→ Apply ControlNet
↑
ControlNet Loader (openpose) ──→ Apply ControlNet ──→ KSampler
# OpenPose Preprocessor 参数:
detect_hand: "enable" # 检测手部姿态
detect_body: "enable" # 检测身体姿态
detect_face: "enable" # 检测面部关键点
# 适用场景:人物姿态控制、舞蹈动作、运动场景
# 技巧:可以使用"Pose Editor"节点直接在ComfyUI中编辑姿态
7.5 Depth深度控制
# 工作流节点连接:
Load Image ──→ Depth Anything Preprocessor ──→ Apply ControlNet
↑
ControlNet Loader (depth) ──→ Apply ControlNet ──→ KSampler
# 适用场景:
# - 保持图像的空间透视关系
# - 室内场景重新装饰
# - 风景照片的风格转换
# Depth Anything vs MiDaS:
# Depth Anything: 更新更准确,推荐使用
# MiDaS: 经典方案,兼容性好
7.6 多ControlNet组合
# 可以同时使用多个ControlNet进行多维度控制:
Load Image A ──→ Canny Preprocessor ──→ Apply ControlNet 1 ──→ Apply ControlNet 2
↑
Load Image B ──→ OpenPose Preprocessor ──→ Apply ControlNet 2 ──→ KSampler (positive)
# 组合建议:
# Canny(边缘) + Depth(深度) = 保持形状和空间关系
# OpenPose(姿态) + Depth(深度) = 保持人物姿态和空间位置
# 注意:多个ControlNet的strength总和建议不超过1.5,否则可能过度约束
8. IP-Adapter 风格迁移
8.1 IP-Adapter概述
IP-Adapter(Image Prompt Adapter)是一种以图生图的控制方式,可以将参考图像的风格、内容或角色特征迁移到生成图像中,而不需要重新训练模型。
8.2 安装与模型准备
# 1. 安装IP-Adapter自定义节点
cd ComfyUI/custom_nodes
git clone https://github.com/cubiq/ComfyUI_IPAdapter_plus.git
# 2. 下载IP-Adapter模型
# 放入 ComfyUI/models/ipadapter/ 目录
# 推荐模型:
# - ip-adapter-plus_sd15.bin (SD1.5)
# - ip-adapter-plus-faceid_sd15.bin (人脸ID保持)
# - ip-adapter_sdxl.bin (SDXL)
# 3. 下载CLIP Vision模型
# 放入 ComfyUI/models/clip_vision/ 目录
# 推荐:CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors
8.3 IP-Adapter风格迁移工作流
Load Image (风格参考) ──→ IPAdapter Advanced
↑
CLIP Vision Loader ──→ IPAdapter Advanced
↑
IPAdapter Loader ──→ IPAdapter Advanced
↓
Load Checkpoint ──MODEL──→ IPAdapter Advanced ──MODEL──→ KSampler
# IPAdapter Advanced 参数:
weight: 0.8 # 风格影响强度(0.5-1.0)
weight_type: "linear" # 权重类型
start_at: 0.0 # 开始应用步数
end_at: 1.0 # 结束应用步数
8.4 IP-Adapter高级用法
# 用法1:角色一致性(FaceID)
"""
使用 ip-adapter-plus-faceid 模型,可以保持生成图像中的人脸
与参考照片高度一致。适合生成同一角色的不同场景。
weight建议:0.7-0.9(过高可能导致面部过度拟合)
"""
# 用法2:风格+内容分离
"""
IPAdapter Batch → 可以输入多张参考图
- 使用 style_reference 图像提供风格
- 使用 content_reference 图像提供内容
通过调节各自的weight来平衡效果
"""
# 用法3:与ControlNet组合
"""
IPAdapter (风格) + ControlNet-Canny (结构)
= 保持参考图的风格,同时遵循线稿的结构
这是商业设计中最常用的组合之一
"""
9. LoRA 模型加载与融合
9.1 LoRA概述
LoRA(Low-Rank Adaptation)是一种轻量级的模型微调技术。LoRA文件通常只有几十MB到几百MB,但可以显著改变模型的生成风格或添加特定概念。
9.2 加载LoRA
# 方法1:使用LoRA Loader节点
Load Checkpoint ──MODEL,CLIP──→ Load LoRA ──MODEL,CLIP──→ KSampler/CLIP Encode
↑
lora_name: "my_style.safetensors"
strength_model: 0.8
strength_clip: 0.8
# 方法2:多个LoRA叠加
Load Checkpoint ──→ Load LoRA 1 ──→ Load LoRA 2 ──→ KSampler
(风格LoRA) (角色LoRA)
# LoRA强度建议:
# strength_model: 影响模型生成效果,0.5-1.0
# strength_clip: 影响提示词理解,通常与model保持一致
# 多LoRA叠加时,各自的strength建议不超过0.7,总和不超过1.5
9.3 LoRA融合
# 使用LoRA Stacker节点实现多LoRA融合
# 工作流:
"""
Load Checkpoint ──MODEL,CLIP──→ LoRA Stacker ──MODEL,CLIP──→ ...
↑
LoRA Stacker输入:
- lora_1: "style_a.safetensors", strength: 0.6
- lora_2: "style_b.safetensors", strength: 0.4
- lora_3: "character.safetensors", strength: 0.8
"""
# 融合策略:
# 1. 风格LoRA + 角色LoRA = 特定角色的特定风格
# 2. 多个风格LoRA混合 = 创造新的混合风格
# 3. 质量增强LoRA + 风格LoRA = 高质量的风格化输出
9.4 触发词(Trigger Words)
# 大多数LoRA需要在提示词中加入特定的触发词才能生效
# 例如:
# LoRA文件:watercolor_style.safetensors
# 触发词:watercolor painting, watercolor style
#
# 正确用法:
# "a beautiful landscape, watercolor painting, soft colors"
#
# 查看触发词的方法:
# 1. 在Civitai的LoRA页面查看说明
# 2. 查看LoRA文件的元数据(ComfyUI中可查看)
# 3. 在LoRA Loader节点的info中查看
10. 图像修复 Inpainting
10.1 基础Inpainting工作流
Inpainting允许你只重绘图像的特定区域,保持其余部分不变。
Load Image ──→ Mask Editor (绘制遮罩)
↓
Load Image ──IMAGE──→ VAE Encode (for Inpainting)
↑ ↓
Load Checkpoint ──VAE──→ VAE Encode ──LATENT──→ KSampler
↑
Mask ──→ KSampler (使用mask参数)
# 工作步骤:
# 1. Load Image加载原始图片
# 2. 右键Load Image节点 → "Open in Mask Editor"
# 3. 用画笔涂抹需要重绘的区域(白色=重绘区域)
# 4. 连接到VAE Encode (for Inpainting)节点
# 5. 设置KSampler的denoise(建议0.7-0.9)
10.2 Inpainting专用模型
# 使用专门的Inpainting模型效果更好
# 推荐模型:
# - sd-v1-5-inpainting.safetensors
# - stable-diffusion-xl-1.0-inpainting-0.1.safetensors
# Inpainting模型与普通模型的区别:
# Inpainting模型在训练时专门学习了如何根据遮罩填充缺失区域
# 效果更自然,边缘过渡更平滑
10.3 Outpainting(外扩绘制)
# Outpainting可以扩展图像的边界
Load Image ──→ Pad Image for Outpainting ──→ VAE Encode (for Inpainting)
↑
left/right/top/bottom: 设置各方向扩展的像素数
# 实现原理:
# 1. 在原图周围添加空白区域
# 2. 创建覆盖空白区域的mask
# 3. 使用Inpainting的方式填充扩展区域
10.4 局部重绘技巧
# 技巧1:精细mask绘制
"""
使用Mask Editor时:
- 调整画笔大小(滚轮)
- 使用橡皮擦修正
- 遮罩边缘稍微扩大几像素,确保过渡自然
"""
# 技巧2:分步重绘
"""
对于复杂场景,分多次重绘不同区域:
第1步:重绘背景(大区域,低denoise)
第2步:重绘主体(中等区域,中denoise)
第3步:修正细节(小区域,高denoise)
"""
# 技巧3:Inpaint + ControlNet
"""
使用ControlNet(如Depth或Canny)约束重绘区域的结构
防止生成的内容与周围环境不协调
"""
11. AnimateDiff 视频生成
11.1 AnimateDiff概述
AnimateDiff是一个将Stable Diffusion扩展到动画/视频生成的运动模块。它可以将静态图像生成为短视频(通常2-4秒,16帧)。
11.2 安装与模型准备
# 1. 安装AnimateDiff自定义节点
cd ComfyUI/custom_nodes
git clone https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved.git
# 2. 下载运动模块
# 放入 ComfyUI/models/animatediff/ 目录
# 推荐模型:
# - mm_sd_v15_v2.safetensors (SD1.5)
# - mm_sdxl_v10_beta.safetensors (SDXL)
# 3. 安装额外依赖
cd ComfyUI-AnimateDiff-Evolved
pip install -r requirements.txt
11.3 基础动画工作流
Load Checkpoint ──MODEL──→ AnimateDiff Loader ──MODEL──→ KSampler
↑
AnimateDiff Model Loader ──→ AnimateDiff Loader
↑
mm_sd_v15_v2.safetensors
# AnimateDiff Loader 参数:
model_name: "mm_sd_v15_v2.safetensors"
beta_schedule: "sqrt_linear (AnimateDiff)"
context_length: 16 # 每次处理的帧数
context_stride: 1 # 帧之间的步长
context_overlap: 4 # 帧之间的重叠
# Empty Latent Image 设置:
width: 512
height: 512
batch_size: 16 # 16帧 = 约2秒动画(8fps)
# KSampler 设置:
steps: 20
cfg: 7.0
sampler_name: "dpmpp_2m_sde"
scheduler: "karras"
11.4 视频保存与导出
# 使用Video Combine节点将帧序列合成为视频
VAE Decode ──IMAGE(s)──→ Video Combine
↑
format: "video/h264-mp4"
fps: 8
filename_prefix: "animation"
# 输出格式选项:
# - video/h264-mp4: MP4格式,兼容性最好
# - image/gif: GIF格式,适合网络分享
# - video/webm: WebM格式,文件更小
11.5 高级动画技巧
# 技巧1:AnimateDiff + ControlNet
"""
使用ControlNet控制动画中每一帧的结构:
- Canny: 保持物体边缘一致
- OpenPose: 控制人物动作
- Depth: 保持空间关系
需要安装:ComfyUI-Advanced-ControlNet
"""
# 技巧2:AnimateDiff + IP-Adapter
"""
使用IP-Adapter保持动画中的角色/风格一致性
特别适合生成同一角色的连续动作序列
"""
# 技巧3:长视频生成
"""
通过调整context参数生成更长的视频:
context_length: 16 (每次16帧)
context_overlap: 4 (重叠4帧)
总帧数可以设为32、48甚至更多
但要注意显存限制
"""
12. 自定义节点开发
12.1 节点开发基础
ComfyUI的自定义节点使用Python编写。每个自定义节点是一个Python模块,定义了节点的输入、输出和处理逻辑。
12.2 最简单的自定义节点
# 文件路径: ComfyUI/custom_nodes/my_first_node/my_node.py
class SimpleTextCombine:
"""一个简单的文本合并节点"""
# 节点类属性
CATEGORY = "My Nodes" # 在菜单中的分类
FUNCTION = "combine" # 调用的方法名
RETURN_TYPES = ("STRING",) # 返回的数据类型
RETURN_NAMES = ("combined_text",) # 返回端口的名称
@classmethod
def INPUT_TYPES(cls):
"""定义节点的输入参数"""
return {
"required": {
"text_a": ("STRING", {"multiline": True, "default": ""}),
"text_b": ("STRING", {"multiline": True, "default": ""}),
"separator": ("STRING", {"default": " | "}),
},
"optional": {
"uppercase": ("BOOLEAN", {"default": False}),
}
}
def combine(self, text_a, text_b, separator, uppercase=False):
"""节点的核心处理逻辑"""
result = f"{text_a}{separator}{text_b}"
if uppercase:
result = result.upper()
return (result,)
# 节点注册
NODE_CLASS_MAPPINGS = {
"SimpleTextCombine": SimpleTextCombine
}
NODE_DISPLAY_NAME_MAPPINGS = {
"SimpleTextCombine": "文本合并器"
}
12.3 带图像处理的自定义节点
# 文件: ComfyUI/custom_nodes/image_utils/image_processor.py
import torch
import numpy as np
from PIL import Image, ImageFilter, ImageEnhance
class ImageStyleTransfer:
"""简易风格迁移节点:将参考图的颜色风格应用到目标图"""
CATEGORY = "My Nodes/Image"
FUNCTION = "transfer_style"
RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("styled_image",)
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"target_image": ("IMAGE",),
"style_strength": ("FLOAT", {
"default": 0.5,
"min": 0.0,
"max": 1.0,
"step": 0.01,
"display": "slider"
}),
},
"optional": {
"reference_image": ("IMAGE",),
"enhance_contrast": ("BOOLEAN", {"default": True}),
}
}
def transfer_style(self, target_image, style_strength,
reference_image=None, enhance_contrast=True):
"""应用风格迁移"""
# ComfyUI中图像格式为 [batch, height, width, channels],值范围 0-1
# 转换为PIL处理
img_tensor = target_image[0] # 取第一张图
img_np = (img_tensor.cpu().numpy() * 255).astype(np.uint8)
img_pil = Image.fromarray(img_np)
# 应用风格化效果
if reference_image is not None:
ref_tensor = reference_image[0]
ref_np = (ref_tensor.cpu().numpy() * 255).astype(np.uint8)
ref_pil = Image.fromarray(ref_np)
# 简化版:匹配颜色直方图
from PIL import ImageOps
img_pil = ImageOps.colorize(
img_pil.convert("L"),
black=ref_pil.getextrema()[0],
white=ref_pil.getextrema()[1]
)
# 增强对比度
if enhance_contrast:
enhancer = ImageEnhance.Contrast(img_pil)
img_pil = enhancer.enhance(1.0 + style_strength * 0.5)
# 混合原图和风格化结果
img_np = np.array(img_pil).astype(np.float32) / 255.0
original_np = img_tensor.cpu().numpy()
blended = original_np * (1 - style_strength) + img_np * style_strength
result = torch.from_numpy(blended).unsqueeze(0)
return (result,)
NODE_CLASS_MAPPINGS = {
"ImageStyleTransfer": ImageStyleTransfer
}
NODE_DISPLAY_NAME_MAPPINGS = {
"ImageStyleTransfer": "图像风格迁移"
}
12.4 自定义节点的目录结构
ComfyUI/custom_nodes/
└── my_custom_nodes/
├── __init__.py # 入口文件,导入节点
├── my_node.py # 节点定义
├── utils.py # 工具函数
└── requirements.txt # 依赖列表(可选)
# __init__.py 内容:
from .my_node import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS"]
12.5 节点开发最佳实践
# 1. 类型安全:使用ComfyUI支持的数据类型
SUPPORTED_TYPES = [
"STRING", "INT", "FLOAT", "BOOLEAN", # 基础类型
"IMAGE", "LATENT", "MODEL", "CLIP", # SD数据类型
"CONDITIONING", "VAE", "MASK", # SD数据类型
]
# 2. 输入验证:在处理前验证输入
def validate_inputs(self, image, strength):
if strength < 0 or strength > 1:
raise ValueError("strength must be between 0 and 1")
if image.shape[-1] != 3:
raise ValueError("image must have 3 channels (RGB)")
# 3. 错误处理:捕获并报告有意义的错误
def process(self, image):
try:
result = self._do_processing(image)
return (result,)
except Exception as e:
print(f"[MyNode] Error: {str(e)}")
raise
# 4. 性能优化:使用torch操作代替循环
# ❌ 慢
for i in range(height):
for j in range(width):
result[i, j] = some_function(image[i, j])
# ✅ 快
result = torch.where(condition, image_a, image_b)
13. 工作流导入导出与共享
13.1 保存工作流
# ComfyUI工作流的本质是一个JSON文件
# 保存方式:
# 1. 菜单 → Save → 保存为 .json 文件
# 2. Ctrl+S 快捷键
# 3. 直接拖拽画布到文件夹(会保存为.json)
# 工作流JSON结构示例(简化版):
workflow = {
"last_node_id": 10,
"last_link_id": 15,
"nodes": [
{
"id": 1,
"type": "Load Checkpoint",
"pos": [100, 100],
"size": [300, 100],
"widgets_values": ["sd_xl_base_1.0.safetensors"]
},
{
"id": 2,
"type": "CLIPTextEncode",
"pos": [500, 100],
"widgets_values": ["a beautiful sunset"]
}
],
"links": [
[1, 1, 1, 2, 1, "CLIP"] # [link_id, from_node, from_slot, to_node, to_slot, type]
]
}
13.2 加载工作流
# 加载方式:
# 1. 菜单 → Load → 选择 .json 文件
# 2. Ctrl+O 快捷键
# 3. 直接将 .json 文件拖拽到ComfyUI画布
# 4. 加载包含工作流元数据的 .png 图片(ComfyUI生成的图片自带工作流信息)
# PNG图片中嵌入工作流:
# ComfyUI生成的每张图片都包含完整的工作流信息
# 直接将图片拖入ComfyUI即可还原完整工作流
13.3 工作流共享平台
# 推荐的共享平台:
platforms = {
"Civitai": {
"url": "https://civitai.com/",
"特点": "最大的AI模型和工作流社区",
"格式": "支持ComfyUI工作流直接上传和预览"
},
"OpenArt": {
"url": "https://openart.ai/workflows",
"特点": "专注ComfyUI工作流分享",
"格式": "工作流模板市场"
},
"ComfyWorkflows": {
"url": "https://comfyworkflows.com/",
"特点": "ComfyUI专属工作流社区",
"格式": "可在线预览和一键导入"
},
"GitHub": {
"url": "各种awesome-comfyui仓库",
"特点": "开源社区,工作流+自定义节点",
"格式": "JSON文件,版本控制友好"
}
}
14. 性能优化与显存管理
14.1 显存占用分析
# 不同配置的显存需求(近似值):
vram_requirements = {
"SD 1.5 (512x512)": {
"推理": "~3GB",
"推荐显存": "4GB+",
},
"SDXL (1024x1024)": {
"推理": "~6GB",
"推荐显存": "8GB+",
},
"SDXL + ControlNet": {
"推理": "~8GB",
"推荐显存": "10GB+",
},
"SDXL + AnimateDiff (16帧)": {
"推理": "~10GB",
"推荐显存": "12GB+",
},
"Flux (1024x1024)": {
"推理": "~12GB",
"推荐显存": "16GB+",
}
}
14.2 低显存优化策略
# 策略1:启动参数优化
python main.py --lowvram # 低显存模式(6-8GB)
python main.py --novram # 极低显存模式(4GB以下)
python main.py --cpu # 纯CPU模式(无GPU限制)
# 策略2:环境变量优化
export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512
export CUDA_VISIBLE_DEVICES=0
# 策略3:工作流内优化
# 3a. 降低分辨率
width, height = 768, 768 # 而不是1024, 1024
# 生成后使用Upscale放大
# 3b. 减少批次大小
batch_size = 1 # 每次只生成1张
# 3c. 使用VAE Tiling(大幅降低VAE解码的显存需求)
# 安装ComfyUI内置的Tiled VAE节点
# 3d. 分步处理
"""
不要一次性加载所有模型:
1. 先加载模型A → 处理 → 释放
2. 再加载模型B → 处理 → 释放
ComfyUI的 --lowvram 模式会自动处理这个逻辑
"""
# 3e. 使用模型量化
"""
对于Flux等大模型,使用FP8或NF4量化版本:
- flux1-dev-fp8.safetensors (约12GB → 约7GB)
- 显存节省约40%,质量损失很小
"""
14.3 生成速度优化
# 1. 选择合适的采样器
"""
快速采样器:
- euler: 最快,20步即可
- uni_pc: 快速且质量不错
- dpmpp_2m: 速度和质量的平衡点
"""
# 2. 合理设置采样步数
"""
SD 1.5: 20-30步
SDXL: 25-35步
Flux: 20-28步
超过40步通常没有明显提升,只会增加时间
"""
# 3. 使用TAESD(Tiny AutoEncoder for SD)
"""
TAESD是一个极小的VAE,编解码速度极快
适合预览阶段使用,正式出图时切换回完整VAE
"""
# 4. 批处理优化
"""
同时生成多张图比逐张生成更高效(利用GPU并行)
batch_size = 4 # 一次生成4张
"""
# 5. 预加载模型
"""
使用Model Preloader节点预加载模型
避免每次执行时的加载延迟
"""
14.4 ComfyUI Manager(必装管理器)
# ComfyUI Manager是最重要的辅助工具
# 安装:
cd ComfyUI/custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Manager.git
# 重启ComfyUI
# 功能:
# 1. 一键安装/更新/卸载自定义节点
# 2. 安装缺失的模型依赖
# 3. 工作流依赖检查
# 4. 节点包管理
# 5. 版本控制和回滚
15. 常见问题排查
15.1 启动问题
# 问题1:CUDA不可用
# 错误信息:RuntimeError: CUDA is not available
# 解决方案:
nvidia-smi # 检查GPU是否被识别
python -c "import torch; print(torch.cuda.is_available())" # 检查PyTorch CUDA支持
# 如果False,重新安装对应CUDA版本的PyTorch
# 问题2:端口被占用
# 错误信息:OSError: [Errno 98] Address already in use
# 解决方案:
python main.py --port 8189 # 使用其他端口
# 问题3:缺少依赖
# 错误信息:ModuleNotFoundError: No module named 'xxx'
# 解决方案:
pip install xxx # 安装缺失的包
# 或通过ComfyUI Manager自动安装
15.2 生成问题
# 问题1:生成全黑/全绿图像
# 原因:VAE不匹配或损坏
# 解决:
# 1. 尝试更换VAE
# 2. 在Load Checkpoint中选择不同的VAE
# 3. 下载推荐的VAE模型
# 问题2:人物面部畸形
# 原因:SD1.5的固有问题,或提示词不准确
# 解决:
# 1. 使用FaceDetailer节点(需安装Impact Pack)
# 2. 使用SDXL模型(面部质量更好)
# 3. 在反向提示词中添加:"deformed face, ugly, bad anatomy"
# 问题3:图像模糊/噪点多
# 原因:采样步数不足或CFG过高
# 解决:
# 1. 增加steps到30+
# 2. 降低cfg到7左右
# 3. 尝试不同的采样器(推荐dpmpp_2m_sde)
# 问题4:显存不足(OOM)
# 错误信息:CUDA out of memory
# 解决:
# 1. 降低分辨率
# 2. 使用--lowvram启动
# 3. 减少batch_size
# 4. 关闭其他占用显存的程序
# 5. 使用FP8量化模型
15.3 自定义节点问题
# 问题1:节点安装后不显示
# 解决:
# 1. 检查custom_nodes目录下是否有对应文件夹
# 2. 重启ComfyUI
# 3. 查看启动日志是否有导入错误
# 问题2:节点报错
# 解决:
# 1. 检查是否安装了节点的requirements.txt中的依赖
# 2. 更新节点到最新版本
# 3. 查看ComfyUI控制台的错误信息
# 问题3:节点冲突
# 解决:
# 1. 逐个禁用最近安装的节点,定位冲突源
# 2. 通过ComfyUI Manager的"Fix"功能修复
16. 实战项目:完整AI绘图工作流搭建
16.1 项目概述
我们将搭建一个完整的人物肖像生成工作流,整合以下技术:
- SDXL基础模型 + 人物LoRA
- ControlNet姿态控制
- IP-Adapter风格参考
- 面部细节增强
- 高清放大
16.2 工作流架构
┌─────────────────────────────────────────────────────────────────┐
│ 完整工作流架构图 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │Load │ │CLIP Text │ │CLIP Text │ │
│ │Checkpoint│───→│Encode │───→│Encode │ │
│ │(SDXL) │ │(正向) │ │(反向) │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────────────────┐ │
│ │Load LoRA │───→│ Apply ControlNet │ │
│ │(人物风格) │ │ (OpenPose) │ │
│ └──────────┘ └──────────┬───────────┘ │
│ │ │
│ ┌──────────┐ ▼ │
│ │IP-Adapter│───→ ┌──────────┐ ┌──────────┐ │
│ │(风格参考) │ │ KSampler │───→│VAE Decode │ │
│ └──────────┘ │ (30步) │ └────┬─────┘ │
│ └──────────┘ │ │
│ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │参考图片 │ │FaceDetail│───→│Upscale │ │
│ │(OpenPose)│ │(面部增强) │ │(4x放大) │ │
│ └──────────┘ └──────────┘ └────┬─────┘ │
│ │ │
│ ▼ │
│ ┌──────────┐ │
│ │Save Image│ │
│ └──────────┘ │
└─────────────────────────────────────────────────────────────────┘
16.3 详细搭建步骤
步骤1:加载基础模型和LoRA
# 节点1:Load Checkpoint
type: "Load Checkpoint"
参数:
ckpt_name: "sd_xl_base_1.0.safetensors"
输出: MODEL, CLIP, VAE
# 节点2:Load LoRA
type: "Load LoRA"
输入: MODEL, CLIP(来自Checkpoint)
参数:
lora_name: "sdxl_portrait_style.safetensors"
strength_model: 0.7
strength_clip: 0.7
输出: MODEL, CLIP(修改后的)
步骤2:提示词编码
# 节点3:CLIP Text Encode (正向)
type: "CLIP Text Encode"
输入: CLIP(来自LoRA)
参数:
text: |
a professional portrait photo of a young woman,
elegant pose, soft studio lighting,
detailed skin texture, sharp focus on eyes,
shallow depth of field, bokeh background,
fashion photography, magazine cover quality,
8k uhd, masterpiece, best quality
# 节点4:CLIP Text Encode (反向)
type: "CLIP Text Encode"
输入: CLIP(来自LoRA)
参数:
text: |
worst quality, low quality, normal quality,
bad anatomy, bad hands, extra fingers,
missing fingers, deformed, ugly, blurry,
watermark, text, logo, cropped
步骤3:ControlNet姿态控制
# 节点5:Load Image (参考姿态)
type: "Load Image"
参数:
image: "reference_pose.png"
# 节点6:OpenPose Preprocessor
type: "DW Preprocessor"(更精确的OpenPose检测器)
输入: IMAGE(来自Load Image)
参数:
detect_hand: "enable"
detect_body: "enable"
detect_face: "enable"
# 节点7:ControlNet Loader
type: "ControlNet Loader"
参数:
control_net_name: "controlnet_openpose_sdxl.safetensors"
# 节点8:Apply ControlNet
type: "Apply ControlNet"
输入:
conditioning: CONDITIONING(来自正向CLIP Encode)
control_net: CONTROL_NET(来自Loader)
image: IMAGE(来自Preprocessor)
参数:
strength: 0.75
start_percent: 0.0
end_percent: 0.9
输出: CONDITIONING(增强后的)
步骤4:IP-Adapter风格参考
# 节点9:Load Image (风格参考)
type: "Load Image"
参数:
image: "style_reference.jpg"
# 节点10:CLIP Vision Loader
type: "CLIP Vision Loader"
参数:
clip_name: "CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors"
# 节点11:IPAdapter Loader
type: "IPAdapter Model Loader"
参数:
ipadapter_file: "ip-adapter-plus_sdxl_vit-h.safetensors"
# 节点12:IPAdapter Advanced
type: "IPAdapter Advanced"
输入:
model: MODEL(来自LoRA)
ipadapter: IPADAPTER
clip_vision: CLIP_VISION
image: IMAGE(风格参考图)
参数:
weight: 0.6
weight_type: "linear"
start_at: 0.0
end_at: 0.8
输出: MODEL(风格化后的)
步骤5:采样生成
# 节点13:Empty Latent Image
type: "Empty Latent Image"
参数:
width: 1024
height: 1024
batch_size: 1
# 节点14:KSampler
type: "KSampler"
输入:
model: MODEL(来自IPAdapter)
positive: CONDITIONING(来自ControlNet)
negative: CONDITIONING(来自反向CLIP Encode)
latent_image: LATENT(来自Empty Latent)
参数:
seed: 12345
steps: 30
cfg: 7.0
sampler_name: "dpmpp_2m_sde"
scheduler: "karras"
denoise: 1.0
# 节点15:VAE Decode
type: "VAE Decode"
输入:
samples: LATENT(来自KSampler)
vae: VAE(来自Checkpoint)
输出: IMAGE
步骤6:面部增强(使用Impact Pack)
# 安装Impact Pack:
# ComfyUI Manager → 搜索 "ComfyUI Impact Pack" → 安装
# 节点16:FaceDetailer
type: "FaceDetailer"
输入:
image: IMAGE(来自VAE Decode)
model: MODEL
positive: CONDITIONING
negative: CONDITIONING
vae: VAE
参数:
guide_size: 384
steps: 20
cfg: 7.0
denoise: 0.4 # 轻微调整面部
步骤7:高清放大
# 节点17:Upscale Model Loader
type: "Upscale Model Loader"
参数:
model_name: "RealESRGAN_x4plus.pth"
# 节点18:Upscale Image (using Model)
type: "Upscale Image (using Model)"
输入:
upscale_model: UPSCALE_MODEL
image: IMAGE(来自FaceDetailer)
# 节点19:Image Scale
type: "Image Scale"
输入: IMAGE(放大后的)
参数:
upscale_method: "lanczos"
width: 2048
height: 2048
步骤8:保存输出
# 节点20:Save Image
type: "Save Image"
输入: IMAGE(来自Image Scale)
参数:
filename_prefix: "portrait_final"
16.4 完整工作流JSON(可直接导入)
将以下JSON保存为 portrait_workflow.json,在ComfyUI中通过 Load 导入即可使用:
{
"nodes": [
{"id": 1, "type": "CheckpointLoaderSimple", "widgets_values": ["sd_xl_base_1.0.safetensors"]},
{"id": 2, "type": "LoraLoader", "widgets_values": ["portrait_style.safetensors", 0.7, 0.7]},
{"id": 3, "type": "CLIPTextEncode", "widgets_values": ["a professional portrait photo..."]},
{"id": 4, "type": "CLIPTextEncode", "widgets_values": ["worst quality, low quality..."]},
{"id": 5, "type": "LoadImage", "widgets_values": ["reference_pose.png"]},
{"id": 6, "type": "DWPreprocessor"},
{"id": 7, "type": "ControlNetLoader", "widgets_values": ["controlnet_openpose_sdxl.safetensors"]},
{"id": 8, "type": "ControlNetApplyAdvanced", "widgets_values": [0.75, 0.0, 0.9]},
{"id": 9, "type": "EmptyLatentImage", "widgets_values": [1024, 1024, 1]},
{"id": 10, "type": "KSampler", "widgets_values": [12345, "randomize", 30, 7.0, "dpmpp_2m_sde", "karras", 1.0]},
{"id": 11, "type": "VAEDecode"},
{"id": 12, "type": "UpscaleModelLoader", "widgets_values": ["RealESRGAN_x4plus.pth"]},
{"id": 13, "type": "ImageUpscaleWithModel"},
{"id": 14, "type": "SaveImage", "widgets_values": ["portrait_final"]}
],
"links": [
[1, 1, 0, 2, 0],
[2, 1, 1, 2, 1],
[3, 2, 0, 10, 0],
[4, 2, 1, 3, 0],
[5, 2, 1, 4, 0],
[6, 3, 0, 8, 1],
[7, 4, 0, 10, 1],
[8, 5, 0, 6, 0],
[9, 6, 0, 8, 3],
[10, 7, 0, 8, 0],
[11, 8, 0, 10, 0],
[12, 9, 0, 10, 2],
[13, 10, 0, 11, 0],
[14, 1, 2, 11, 1],
[15, 11, 0, 13, 1],
[16, 12, 0, 13, 0],
[17, 13, 0, 14, 0]
]
}
16.5 参数调优指南
# 根据效果需求调整参数:
调优指南 = {
"人物更像参考图": {
"IP-Adapter weight": "提高到 0.8",
"ControlNet strength": "提高到 0.85",
},
"风格更明显": {
"LoRA strength": "提高到 0.85",
"IP-Adapter weight": "提高到 0.7",
},
"更多创意自由度": {
"ControlNet strength": "降低到 0.5",
"IP-Adapter weight": "降低到 0.4",
"denoise": "保持 1.0",
},
"更精细的细节": {
"steps": "提高到 40",
"FaceDetailer denoise": "提高到 0.5",
"Upscale": "使用4x-UltraSharp",
},
"更快的生成速度": {
"steps": "降低到 20",
"sampler": "euler",
"跳过FaceDetailer": True,
"Upscale倍率": "2x 代替 4x",
}
}
16.6 项目扩展方向
完成基础工作流后,可以尝试以下扩展:
- 批量生成:添加
Repeat Latent Batch节点,一次生成多张不同种子的图片 - 风格切换:创建多个LoRA加载器,通过Switch节点切换不同风格
- 自动构图:使用
Latent Composite拼接多个生成区域 - 质量评估:添加自定义节点,使用CLIP Score评估生成质量
- Web界面:使用ComfyUI的API接口,构建自定义前端
- 工作流自动化:结合Python脚本,实现批量处理和参数扫描
📝 总结
学习路径建议
入门 → 基础文生图 → 图生图 → ControlNet → IP-Adapter
↓
进阶 → LoRA融合 → Inpainting → AnimateDiff → 自定义节点
↓
精通 → 复杂工作流设计 → 性能优化 → API开发 → 工作流自动化
必装自定义节点清单
| 节点包 | 功能 | 优先级 |
|---|---|---|
| ComfyUI Manager | 节点管理 | ⭐⭐⭐⭐⭐ |
| ComfyUI Impact Pack | FaceDetailer等 | ⭐⭐⭐⭐⭐ |
| ComfyUI_IPAdapter_plus | IP-Adapter支持 | ⭐⭐⭐⭐⭐ |
| comfyui_controlnet_aux | ControlNet预处理器 | ⭐⭐⭐⭐ |
| ComfyUI-AnimateDiff-Evolved | 动画生成 | ⭐⭐⭐ |
| ComfyUI-KJNodes | 实用工具集 | ⭐⭐⭐ |
| ComfyUI-Easy-Use | 简化节点 | ⭐⭐⭐ |
📚 参考资源
- ComfyUI官方仓库:https://github.com/comfyanonymous/ComfyUI
- ComfyUI Manager:https://github.com/ltdrdata/ComfyUI-Manager
- Civitai模型社区:https://civitai.com/
- ComfyUI工作流分享:https://comfyworkflows.com/
- IP-Adapter文档:https://github.com/cubiq/ComfyUI_IPAdapter_plus
本教程最后更新:2024年 | 作者:AI教程团队