一、Stable Diffusion 图生图底层扩散原理详解
要用好 ComfyUI 图生图,不能只停留在拖拽节点调参数,需要理解潜空间(Latent Space)的运行逻辑。 文生图模式的起点是随机生成的空潜张量,模型从纯噪声开始,经过多步采样去噪,逐步还原出符合提示词描述的画面。而图生图的核心差异,就是把起点替换成由原图编码得到的潜特征张量。
完整链路数学逻辑:
- 输入原图经过图像预处理:尺寸对齐、像素归一化、RGB 通道规整;
- VAE Encode 编码器将 RGB 像素图压缩为 4 倍下采样的潜空间张量,这个张量保存原图的构图、物体位置、人物姿态、基础光影、轮廓结构等核心空间信息,丢弃部分高频细节;
- 向该潜张量注入可控量的高斯噪声,注入多少噪声,由核心参数
denoise(重绘幅度)控制; - CLIP 文本编码器将正向提示词、反向负面提示词映射为文本条件 Embedding 向量,作为采样过程的引导信号;
- KSampler 采样器按照指定采样器、调度器、采样步数、CFG 系数,在潜空间内迭代去噪;
- 去噪完成后的潜张量送入 VAE Decode 解码器,还原回 RGB 像素图像输出。
denoise 重绘幅度是整个图生图体系的黄金控制开关,区间对应的业务场景严格划分:
- 0.1 ~ 0.3:低重绘区间,几乎保留原图全部结构。适用:画面瑕疵修复、轻微磨皮、光影微调、质感润色,不改动构图和人物五官;
- 0.4 ~ 0.6:通用生产黄金区间,平衡原图结构保留度和 AI 改写自由度。适用:画风迁移、上色、细节优化、服饰微调,绝大多数漫画、漫剧生产优先使用该区间;
- 0.6 ~ 0.75:高改写区间,构图和主体姿态保留,五官、服饰、光影、画风会发生明显改动。适用:角色形象迭代、线稿上色、草图精细化;
- 0.75 ~ 0.9:极高改写区间,仅保留大体轮廓,画面内容高度随机,效果趋近文生图,风险高,生产环境谨慎使用;
- ≥0.9:基本等同于文生图,原图几乎失去约束作用。
补充重要底层特性:图生图不会自动对齐原图尺寸,如果输出分辨率和输入原图差距过大,会出现拉伸、构图崩坏。工业流程中强制增加一步尺寸预处理节点,统一分辨率,推荐漫剧竖屏
720×1280,横屏1280×720。
二、基础版图生图 ComfyUI 节点工作流(JSON 可直接导入)
这套基础链路为最简可用版本,不含额外插件,仅依赖 SD 基础节点,适合新手调试、简单画风迁移、草图转精致图。所有节点 ID 一一对应,导入后只需要修改图片路径、提示词、denoise 参数即可运行。
{ "3": { "class_type": "KSampler", "inputs": { "seed": 886622, "steps": 24, "cfg": 7, "sampler_name": "dpmpp_2m_sde", "scheduler": "karras", "denoise": 0.55, "model": ["4", 0], "positive": ["6", 0], "negative": ["7", 0], "latent_image": ["10", 0] } }, "4": { "class_type": "CheckpointLoaderSimple", "inputs": { "ckpt_name": "realisticVisionV51_v51VAE.safetensors" } }, "6": { "class_type": "CLIPTextEncode", "inputs": { "text": "masterpiece, best quality, manhwa style, soft cel shading, delicate face, clean outline, soft ambient light", "clip": ["4", 1] } }, "7": { "class_type": "CLIPTextEncode", "inputs": { "text": "lowres, bad anatomy, deformed, disfigured, watermark, text, blurry, extra limbs, cross-eye", "clip": ["4", 1] } }, "8": { "class_type": "VAEDecode", "inputs": { "samples": ["3", 0], "vae": ["4", 2] } }, "9": { "class_type": "SaveImage", "inputs": { "images": ["8", 0], "prefix": "img2img_base_out" } }, "10": { "class_type": "VAEEncode", "inputs": { "pixels": ["11", 0], "vae": ["4", 2] } }, "11": { "class_type": "LoadImage", "inputs": { "image": "./source/ref_pic.png" } } }
基础工作流调试说明
- 替换
CheckpointLoaderSimple中的模型名称,和本地 models/checkpoints 目录文件名保持一致,模型缺失会直接报错; sampler_name和scheduler组合推荐:dpmpp_2m_sde + karras泛用性最强;写实图可使用euler a,漫画二次元推荐dpmpp_2s_ancestral;- 采样 steps 推荐区间:20~28,低于 16 细节不足,高于 32 收益很低、徒增渲染耗时;
- CFG 比例:6~8,数值越高,画面越严格贴合提示词,但容易出现色彩生硬、过曝。
三、进阶约束工作流:ControlNet + IP-Adapter 双锁图生图(生产主力版本)
基础图生图存在两个致命短板:denoise 调高后人物姿态漂移、角色五官变脸,这在漫画、漫剧批量分镜生产中是不可接受的。生产级方案采用 ControlNet 锁定结构姿态 + IP-Adapter 锁定角色身份 的双层约束架构,是工作室长期批量出图的标准方案。
- ControlNet:优先选用 OpenPose 锁定人体骨架姿态、Canny 锁定物体轮廓、LineArt 锁定线稿结构;
- IP-Adapter:加载角色定妆参考图,锁定脸型、五官、发型、标志性配饰,解决跨图角色不一致。
核心扩展节点配置片段:
{ "ip_adapter_node": { "class_type": "IPAdapter", "inputs": { "model": "ip-adapter-plus_sd15.safetensors", "reference_image": "./assets/char_heroine_ref.png", "weight": 0.65, "weight_type": "linear", "start_at": 0.0, "end_at": 0.9 } }, "controlnet_node": { "class_type": "ControlNetApply", "inputs": { "conditioning": ["6", 0], "control_net_name": "control_sd15_openpose.pth", "image": ["preprocessor_out", 0], "strength": 0.58 } }, "preprocessor": { "class_type": "ControlNetPreprocessor", "inputs": { "preprocessor": "openpose_full", "image": ["11", 0], "resolution": 1024 } } }
权重搭配调参矩阵(生产实测)
表格
| 场景 | ControlNet 权重 | IP-Adapter 权重 | denoise |
| 线稿上色,姿态不能改动 | 0.6~0.7 | 0.55~0.65 | 0.45~0.55 |
| 角色重绘,保留长相,微调动作 | 0.45~0.55 | 0.6~0.7 | 0.5~0.65 |
| 草图精细化,构图不变 | 0.5~0.6 | 0.5 | 0.55~0.65 |
避坑重点:IP-Adapter 权重不要超过 0.75,过高会强制覆盖画风,导致画面生硬、和底模风格割裂;ControlNet 权重高于 0.7 容易让肢体僵硬、失去自然感。
四、Python API 批量图生图调度完整脚本
ComfyUI 原生支持 HTTP API,不需要前端手动点击渲染,程序可以遍历本地图片文件夹,自动替换参考图、种子、提示词、denoise 参数,批量提交渲染任务。
前置准备:
- 启动 ComfyUI 命令追加参数
--enable-cors-header=*,开启跨域 API 访问;- 将上面基础工作流导出保存为
img2img_base.json;- 安装依赖:
pip install requests
import requests import json import os import time COMFY_API_URL = "http://127.0.0.1:8188" WORKFLOW_TEMPLATE_PATH = "./img2img_base.json" SOURCE_IMAGE_DIR = "./source_images" BATCH_OUTPUT_DIR = "./batch_output/img2img_result" # 全局提示词模板,可按业务切换画风 POSITIVE_TPL = "masterpiece, best quality, manhwa webtoon, clean cel shading, delicate facial features, soft shadow, cinematic soft light" NEGATIVE_TPL = "lowres, bad anatomy, deformed hands, extra limbs, disfigured, blurry, text, watermark, ugly, mutated" def submit_comfy_task(workflow: dict) -> dict: """向ComfyUI提交渲染任务""" payload = {"prompt": workflow} resp = requests.post(f"{COMFY_API_URL}/prompt", json=payload, timeout=30) resp.raise_for_status() return resp.json() if __name__ == "__main__": os.makedirs(SOURCE_IMAGE_DIR, exist_ok=True) os.makedirs(BATCH_OUTPUT_DIR, exist_ok=True) # 加载基础工作流模板 with open(WORKFLOW_TEMPLATE_PATH, "r", encoding="utf-8") as f: base_workflow = json.load(f) # 遍历目录里所有图片 file_list = [f for f in os.listdir(SOURCE_IMAGE_DIR) if f.lower().endswith((".png", ".jpg", ".jpeg", ".webp"))] if len(file_list) == 0: print("⚠️ 源图片文件夹为空,请放入待处理图片") exit() print(f"✅ 一共检测到 {len(file_list)} 张待处理图片,开始批量提交任务") for idx, img_filename in enumerate(file_list): full_img_path = os.path.join(SOURCE_IMAGE_DIR, img_filename) # 深度拷贝工作流,避免参数互相污染 current_wf = json.loads(json.dumps(base_workflow)) # 动态修改节点参数 current_wf["11"]["inputs"]["image"] = full_img_path current_wf["6"]["inputs"]["text"] = POSITIVE_TPL current_wf["7"]["inputs"]["text"] = NEGATIVE_TPL current_wf["3"]["inputs"]["denoise"] = 0.52 current_wf["3"]["inputs"]["seed"] = hash(img_filename + str(time.time())) % 9999999 current_wf["9"]["inputs"]["prefix"] = f"img_{idx}_{img_filename.split('.')[0]}" try: task_ret = submit_comfy_task(current_wf) prompt_id = task_ret.get("prompt_id") print(f"[{idx+1}/{len(file_list)}] 图片 {img_filename} 任务提交成功,prompt_id: {prompt_id}") except Exception as e: print(f"❌ 图片 {img_filename} 提交失败,错误信息:{str(e)}") time.sleep(0.8) # 限流,防止短时间大量请求压垮ComfyUI print("\n🎉 全部任务提交完毕,请在ComfyUI界面查看渲染队列,结果自动输出到output目录")
脚本扩展方向
- 增加轮询逻辑:循环访问 API 查询任务是否渲染完成,自动移动文件到指定目录;
- 多参数组遍历:对同一张图片,循环测试 0.4/0.5/0.6 三组 denoise,自动生成对比图;
- 接入提示词配置文件,从 csv 读取每张图专属正向、反向提示词,适合分镜项目。
五、显存优化、批量生产提速方案
ComfyUI 节点化模式的一大优势就是精细控制模型加载与卸载,大显存 / 小显存显卡有两套不同的生产策略:
- 显存 ≥12G(RTX3090/4070Ti/4080)开启模型常驻,Checkpoint、ControlNet、IP-Adapter 模型加载一次,反复复用,不需要每次渲染重新加载,速度提升 40% 以上;
- 显存 6~8G(RTX3060/4060)使用
ModelUnload节点,单张图渲染完成后自动卸载大模型;开启 VAE 分片编码,关闭异步加载;使用 FP16 精度,禁止 FP32; - 通用提速设置
- 采样步数控制在 24 以内,不要盲目加高步数;
- 批量任务之间增加短暂休眠,避免 GPU 显存持续溢出;
- 图片预处理统一分辨率,避免动态分辨率带来额外计算开销;
- 优先使用 safetensors 格式模型,加载速度远快于 ckpt 格式,安全性更高。
六、高频故障现象、根因分析与修复方案
在长期批量绘图生产中,图生图的报错和画面异常有很高的重复性,整理标准化排查清单:
- 生成画面和原图几乎一模一样,没有任何改写效果根因:denoise 重绘幅度过低;正向提示词引导弱;采样步数太少。 修复:denoise 上调 0.1~0.2,丰富正向提示词,采样步数提高至 22 以上。
- 构图完全错乱、人物姿态变形、主体位置跑偏根因:denoise 过高,没有 ControlNet 结构约束;原图和输出分辨率差异巨大。 修复:降低 denoise;增加 OpenPose/Canny ControlNet;统一输入输出分辨率。
- 角色每次生成五官都不一样,出现变脸根因:缺少 IP-Adapter 角色参考约束;种子随机;每次重新随机生成。 修复:接入 IP-Adapter 固定角色参考图;长篇项目训练专属角色 LoRA 叠加使用。
- 节点导入后红色报错,提示找不到模型根因:工作流内记录的模型名称、版本和本地不一致;插件缺失(IP-Adapter、ControlNet 节点插件未安装)。 修复:核对模型文件名;安装 ComfyUI-IPAdapter、ComfyUI-ControlNet 插件;替换节点内模型路径。
- 渲染中途显存溢出、程序崩溃根因:分辨率设置过大;多个大模型同时常驻显存;连续提交大量任务不做卸载。 修复:降低分辨率;增加模型卸载节点;控制并发任务数量。
- 画面频繁出现畸形手部、崩坏肢体根因:提示词缺少负面约束;ControlNet 姿态权重不足;原图本身肢体存在畸形。 修复:在负面词追加
bad hands, mutated fingers;调高 OpenPose 权重;提前筛选原图素材。
七、工程资源包内容说明
本次配套工程包「ComfyUI 绘图工作流,SD 底层绘图,图生图,出画面」面向 SD 底层绘图生产,全部文件为可直接投入调试的工程文件,包内包含:
- 基础版 Img2Img 工作流 JSON(无额外插件依赖);
- ControlNet+IP-Adapter 双约束生产版工作流 JSON(漫剧分镜主力工作流);
- Python 批量 API 调度脚本、参数遍历对比脚本;
- 分类提示词库:二次元漫画、写实、古风、线稿上色四套正负提示词;
- denoise 调参记录表、故障排查清单、显卡显存适配配置文档;
- 配套节点安装指引、模型下载清单、环境部署步骤文档。