跳转至

08-实战项目

ComfyUI实战项目流程图

🎯 学习目标

  • 完成 5 个综合实战项目
  • 掌握从需求分析到工作流设计再到效果优化的完整流程
  • 学会将 ComfyUI 部署为 API 服务
  • 掌握性能优化技巧

8.1 项目一:AI 头像生成器(人脸+风格化)

8.1.1 需求分析

目标:上传一张人脸照片,生成多种风格化头像(油画、动漫、赛博朋克、水彩等)

功能需求: - 输入:一张人脸照片 - 处理:保持面部特征,转换艺术风格 - 输出:多种风格的头像图像

技术方案:IP-Adapter(面部参考)+ ControlNet(结构保持)+ 风格提示词

8.1.2 工作流设计

Text Only
┌─────────────────────────────────────────────────────────┐
│               模型加载模块                                 │
├─────────────────────────────────────────────────────────┤
│ 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 参数调优

Text Only
# 风格切换:修改正向提示词即可

油画风格:
    "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 工作流设计

Text Only
┌──────────────────────────────────────────────────────────┐
│               抠图模块                                     │
├──────────────────────────────────────────────────────────┤
│ 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 场景模板

Text Only
# 大理石桌面
"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 批量化处理

Text Only
# 使用 Queue 批量生成多个场景
1. 创建多组提示词(不同场景)
2. 固定产品图和抠图结果
3. 仅修改场景提示词
4. Queue 多次获得不同场景的产品图

# 或使用 batch 参数一次生成多张不同种子的同一场景
EmptyLatentImage → batch_size: 4

💡 提示:产品图合成的关键是光影一致性。确保场景提示词中的光照方向与产品原图的光照方向匹配。


8.3 项目三:AI 漫画生成流水线(多页漫画一致性)

8.3.1 需求分析

目标:生成一组风格一致、角色一致的漫画页面

核心挑战: - 角色一致性(同一个角色在不同页面看起来一样) - 风格一致性(所有页面保持统一的美术风格) - 分镜控制(不同面板的构图和视角)

8.3.2 工作流设计

Text Only
┌──────────────────────────────────────────────────────────┐
│               角色一致性模块                                 │
├──────────────────────────────────────────────────────────┤
│ 基础 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 角色一致性策略

Text Only
策略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 分镜提示词模板

Text Only
# 特写
"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 工作流设计

Text Only
┌──────────────────────────────────────────────────────────┐
│               输入与预处理模块                                │
├──────────────────────────────────────────────────────────┤
│ 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 风格提示词

Text Only
# 现代简约
"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 多视角合成

对于同一空间的不同视角,保持设计一致性:

Text Only
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 工作流设计

Text Only
┌──────────────────────────────────────────────────────────┐
│               模型与运动模块                                  │
├──────────────────────────────────────────────────────────┤
│ 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 帧插值可以让视频更流畅:

Text Only
# 原始: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 效果优化

Text Only
# 提升运动一致性
- 降低 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 调用示例

Python
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 实时监控

Python
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 部署架构

Text Only
┌─────────────┐     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 工作流优化

Text Only
# 避免不必要的操作
- 移除未使用的节点(静音也会占用)
- 合理设置 batch_size(过大浪费显存)
- 先低分辨率测试参数,确认后再切换高分辨率

# 利用缓存
- 模型加载是最耗时的操作,尽量复用
- 避免在工作流中反复切换不同的 Checkpoint
- 将不同参数的生成放在同一个工作流中

# 并行处理
- 独立的工作流分支可以并行执行
- 利用 batch_size 一次生成多张图

8.7.4 资源监控

Bash
# 监控 GPU 使用情况
nvidia-smi -l 1  # 每秒刷新

# 查看显存占用
nvidia-smi --query-gpu=memory.used,memory.total --format=csv -l 1

# Windows 任务管理器
# → 性能 → GPU 查看显存使用率

⚠️ 注意:如果发现显存持续增长不释放,可能是内存泄漏。尝试重启 ComfyUI。某些自定义节点可能存在显存泄漏问题。


综合练习

  1. 头像生成器:搭建完整的 AI 头像生成工作流,用同一张照片生成至少 3 种不同风格
  2. 产品图工作流:拍摄一个日常物品的白底照片,生成 3 种不同场景的产品展示图
  3. 漫画生成:使用固定角色 LoRA 或 IP-Adapter,生成 4 个面板的短漫画
  4. 室内设计:拍摄一张房间照片,使用 ControlNet 生成至少 2 种不同装修风格
  5. 视频生成:使用 AnimateDiff 生成一段 16-32 帧的短视频
  6. API 集成:编写一个 Python 脚本,通过 API 向 ComfyUI 提交工作流并获取结果
  7. 性能测试:对比 --lowvram、默认模式和 --highvram 的生成速度差异

延伸阅读


🎓 课程总结

恭喜你完成了 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、视频生成、显存优化

下一步建议

  1. 持续关注 ComfyUI 的版本更新和新功能
  2. 深入学习一到两个垂直领域(如视频生成、3D 生成)
  3. 积累自己的工作流模板库
  4. 参与社区分享,贡献自定义节点或工作流
  5. 探索与其他工具的集成(如 Blender、Unity)

📌 下一章09-FLUX与新一代模型工作流 —— FLUX.1、SD3.5、视频生成等前沿模型工作流

📌 返回目录README.md


最后更新日期:2026-02-12 适用版本:ComfyUI实战教程 v2026