ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

ComfyUI + QwenImageEdit 工作流:一张角色卡实现任意场景人物一致性写真

2026/9/27 20:25:20 拓冰建站 浏览量
ComfyUI + QwenImageEdit 工作流:一张角色卡实现任意场景人物一致性写真 简介一款面向ComfyUI用户的QwenImageEdit人物一致性写真工作流方案解决在任意场景下保持人物身份特征一致性的出图需求适合需要批量生成同一个人物在不同背景、服装或风格中写真的创作者也适合希望了解QwenImageEdit节点编排的进阶玩家。包体为1个rar压缩包内含1个json工作流文件整体仅6KB配置轻量导入ComfyUI即可复用无需额外下载大体积模型或复杂依赖。目前已有229人学习下载。json文件完整记录了从人物参考图输入、QwenImageEdit模型调用到结果输出的节点连接关系并对关键参数做了预设可快速迁移到自己的项目同时可作为学习QwenImageEdit在ComfyUI中落地实践的参考模板帮助理解多参考图融合、提示词控制等核心环节减少手动搭建节点的试错成本。1. 任意场景人物一致性写真一张角色卡走遍所有场景做 AI 人像的都知道一个烦心事单张图可以很惊艳但只要把同一个人放进新场景、换套衣服、改个姿势五官、发型、气质就全跑了。ComfyUI 里跑 QwenImageEdit 是现在比较省事的一条路——它不是靠 ControlNet 硬控骨骼、也不是靠 IPAdapter 仿个大概风格而是给模型一张参考图角色卡再用一句自然语言描述“把这个人放到咖啡馆/古风街/赛博城市”输出里这个人仍然是同一个人。这篇笔记从选型理由、工作流搭建、关键参数到踩坑记录按我实际拆过的流程写给你适合给角色设定做分镜、漫画封面、电商模特图以及所有需要“同一个角色反复出现”的创作者。2. 为什么是 QwenImageEdit原理定位和 ComfyUI 里的选型理由2.1 从图像编辑到身份保持它和 ControlNet、IPAdapter 的差别先把这个模型的定位说清楚。QwenImageEdit 是基于多模态语言模型底座微调出来的图像编辑模型它做的事情不是“从噪声里重新画一张图”而是“看懂你的参考图再按文字指令把图改了”。这个“看懂”是关键模型内部会把参考图里的人物身份信息、场景信息、物品关系都编码成视觉 token再和你输入的文本指令一起进到生成过程里。所以在 ComfyUI 里它和常见的几类方案是不同维度的工具。ControlNet 控制的是结构比如姿势骨架、深度图、边缘线它保证“动作对”但不保证“脸不变”IPAdapter 做的是特征迁移可以把参考图的风格或人物特征塞进生成结果但当你要求“换一个完全不同的场景”时特征会被场景稀释容易出现“像了但没完全像”的塑料脸。QwenImageEdit 的思路是语义级的身份保持——它理解“这个人”而不仅仅是“这张脸的风格”所以你可以在提示词里写“同样的女孩穿着白色连衣裙站在向日葵田里黄昏光线”场景大改身份不回退。实操里我的选型建议是这样的如果只做单人换装、换背景且你不想维护一堆 ControlNet 模型和 LoRAQwenImageEdit 一条链路最省心如果你要做复杂的多人精确构图、指定手部动作那还是要配合 ControlNet 的姿势条件QwenImageEdit 在精细结构控制上不如专用的 ControlNet 精确。一个是“语义编辑”一个是“结构控制”不冲突但别混着用。2.2 节点生态与两种安装路线QwenImageEdit 本身是模型仓库里开源的底座而 ComfyUI 里的落地靠社区封装的自定义节点。到写这篇笔记为止社区比较常见的做法是把“加载模型 → 编码参考图 → 生成 → 解码”封装成一个复合节点你在节点图上能看到 QwenImageEdit Sampler、QwenImageEdit Loader 这类名字。插件装好之后节点自带参数面板不需要你自己去拼 CLIP、VAE 那一堆基础节点。安装有两条路线我个人建议按你手里已有的环境选一条是用现成的整合包。如果你用的是秋叶整合包或 ComfyUI 便携版那么先打开 ComfyUI Manager在“Install Custom Nodes”里搜 QwenImageEdit找到社区封装节点后一键安装然后重启 ComfyUI。整合包的 Python 环境、依赖都已经处理过了走这条路基本不会碰到依赖冲突。注意装完之后去 Manager 的“Install Missing Custom Nodes”里看有没有补丁更新很多节点翻车都是因为装完之后没重启、或者依赖没装完。另一条是手动装适合你已经有一套自定义 ComfyUI 环境的情况。核心命令就这几步# 进入 ComfyUI 自定义节点目录 cd ComfyUI/custom_nodes # 克隆社区封装的 QwenImageEdit 节点仓库 git clone https://github.com/your-workflow/QwenImageEdit-ComfyUI.git # 进入节点目录安装 Python 依赖 cd QwenImageEdit-ComfyUI pip install -r requirements.txt # 回到 ComfyUI 根目录启动时强制重新加载节点 cd ../.. python main.py --force-fp16这里有几个参数要注意。--force-fp16是让模型以半精度加载能省接近一半显存但如果你显卡是 8GB 以下显存我建议改成--force-fp8或者直接用--lowvram后面第 5 章会细说显存问题。git clone的仓库地址以你搜索到的实际仓库为准因为社区节点更新很快不同作者封装的节点在参数命名上会有差异。装完启动时如果日志里出现Import times for custom nodes且你的节点在列表里说明加载成功如果出现红色报错先看是缺哪个依赖包pip install补上即可。手动安装路线最大的坑是版本匹配ComfyUI 本体更新频率很高节点作者不一定同步适配所以装完如果节点显示不出来先看 ComfyUI 的版本日志再回退 ComfyUI 本体版本比等节点更新更快。2.3 模型文件准备与目录约定节点装好只是第一步权重文件得自己下载。QwenImageEdit 的模型仓库里一般会给出合并权重ComfyUI 节点能直接加载的是已经转好的 diffusers 格式或 safetensors 格式。这一步最容易被忽略的是目录放错很多节点不会去读 ComfyUI 默认的models/checkpoints而是有自己约定的目录。我一般在models目录下新建qwen_image_edit文件夹把模型和配置文件按下面的方式放文件/目录放置路径说明合并权重 safetensors 文件ComfyUI/models/qwen_image_edit/主模型节点加载时选择这个文件tokenizer 配置目录ComfyUI/models/qwen_image_edit/tokenizer/分词器缺少会报 tokenizer 相关错误配置文件 config.jsonComfyUI/models/qwen_image_edit/模型结构配置一般随权重一起下载下载的时候优先选 FP8 或 BF16 的精度的版本FP32 的全精度权重在消费级显卡上完全没必要加载慢、显存占用高、出图效果没有肉眼可见提升。装好之后在节点面板的模型下拉框里如果能看到你放进去的文件名说明路径没问题如果下拉框是空的就去节点源码里找model_dir这个变量改成你实际放置的目录。3. 在 ComfyUI 里搭出“参考图 场景词”工作流3.1 一条最小链路的节点清单在 ComfyUI 里搭 QwenImageEdit 工作流比你想的要短。它不像 SD 那样必须拉出 Checkpoint Loader、CLIP Text Encode、KSampler、VAE Decode 一长串社区封装的复合节点把中间过程都包进去了。最小链路只需要四个节点Load Image加载参考图、QwenImageEdit 复合节点模型加载 生成、VAE Decode解码成像素图、Save Image保存结果。我用 API 格式的工作流片段给你看这个复合节点的关键配置这样你不管是导入 JSON 工作流还是自己拼图都知道每个字段在干什么{ 3: { class_type: LoadImage, # 加载角色参考图 inputs: { image: character_card.png, # 参考图路径相对 input 目录 upload: image } }, 10: { class_type: QwenImageEditSampler, # 社区封装节点实际类名以你装的版本为准 inputs: { model: [12, 0], # 模型加载器输出 ref_image: [3, 0], # 参考图来自 Load Image prompt: 同样的女孩穿着白色连衣裙站在向日葵田里黄昏光线半身像, negative_prompt: lowres, bad anatomy, extra fingers, max_tokens: 512, # 生成的最大 token 数 temperature: 0.8, # 随机性见第 4 章 top_p: 0.9, cfg: 2.0, # 提示词引导强度 steps: 20, seed: 42 } }, 20: { class_type: VAEDecode, # 解码成图像 inputs: { samples: [10, 0], vae: [12, 2] } }, 30: { class_type: SaveImage, # 保存输出 inputs: { images: [20, 0], filename_prefix: scene_output } } }注意几个细节。ref_image接的是 Load Image 的输出不是 VAE 编码后的 latent因为 QwenImageEdit 需要原始像素作为视觉输入这是和 SD 系工作流最大的不同。model输入在复合节点里会自带模型加载端口比如[12, 0]指的是 12 号节点模型加载器的第 0 个输出你拼图时连端口就行。steps默认 20 够用加到 30 以上对细节提升有限但耗时明显增加。3.2 参考图如何给角色卡和场景参考分开喂有经验的玩家不会只丢一张图进去。QwenImageEdit 的身份保持能力吃的是参考图质量所以“怎么给参考图”比“怎么调参数”更影响最终一致性。我的习惯是准备两张图一张正脸 上半身的角色卡一张全身姿态参考。角色卡是身份锚点要求光线均匀、五官无遮挡、背景简单分辨率在 512 到 1024 之间就可以不要超过 1024——参考图太大反而会让模型把背景噪声也记住干扰场景替换。全身姿态参考不是必须的但当你要求“站姿”“坐姿”“跑步”这类动作时给一张动作参考能让姿态更准确。加载时把角色卡接在ref_image端口姿态参考图可以放在提示词里用文字描述“参考图中的人物动作”也可以再挂一个参考端口如果节点支持多参考图。场景完全靠文字描述不要用场景参考图否则模型会优先模仿参考图的背景出现“换了个滤镜而不是换个场景”的翻车。所以身份从图里来场景从文字里来二者职责分开。3.3 多轮编辑保持会话上下文的节点状态QwenImageEdit 的另一个实用特性是支持多轮编辑也就是在同一张输出图上连续施加修改指令第一轮的输出会作为第二轮的参考。这在做“同一个角色逐渐换装”的场景序列时非常好用比如先让角色穿日常装再“把上衣改成红色外套”再“加上一副墨镜”每一轮都保持身份不漂移。实现上复合节点一般会提供一个conversation_history或state输入输出端口。你需要把上一轮节点的输出 latents 接回下一轮节点的输入形成一个循环。工作流里如果节点提供了enable_conversation开关打开它同时注意有没有clear_history参数这个是用来重置会话的新起一个角色时必须清掉旧会话否则模型会把上一个角色的特征带到新角色身上。我一般会这样组织多轮编辑的提示词链第一轮给定完整描述“人物 场景 服装 光线”后续轮次只写增量指令“把外套换成红色”“添加雨滴效果”。不要每一轮都重复完整描述重复的冗余信息会干扰模型判断哪些是要改的、哪些是要保持的。另外多轮编辑跑完之后检查一下conversation_history的长度大部分节点会把历史 token 数限制在 2048 以内超了会自动截断导致前后不一致这时候该手动开启新会话而不是继续叠加。4. 关键参数让同一个角色在不同场景里不“变脸”4.1 max_tokens 和 temperature控制生成自由度参数面板里最容易让人忽略的两个字段是max_tokens和temperature但它们对身份保持的影响比 CFG 和 steps 更直接。max_tokens决定模型生成回答也就是图像编码的最大长度。这个值设太小模型可能在描述到一半时被截断输出的图像会缺信息典型表现是脸部细节糊、场景元素残缺。设太大也不会变好反而会让模型在冗余区产生随机噪声。我实测下来的甜点区是 256 到 512简单的换背景 256 就够复杂场景多人交互、丰富道具给到 512。temperature控制随机性。它的表现不是简单的“越高越花”而是影响模型对参考图特征的忠实度。温度偏低0.5-0.7模型会倾向复用参考图里已有的特征人物像但场景会相对呆板温度偏高1.0 以上场景表现丰富但五官会开始漂移。做一致性写真我建议固定在 0.8-0.9 之间这个区间能兼顾场景多样性和身份稳定性。如果你发现某张图场景很好但脸有点“不像”先把 temperature 往 0.7 调一档而不是去换模型或加 LoRA。我用一张比照表给个直观参考参数推荐值场景切换时人物特写时max_tokens256-512512给场景更多描述空间256聚焦五官temperature0.7-0.90.9场景更开放0.7身份更稳定top_p0.85-0.950.90.94.2 CFG 与采样器配置CFG无分类器引导在 QwenImageEdit 里的玩法和 SD 不太一样。SD 里 CFG 7 起步很正常但这个模型基于多模态语言模型CFG 太高会把参考图的特征拉到变形典型表现是面部结构扭曲、色彩过饱和。我建议从 2.0 起步最高不要超过 4.0。采样器方面DPM 2M Karras 和 Euler a 都能用。区别在于DPM 2M 出图更锐利适合写实风格Euler a 更快适合先出草图看构图。steps 20 是下限我常年用 24-28 之间再多收益不大。调度器选 Karras 就能保证多数场景下的稳定输出。如果你用的是整合包里的默认采样器设置通常是 SD 的默认值 CFG 7直接套到 QwenImageEdit 上肯定翻车颜色会像过曝一样刺眼。所以在工作流里保存一套自己的预设值CFG 2.0、steps 24、sampler dpmpp_2m、scheduler karras。每次换模型都手动检查一遍别依赖默认值。4.3 提示词写法场景描述 人物不变约束提示词是 QwenImageEdit 的第二条命脉。它的文本理解能力强但写法和我们写 SD 提示词完全不同不需要大量 tag 堆叠需要的是完整、通顺的指令式句子。我的标准模板是四段式人物状态 场景环境 动作镜头 光照风格。举例来说要让角色出现在雨夜街头同样的女孩黑色长发穿着米色风衣站在雨夜的霓虹灯街道上手里撑着一把透明雨伞微微侧身半身构图霓虹灯光在潮湿路面上反射电影感色调浅景深注意第一句“同样的女孩黑色长发”这六个字的作用。它不是描述而是在提醒模型“这是刚才那个角色的延续”锚定身份。实测去掉这几个字模型会把角色重画一遍五官相似度会明显下降。负面提示词不要写太长集中在常见缺陷即可lowres, bad anatomy, bad hands, extra fingers, blurry。还有个小技巧如果你要出系列图同一个角色在不同场景连续出现每条提示词里人物描述部分完全复制粘贴只改场景和动作部分。这样模型在对比参考图时会优先把“没变的描述”对应到“没变的特征”上一致性会明显好于每次重新措辞。5. 常见问题排查从模型下载失败到显存炸裂5.1 模型下载失败从网络到路径现象第一次启动节点时后台日志卡在下载权重文件进度条长时间不动或者直接报Connection error/Download failed。原因模型权重体积较大下载源在海外网络波动会中断连接。另外很多节点下载脚本写的是从 Hugging Face 拉文件直连失败率不低。解决不要依赖节点的自动下载。手动从模型仓库把 safetensors 权重、tokenizer 配置、config.json 三个文件都下好按第 2.3 节的目录结构放好然后改节点源码里的model_path为本地路径。如果你的网络访问模型仓库也不稳定找中转镜像站点下载但注意校验文件哈希确保下载完整。我踩过一次权重只下了 70% 的坑节点不死不报错就是出图全是灰块最后比对文件大小才发现。5.2 显存不足预留、虚拟内存与精度现象跑图到一半爆CUDA out of memory或者整个 ComfyUI 直接崩溃。日志里常有RuntimeError: CUDA error: out of memory。原因QwenImageEdit 加载的是多模态模型显存占用比 SD1.5 高很多。8GB 显存跑全精度基本没戏即使用 FP16如果同时开着 ControlNet 或多轮对话历史显存也会很快打满。解决三个手段叠加。第一启动 ComfyUI 时加--reserve-vram 2.0告诉系统预留 2GB 显存做运行余量避免峰值时直接爆掉——这个参数的真实含义就是给显存使用设一个保险丝让它提前分流而不是硬撑。第二模型精度换 FP8视觉损失很小显存能省差不多一半。第三开启系统的虚拟内存Windows 下把虚拟内存设为 32GB 以上这样即使显存溢出部分数据会换到内存里顶多变慢不会崩。5.3 请求实体过大图片太大导致 API 报错现象使用 API 模式调用工作流时返回 HTTP 413 或报request entity too large。原因ComfyUI 的 API 接口接收图片时走的是 base64 编码图片分辨率越高、base64 字符串越长。QLora 版的 QwenImageEdit 对输入分辨率敏感有人直接把 2K 角色卡塞进去请求体直接超限。解决在调用 API 之前先把参考图压缩到 1024 以内再传给工作流如果传多张参考图把每张都做归一化。我习惯在客户端加一段预处理先转 RGB、缩放到 1024、再转 base64这一步能避掉 90% 的“请求过大”与“请求格式错误”问题。5.4 换场景后人脸漂移现象输出结果里场景完全正确但人脸和参考图不像五官结构不对或者像“同一张脸穿了不同皮肤”。原因多数情况不是模型问题是参考图给得不好。参考图里有大角度侧脸、表情扭曲、或其他人物入镜模型会把这些噪音也当成“身份特征”。另一个原因是 temperature 太高生成阶段太过随机。解决换参考图选正脸或微侧脸、光线均匀、无表情夸张的图。如果只有一张半侧脸可用把 temperature 降到 0.7并在提示词里强行写一句“正面看向镜头”。实测这一步对五官锁定的帮助立竿见影——因为模型在解码时会有一轮“重新聚焦参考图特征”的机制明确的姿态指令能引导它往参考图的方向靠。5.5 输出分辨率崩坏现象输出的图片尺寸和参考图不一致或者放大后脸部纹理出现水波纹状伪影。原因QwenImageEdit 的输出分辨率由模型内部的视觉编码器决定超出它支持的分辨率范围后图像会被强制拉伸脸部细节被破坏。解决按参考图的长宽比出图保持在模型支持范围内一般是 1024 或 1344 以内。需要大图就先生成 1024 的底图再用 ComfyUI 的 Upscale 节点加一个轻量放大模型如 4x-UltraSharp放大到 2048 或 4096。不要一开始就到 2048 生成。6. 进阶用场景脚本批量生成同一角色的写真工作流调试好之后接下来就是量产问题。你要做的不再是“一张图一张图地调”而是把角色卡固定写一个场景清单让脚本自动循环跑图。QwenImageEdit 在 ComfyUI 里有 API 模式我习惯的做法是先把搭好的工作流导出为 API 格式的 JSON然后用 Python 脚本替换其中的提示词字段逐条提交任务。import json import requests import uuid # 读取你导出的 API 格式工作流 JSON with open(qwen_workflow_api.json, r, encodingutf-8) as f: workflow json.load(f) # 场景清单每项是一个提示词对应一个输出图 scenes [ 同样的女孩黑色长发穿着白色连衣裙站在向日葵田里黄昏半身构图, 同样的女孩黑色长发穿着红色毛衣坐在咖啡馆窗边窗外下着雨特写, 同样的女孩黑色长发穿着牛仔外套站在赛博朋克城市的霓虹街头正面 ] # 找到 QwenImageEditSampler 节点的 id假设是 10 sampler_node workflow[10][inputs] for idx, scene_prompt in enumerate(scenes): sampler_node[prompt] scene_prompt sampler_node[seed] random.randint(0, 2**32 - 1) # 每张图随机种子 # 提交到 ComfyUI API默认端口 8188 response requests.post( http://127.0.0.1:8188/prompt, json{prompt: workflow, client_id: str(uuid.uuid4())} ) if response.status_code 200: print(f场景 {idx1} 已提交: {scene_prompt}) else: print(f场景 {idx1} 提交失败: {response.text})这个脚本的逻辑很直接把工作流 JSON 里固定位置10 号节点的prompt字段替换成场景描述然后通过/prompt接口提交给正在运行的 ComfyUI。每次提交前把seed随机化避免所有图都长一样。代码里client_id是 ComfyUI API 要求的会话标识用uuid生成防止任务状态串线。跑这个脚本有两点要注意。第一别忘了在脚本开头把场景提示词里“人物描述”部分保持完全一致只改场景和动作这是大批量保持一致性的前提。第二每次提交之间最好加time.sleep(2)的间隔或者用requests轮询/history接口确认上一个任务完成后再提交下一个不然显存不够时会连环爆。我后来干脆在脚本里加了一个任务队列先全部提交再定时查询完成状态比逐条阻塞快得多。从那以后我每次给角色出场景图都强制走一遍同样的流程先准备合格的角色卡固定人物描述模板调好 CFG 和 temperature再写场景清单批量跑。中途哪怕只改一个字我也会重新生成一遍而不是手动 PS——因为 QwenImageEdit 的随机性决定了手动修正的效率远低于重跑一次。这套方法我已经用在好几个角色设定项目上从十张到一百张都是这一个套路越用越顺手希望帮到你。本文还有配套的精品资源点击获取