08-实战项目¶
🎯 学习目标¶
- 完成 5 个综合实战项目
- 掌握从需求分析到工作流设计再到效果优化的完整流程
- 学会将 ComfyUI 部署为 API 服务
- 掌握性能优化技巧
8.1 项目一:AI 头像生成器(人脸+风格化)¶
8.1.1 需求分析¶
目标:上传一张人脸照片,生成多种风格化头像(油画、动漫、赛博朋克、水彩等)
功能需求: - 输入:一张人脸照片 - 处理:保持面部特征,转换艺术风格 - 输出:多种风格的头像图像
技术方案:IP-Adapter(面部参考)+ ControlNet(结构保持)+ 风格提示词
8.1.2 工作流设计¶
┌─────────────────────────────────────────────────────────┐
│ 模型加载模块 │
├─────────────────────────────────────────────────────────┤
│ CheckpointLoaderSimple (SDXL 或真实感模型) │
│ ├── MODEL → IPAdapterApply │
│ ├── CLIP → CLIPTextEncode │
│ └── VAE → VAEDecode │
│ │
│ IPAdapterModelLoader (IP-Adapter Face 模型) │
│ CLIPVisionLoader (CLIP Vision 模型) │
│ ControlNetLoader (Canny / Depth ControlNet) │
├─────────────────────────────────────────────────────────┤
│ 图像处理模块 │
├─────────────────────────────────────────────────────────┤
│ LoadImage (用户上传的人脸照片) │
│ ├── → 预处理器 (CannyEdge / DepthAnything) │
│ │ └── 控制图 → ControlNetApply │
│ └── → IPAdapterApply (面部参考) │
├─────────────────────────────────────────────────────────┤
│ 生成模块 │
├─────────────────────────────────────────────────────────┤
│ CLIPTextEncode (正向): "portrait, oil painting style, │
│ masterpiece, detailed face, warm lighting" │
│ CLIPTextEncode (反向): "ugly, blurry, deformed" │
│ │
│ KSampler (steps:25, cfg:6, dpmpp_2m, karras) │
│ → VAEDecode → FaceDetailer → SaveImage │
└─────────────────────────────────────────────────────────┘
8.1.3 节点配置¶
IP-Adapter 配置:
| 参数 | 值 | 说明 |
|---|---|---|
| weight | 0.7-0.85 | 面部相似度控制 |
| weight_type | style transfer / composition | 权重模式 |
| start_at | 0.0 | 开始应用步数 |
| end_at | 1.0 | 结束应用步数 |
ControlNet 配置:
| 参数 | 值 | 说明 |
|---|---|---|
| strength | 0.5-0.7 | 结构控制强度 |
| start_percent | 0.0 | 开始生效 |
| end_percent | 0.8 | 结束生效(后期留空间给细节) |
8.1.4 参数调优¶
# 风格切换:修改正向提示词即可
油画风格:
"portrait, oil painting on canvas, Renaissance style, rich colors,
dramatic lighting, masterpiece, highly detailed"
动漫风格:
"portrait, anime style, Studio Ghibli, vibrant colors,
clean lines, detailed eyes, cel shading"
赛博朋克风格:
"portrait, cyberpunk style, neon lights, futuristic,
holographic effects, dark atmosphere, sci-fi"
水彩风格:
"portrait, watercolor painting, soft colors, flowing paint,
artistic, delicate brush strokes, paper texture"
8.1.5 效果优化¶
- 使用 FaceDetailer 节点后处理面部细节
- 调节 IP-Adapter weight 平衡相似度和风格化程度
- ControlNet 的 end_percent 设为 0.7-0.8,让后期采样有更多创意空间
- 如果面部变形,提高 ControlNet strength 或增加 Depth 控制
8.2 项目二:产品图生成工作流(电商场景)¶
8.2.1 需求分析¶
目标:将简单的产品白底图放入不同场景中,生成高质量的电商产品展示图
功能需求: - 输入:产品白底图 - 处理:自动抠图、放入场景、添加光影 - 输出:多个场景的产品展示图
8.2.2 工作流设计¶
┌──────────────────────────────────────────────────────────┐
│ 抠图模块 │
├──────────────────────────────────────────────────────────┤
│ LoadImage (产品白底图) │
│ → SAM (Segment Anything) / RMBG 节点 │
│ ├── IMAGE (抠好的产品) │
│ └── MASK (产品遮罩) │
├──────────────────────────────────────────────────────────┤
│ 场景生成模块 │
├──────────────────────────────────────────────────────────┤
│ EmptyLatentImage (目标尺寸,如 1024×1024) │
│ │
│ CLIPTextEncode (正向): │
│ "professional product photography, marble countertop, │
│ soft studio lighting, shallow depth of field, 8K" │
│ │
│ KSampler → VAEDecode → 背景图像 │
├──────────────────────────────────────────────────────────┤
│ 合成模块 │
├──────────────────────────────────────────────────────────┤
│ ImageComposite / ImageBlend │
│ ├── 背景图像 │
│ ├── 产品图像 (缩放+定位) │
│ └── 遮罩 → Inpainting 边缘融合 │
├──────────────────────────────────────────────────────────┤
│ 后处理模块 │
├──────────────────────────────────────────────────────────┤
│ 边缘Inpaint (融合产品与背景交界处) │
│ → 色彩调整 → 锐化 → SaveImage │
└──────────────────────────────────────────────────────────┘
8.2.3 场景模板¶
# 大理石桌面
"product photography on marble surface, studio lighting,
white background gradient, clean, minimalist, 8k"
# 自然场景
"product placed in nature setting, green leaves,
morning light, dew drops, fresh atmosphere, bokeh background"
# 生活场景
"product on wooden table, cozy home interior,
warm afternoon light, lifestyle photography"
# 科技场景
"product floating in dark space, neon accent lights,
futuristic, tech product photography, reflective surface"
8.2.4 批量化处理¶
# 使用 Queue 批量生成多个场景
1. 创建多组提示词(不同场景)
2. 固定产品图和抠图结果
3. 仅修改场景提示词
4. Queue 多次获得不同场景的产品图
# 或使用 batch 参数一次生成多张不同种子的同一场景
EmptyLatentImage → batch_size: 4
💡 提示:产品图合成的关键是光影一致性。确保场景提示词中的光照方向与产品原图的光照方向匹配。
8.3 项目三:AI 漫画生成流水线(多页漫画一致性)¶
8.3.1 需求分析¶
目标:生成一组风格一致、角色一致的漫画页面
核心挑战: - 角色一致性(同一个角色在不同页面看起来一样) - 风格一致性(所有页面保持统一的美术风格) - 分镜控制(不同面板的构图和视角)
8.3.2 工作流设计¶
┌──────────────────────────────────────────────────────────┐
│ 角色一致性模块 │
├──────────────────────────────────────────────────────────┤
│ 基础 Checkpoint: 动漫风格模型 (如 AnythingV5) │
│ 角色 LoRA: 训练好的角色 LoRA(保持角色外观一致) │
│ IP-Adapter: 使用角色参考图增强一致性 │
├──────────────────────────────────────────────────────────┤
│ 分镜控制模块 │
├──────────────────────────────────────────────────────────┤
│ 每个面板单独生成 ×4~6 个面板 │
│ │
│ 面板1: ControlNet (Pose) + 提示词 "close-up face, ..." │
│ 面板2: ControlNet (Depth) + 提示词 "full body, ..." │
│ 面板3: 纯提示词 "landscape, establishing shot, ..." │
│ 面板4: ControlNet (Scribble) + 提示词 "action scene, ..." │
├──────────────────────────────────────────────────────────┤
│ 排版模块 │
├──────────────────────────────────────────────────────────┤
│ ImageCrop + ImageResize (裁剪为面板尺寸) │
│ ImageComposite (拼合到漫画页面模板) │
│ TextOverlay (添加对话气泡和文字) → SaveImage │
└──────────────────────────────────────────────────────────┘
8.3.3 角色一致性策略¶
策略1: 统一种子基础
- 使用固定种子区间(如 1000-1010)
- 相同角色使用相近的种子
策略2: 角色 LoRA
- 为主要角色训练专用 LoRA
- 统一使用相同 strength
策略3: IP-Adapter 角色参考
- 准备一张标准角色参考图
- 每个面板都使用相同参考图
- weight: 0.6-0.8
策略4: 提示词锚定
- 每个面板的提示词都包含固定的角色描述
- 如: "a girl with short blue hair, red eyes, white uniform, ..."
8.3.4 分镜提示词模板¶
# 特写
"close-up portrait, character_name, detailed face,
emotional expression, manga style, screentone"
# 中景
"medium shot, character_name, upper body visible,
dynamic pose, manga panel, clean lineart"
# 全景
"wide shot, character_name, full body,
detailed background, manga style, establishing shot"
# 动作场景
"action scene, character_name, dynamic motion blur,
speed lines, manga panel, dramatic angle"
⚠️ 注意:漫画一致性是 AI 图像生成中的难点之一。即使使用了上述所有策略,仍可能存在细微差异。可以在后期使用图像编辑软件进行微调。
8.4 项目四:室内设计效果图生成¶
8.4.1 需求分析¶
目标:从室内照片或草图生成不同风格的室内设计效果图
功能需求: - 输入:房间照片或线条草图 - 处理:保持空间结构,转换装修风格 - 输出:多种设计风格的效果图
8.4.2 工作流设计¶
┌──────────────────────────────────────────────────────────┐
│ 输入与预处理模块 │
├──────────────────────────────────────────────────────────┤
│ LoadImage (房间原始照片) │
│ ├── → DepthAnythingPreprocessor → 深度图 │
│ ├── → CannyEdgePreprocessor → 边缘图 │
│ └── → SegmentAnythingPreprocessor → 语义分割图 │
├──────────────────────────────────────────────────────────┤
│ ControlNet 控制模块 │
├──────────────────────────────────────────────────────────┤
│ ControlNetApply (Depth) │
│ ├── strength: 0.7 │
│ └── end_percent: 0.9 │
│ │
│ ControlNetApply (Canny) — 可选 │
│ ├── strength: 0.4 │
│ └── end_percent: 0.6 │
│ │
│ 两个 ControlNet 串联 → KSampler.positive │
├──────────────────────────────────────────────────────────┤
│ 风格生成模块 │
├──────────────────────────────────────────────────────────┤
│ CheckpointLoader (真实感模型,如 JuggernautXL) │
│ CLIPTextEncode (正向): 设计风格描述 │
│ │
│ KSampler (steps:30, cfg:6) → VAEDecode │
│ → ImageUpscale (放大到高分辨率) → SaveImage │
└──────────────────────────────────────────────────────────┘
8.4.3 风格提示词¶
# 现代简约
"modern minimalist interior design, living room,
clean lines, neutral colors, natural light,
floor-to-ceiling windows, designer furniture,
architectural photography, 8K, photorealistic"
# 北欧风
"Scandinavian interior design, cozy living room,
light wood floors, white walls, hygge atmosphere,
soft textiles, indoor plants, natural lighting"
# 日式和风
"Japanese interior design, zen style room,
tatami mat, shoji screen, natural wood,
minimal decoration, wabi-sabi aesthetic,
indirect lighting, peaceful atmosphere"
# 工业风
"industrial loft interior, exposed brick walls,
metal pipes, concrete floor, vintage furniture,
Edison bulbs, open space, urban style"
# 新中式
"modern Chinese interior design, dark wood furniture,
calligraphy art, silk cushions, lattice screen,
traditional elements with modern twist,
warm ambient lighting"
8.4.4 多视角合成¶
对于同一空间的不同视角,保持设计一致性:
1. 使用相同的种子和提示词基础
2. 仅修改视角相关描述和 ControlNet 控制图
3. IP-Adapter 使用第一张生成图作为参考
4. 保持 Checkpoint 和 LoRA 配置不变
💡 提示:Depth ControlNet 对室内设计场景特别有效,因为它能很好地保持空间的远近关系和家具位置。
8.5 项目五:AI 视频生成(AnimateDiff + 后处理)¶
8.5.1 需求分析¶
目标:生成一段 2-4 秒的高质量 AI 视频
功能需求: - 输入:文本描述或参考图像 - 处理:生成视频帧 + 帧间一致性 + 后处理 - 输出:平滑的短视频(MP4/GIF)
8.5.2 工作流设计¶
┌──────────────────────────────────────────────────────────┐
│ 模型与运动模块 │
├──────────────────────────────────────────────────────────┤
│ CheckpointLoaderSimple (SD 1.5 动漫/真实模型) │
│ └── MODEL → ADE_AnimateDiffLoaderWithContext │
│ ├── motion_model: v3 运动模型 │
│ ├── motion_scale: 1.0 │
│ ├── context_options: UniformContext │
│ │ ├── context_length: 16 │
│ │ └── context_overlap: 4 │
│ └── MODEL → KSampler │
├──────────────────────────────────────────────────────────┤
│ 采样模块 │
├──────────────────────────────────────────────────────────┤
│ EmptyLatentImage (512×512, batch_size=32 帧) │
│ │
│ KSampler │
│ ├── steps: 25 │
│ ├── cfg: 7.5 │
│ ├── sampler: dpmpp_2m │
│ ├── scheduler: karras │
│ └── denoise: 1.0 │
├──────────────────────────────────────────────────────────┤
│ 后处理与输出模块 │
├──────────────────────────────────────────────────────────┤
│ VAEDecode → 视频帧 │
│ → RIFE 帧插值 (可选,增加帧数使画面更流畅) │
│ → ImageUpscale (可选,放大帧分辨率) │
│ → VHS_VideoCombine │
│ ├── frame_rate: 12 │
│ ├── format: video/mp4 │
│ └── 输出: 最终视频文件 │
└──────────────────────────────────────────────────────────┘
8.5.3 关键节点配置¶
AnimateDiff Context Options:
| 参数 | 说明 | 推荐值 |
|---|---|---|
| context_length | 每次处理的帧数窗口 | 16 |
| context_overlap | 窗口之间的重叠帧数 | 4 |
| context_schedule | 上下文调度策略 | uniform |
VHS_VideoCombine 输出设置:
| 参数 | 说明 | 推荐值 |
|---|---|---|
| frame_rate | 输出帧率 | 8-16 fps |
| loop_count | 循环次数(GIF) | 0 (无限) |
| format | 输出格式 | video/mp4 或 image/gif |
| save_output | 是否保存 | true |
8.5.4 帧插值后处理¶
使用 RIFE 帧插值可以让视频更流畅:
# 原始:16帧 @ 8fps = 2秒
# 2x插值后:32帧 @ 16fps = 2秒(更流畅)
# 4x插值后:64帧 @ 32fps = 2秒(非常流畅)
VHS_LoadVideo / VAEDecode 输出
→ RIFE VFI (Video Frame Interpolation)
├── multiplier: 2 (帧数翻倍)
└── frames → VHS_VideoCombine
8.5.5 效果优化¶
# 提升运动一致性
- 降低 motion_scale 到 0.7-0.9 减少突然运动
- 增加 context_overlap 到 6-8 增加帧间关联
- 使用较高的 steps (25-30)
# 提升画质
- 使用高质量 Checkpoint 模型
- 加 LoRA 增强风格一致性
- 后处理帧插值 + 放大
# 降低显存占用
- 减少 batch_size (帧数 16→8)
- 降低分辨率 (512→384)
- 使用 --lowvram 模式
⚠️ 注意:视频生成的显存需求远高于单图生成。32帧 × 512×512 可能需要 12GB+ 显存。如果显存不足,减少帧数或分辨率。
8.6 ComfyUI 部署为 API 服务¶
8.6.1 原生 API 使用¶
ComfyUI 启动后会在指定端口提供 WebSocket + REST API。
API 端点:
| 端点 | 方法 | 功能 |
|---|---|---|
/prompt | POST | 提交工作流执行 |
/queue | GET | 查看队列状态 |
/history | GET | 查看历史记录 |
/view | GET | 获取生成的图像 |
/upload/image | POST | 上传图像 |
/ws | WebSocket | 实时状态推送 |
8.6.2 API 调用示例¶
import json
import urllib.request
import urllib.parse
COMFYUI_URL = "http://127.0.0.1:8188"
def queue_prompt(workflow_json: dict) -> dict:
"""
向 ComfyUI 提交工作流执行请求
Args:
workflow_json: 工作流的 API 格式 JSON
Returns:
包含 prompt_id 的响应
"""
data = json.dumps({"prompt": workflow_json}).encode("utf-8") # json.dumps将Python对象转为JSON字符串
req = urllib.request.Request(
f"{COMFYUI_URL}/prompt",
data=data,
headers={"Content-Type": "application/json"}
)
response = urllib.request.urlopen(req)
return json.loads(response.read())
def get_image(filename: str, subfolder: str = "", folder_type: str = "output"):
"""
从 ComfyUI 获取生成的图像
Args:
filename: 图像文件名
subfolder: 子目录
folder_type: 目录类型 (output/input/temp)
Returns:
图像二进制数据
"""
params = urllib.parse.urlencode({
"filename": filename,
"subfolder": subfolder,
"type": folder_type
})
req = urllib.request.Request(f"{COMFYUI_URL}/view?{params}")
response = urllib.request.urlopen(req)
return response.read()
# 加载 API 格式的工作流
with open("workflow_api.json", "r") as f: # with自动管理资源,确保文件正确关闭
workflow = json.load(f)
# 修改参数(例如改提示词)
workflow["6"]["inputs"]["text"] = "a beautiful sunset over mountains"
# 提交执行
result = queue_prompt(workflow)
print(f"Prompt ID: {result['prompt_id']}")
8.6.3 WebSocket 实时监控¶
import websocket
import json
import uuid
client_id = str(uuid.uuid4())
def on_message(ws, message):
data = json.loads(message) # json.loads将JSON字符串转为Python对象
if data["type"] == "executing":
node_id = data["data"]["node"]
if node_id is None:
print("执行完成!")
else:
print(f"正在执行节点: {node_id}")
elif data["type"] == "progress":
value = data["data"]["value"]
max_val = data["data"]["max"]
print(f"进度: {value}/{max_val}")
ws = websocket.WebSocketApp(
f"ws://127.0.0.1:8188/ws?clientId={client_id}",
on_message=on_message
)
ws.run_forever()
8.6.4 部署架构¶
┌─────────────┐ HTTP/WS ┌─────────────┐ GPU
│ Web 应用 │ ──────────────→ │ ComfyUI │ ──────→ 图像生成
│ (前端) │ ←────────────── │ API 服务 │
└─────────────┘ 图像/状态 └─────────────┘
# 启动 ComfyUI API 服务
python main.py --listen 0.0.0.0 --port 8188 --disable-auto-launch
# 生产环境建议加反向代理
Nginx → ComfyUI API
💡 提示:API 格式的工作流 JSON 与普通保存的工作流 JSON 不同。通过菜单 Menu → Save (API Format) 导出 API 格式。
8.7 性能优化技巧¶
8.7.1 显存优化¶
| 策略 | 方法 | 效果 |
|---|---|---|
| 低显存模式 | --lowvram 启动参数 | 动态加载/卸载模型到显存 |
| 极低显存 | --novram 启动参数 | 每步都从内存加载,最慢但显存最小 |
| FP16 半精度 | 模型默认使用 FP16 | 显存减半,几乎无质量损失 |
| 分辨率控制 | 适当降低图像尺寸 | 显存与分辨率平方成正比 |
| Tiled 处理 | VAEDecodeTiled 等 | 分块处理大图 |
| 模型卸载 | 不使用的模型会自动卸载 | ComfyUI 默认行为 |
| Attention 优化 | xformers / SDP Attention | 自动启用 |
8.7.2 速度优化¶
| 策略 | 方法 | 说明 |
|---|---|---|
| 减少步数 | 20步通常足够 | 30步以上收益递减 |
| 快速采样器 | euler_a, lcm | 速度更快 |
| LCM / Turbo | 4-8步快速生成 | 速度提升 5-10倍 |
| 高显存模式 | --highvram | 模型常驻显存,避免反复加载 |
| 禁用预览 | 关闭实时预览 | 减少中间步骤的解码开销 |
| 模型缓存 | ComfyUI 自动缓存 | 同一模型复用时无需重新加载 |
| TensorRT | 加速推理 | 需要额外配置 |
8.7.3 工作流优化¶
# 避免不必要的操作
- 移除未使用的节点(静音也会占用)
- 合理设置 batch_size(过大浪费显存)
- 先低分辨率测试参数,确认后再切换高分辨率
# 利用缓存
- 模型加载是最耗时的操作,尽量复用
- 避免在工作流中反复切换不同的 Checkpoint
- 将不同参数的生成放在同一个工作流中
# 并行处理
- 独立的工作流分支可以并行执行
- 利用 batch_size 一次生成多张图
8.7.4 资源监控¶
# 监控 GPU 使用情况
nvidia-smi -l 1 # 每秒刷新
# 查看显存占用
nvidia-smi --query-gpu=memory.used,memory.total --format=csv -l 1
# Windows 任务管理器
# → 性能 → GPU 查看显存使用率
⚠️ 注意:如果发现显存持续增长不释放,可能是内存泄漏。尝试重启 ComfyUI。某些自定义节点可能存在显存泄漏问题。
综合练习¶
- 头像生成器:搭建完整的 AI 头像生成工作流,用同一张照片生成至少 3 种不同风格
- 产品图工作流:拍摄一个日常物品的白底照片,生成 3 种不同场景的产品展示图
- 漫画生成:使用固定角色 LoRA 或 IP-Adapter,生成 4 个面板的短漫画
- 室内设计:拍摄一张房间照片,使用 ControlNet 生成至少 2 种不同装修风格
- 视频生成:使用 AnimateDiff 生成一段 16-32 帧的短视频
- API 集成:编写一个 Python 脚本,通过 API 向 ComfyUI 提交工作流并获取结果
- 性能测试:对比
--lowvram、默认模式和--highvram的生成速度差异
延伸阅读¶
- ComfyUI API 文档
- IP-Adapter Plus 使用指南
- AnimateDiff Evolved 文档
- Segment Anything 论文
- Real-ESRGAN 超分辨率
- RIFE 帧插值
- ComfyUI 性能优化指南
🎓 课程总结¶
恭喜你完成了 ComfyUI 实战教程的全部内容!回顾学习路径:
| 章节 | 核心内容 |
|---|---|
| 01-平台介绍 | 了解 ComfyUI 的定位与优势 |
| 02-环境搭建 | 安装配置、模型下载 |
| 03-界面与节点 | 掌握基础操作和核心节点 |
| 04-工作流设计 | 四大基础工作流、参数调优、提示词工程 |
| 05-模型加载 | Checkpoint、LoRA、ControlNet、IP-Adapter |
| 06-高级工作流 | Hires Fix、放大、视频、快速生成 |
| 07-自定义节点 | Manager 使用、节点开发入门 |
| 08-实战项目 | 五大项目实战、API 部署、性能优化 |
| 09-FLUX与新一代模型 | FLUX.1、SD3.5、视频生成、显存优化 |
下一步建议:
- 持续关注 ComfyUI 的版本更新和新功能
- 深入学习一到两个垂直领域(如视频生成、3D 生成)
- 积累自己的工作流模板库
- 参与社区分享,贡献自定义节点或工作流
- 探索与其他工具的集成(如 Blender、Unity)
📌 下一章:09-FLUX与新一代模型工作流 —— FLUX.1、SD3.5、视频生成等前沿模型工作流
📌 返回目录:README.md
最后更新日期:2026-02-12 适用版本:ComfyUI实战教程 v2026