尧图精选

ComfyUI+Wan2.2 SmoothMix:角色换装视频生成工作流全解析

🕒 发布时间:2026/10/1 6:11:25 📁 来源:尧图网络
简介这是一份面向ComfyUI用户的角色服饰换装图生视频工作流文件基于Wan2.2 SmoothMix 模型实现人物服装替换与动态视频生成适用于电商模特展示、角色设计预演、短视频创作等场景。资源以json格式封装完整节点配置可直接导入ComfyUI 使用适合已有基础、希望快速复现换装效果的中高级AIGC玩家。压缩包仅含1个json文件整体大小约28KB结构精简、运行轻量。目前已有276人学习浏览实用性得到初步验证。通过该工作流读者可以快速理解SmoothMix 在服饰换装中的节点连接逻辑、关键参数设置以及图生视频的流程编排节省自行搭建节点的时间便于在此基础上二次开发或调整生成效果。1. SmoothMix 到底是什么从一张角色图到一段换装视频要分两步走第一次把 ComfyUI/Wan2.2 SmoothMix 这套工作流跑通时我意识到它解决的并不是换衣服而是换完衣服之后角色还是不是同一个人。图生视频里最折磨人的就是首帧身份漂移提示词里写清楚要穿牛仔外套结果生成第九帧之后脸也跟着变了想让角色自然转头衣服纹理却在半秒内烧糊。SmoothMix 的思路并不复杂把问题拆成两段——先用 ComfyUI 把原角色重新渲染成一张换装后的静态图再以这张图为首帧交给 Wan2.2 的图生视频模型去补动作和镜头。适合谁适合手里只有一张角色正面照或角色卡想批量产出十几秒换装动态视频又不想碰训练代码的创作者。整条链路在本地 ComfyUI 里可复现下面按我实际跑通的步骤讲。2. 搭建 ComfyUI Wan2.2 推理环境先让图生视频节点能跑起来2.1 先选模型I2V 与 T2V 的分工还有 FP8 版本的意义Wan2.2 开源之后很多人下模型时没分清分支。T2V 是纯文本生成视频输入一段描述从头生成画面I2V 是图生视频输入一张首帧图后续画面都围绕这张图延续。SmoothMix 必须选 I2V否则整条工作流的意义就丢了。建议下载 14B 的 I2V 版本并且优先考虑 FP8 量化版——对多数 24GB 显存显卡来说FP8 是能稳定跑通的最优档位显存占用比 BF16 低一大截画质损失在短视频场景里几乎看不出。除了主模型还需要配套的文本编码器和 VAE。Wan2.2 的 VAE 是独立文件不要图省事拿 SD 的 VAE 去接颜色会整体偏绿偏灰。文本编码器建议用 Wan 官方推荐的那个名称通常带 Wan 前缀。模型放对位置是第一步ComfyUI 对目录结构很敏感放错文件夹节点下拉框里根本找不到。# 建议先建好目录再把模型文件放进去 mkdir -p ~/ComfyUI/models/diffusion_models mkdir -p ~/ComfyUI/models/vae mkdir -p ~/ComfyUI/models/loras # 之后把 wan2.2_i2v_14B_fp8.safetensors 放进 diffusion_models # 把 wan2.2_vae.safetensors 放进 vae角色 LoRA 放进 loras。 ls -lh ~/ComfyUI/models/diffusion_models/ | grep -i wan这段命令只是确认文件是否就位。ComfyUI 识别模型不看文件名节点下拉框里会自动列出目录下的可选文件但如果你把 I2V 模型错放到 VAE 目录节点会直接报类型不匹配连下拉框都不给选。这里最容易翻车的地方是文件损坏很多模型加载失败其实不是目录问题而是下载不完整。判断方法很简单看文件大小是否接近发布页面标注的体积。2.2 把 ComfyUI 装到能跑 Wan2.2便携版、启动参数与显存预留ComfyUI 的安装方式常见有三种官方桌面端、便携版、整合包。热词里总能看到秋叶整合包确实省心但我个人更推荐便携版原因很实际整合包里绑了一堆用不上的插件Wan2.2 加载时会额外吃内存便携版想清清爽爽跑视频生成少了干扰出问题也好排查。安装本身不需要展开装 Python便携版自带解释器。解压后第一件事不是急着开浏览器而是设置启动参数。单独跑 Wan2.2 I2V 时模型权重、文本编码器、VAE 会同时占显存如果不预留一点余量生成到一半就会 CUDA OOM前面十分钟的排队全废了。# 在 ComfyUI 根目录启动给系统预留 2GB 显存 # 并启用低显存模式防止视频生成过程中直接崩溃 python main.py --windows-standalone-build --lowvram --reserve-vram 2.0这里两个参数要注意。--lowvram是让 ComfyUI 在显存紧张时自动把多余的层暂时挪到内存代价是速度变慢--reserve-vram 2.0表示显存里预留 2GB 给系统和其他程序防止生成过程把显存吃满导致黑屏或死机。如果你的显卡显存只有 12GB 到 16GB建议把 reserve 提到 3GB如果是 24GB 以上可以省掉--lowvram只留 reserve 参数。还有一个新手容易忽略的是系统盘空间。Wan2.2 模型文件动辄十几 GB生成过程中临时文件和缓存也会占用空间模型加载时如果磁盘满了会出现非常诡异的节点执行到一半自动中断。习惯上我会在 model 目录外再留 30GB 可用空间这个坑踩一次就记住了。2.3 用 ComfyUI-Manager 补齐节点导入工作流 JSON 不要慌从别人手里拿到的 SmoothMix 工作流通常是一个 JSON 文件。打开 ComfyUI 界面后直接把它拖进页面系统会自动解析节点图如果看到大块红色节点说明缺自定义节点。这时候靠手动去 GitHub 找包效率太低直接在 ComfyUI-Manager 里点 Install Missing Custom Nodes它会扫描当前工作流缺什么列出来让你批量安装。视频生成工作流最常见的依赖是 VideoHelperSuite它负责把帧序列合成 MP4有些 SmoothMix 变体还会用到视频插帧节点用来做慢动作或补帧。这些不是必须装的要以红色节点提示为准。装上之后如果节点还是红色多半是模型文件没放对或者模型类型不匹配不是节点本身的问题。拿到 JSON 后建议先做一次体检不要直接拖进去避免把已经崩掉的工作流文件加载进来找半天原因。# 先检查 JSON 是否合法损坏的文件会在这里直接报错 python -m json.tool smoothmix_workflow.json这条命令不会修改文件只是把 JSON 格式化打印一遍。如果提示Expecting value之类错误说明文件下载不完整或导出时有截断让给你文件的作者重新导出一次。合法 JSON 再拖进 ComfyUI我一般会先看一眼整体连线确认哪些参数暴露在节点面板上哪些还藏在 group 里这决定了后面调参时要不要到处翻菜单。3. 拆解 SmoothMix 角色换装工作流节点链路和后端三要素3.1 从首帧到换装后的静态图参考图、提示词和 LoRA 的作用SmoothMix 这个命名按我理解就是把Smooth和Mix两个动作拼在一起先保证角色身份平滑不变形再把新服装风格混合进画面。落到节点层面你第一眼会看到的通常是图生图重绘模块——输入原始角色图经过采样器重绘输出一张穿着新衣服的静态图。这一步常见做法有三种按落地可靠性排序第一种直接在提示词里描述新服装让模型自行重绘。最简单但控制力弱衣服褶子或 logo 经常随缘。第二种加载一个服装 LoRA比如皮衣 LoRA汉服 LoRA把服装风格强行拉过去。第三种用 IPAdapter 或参考图节点把一张衣服细节图作为视觉条件注入。SmoothMix 工作流里三类节点都可能出现典型组合是主模型 角色 LoRA 服装 LoRA 重绘模块角色 LoRA 锚定人脸服装 LoRA 锚定衣服质感。这一步的提示词值得单独说一下。不要把服装描述堆成中世纪清单模型会无所适从。我一般会把提示词分成三层人物身份层、服装层、环境光照层。# 正向提示词模板保留原角色身份只替换服装 original woman, id photo reference, wearing a black leather jacket, dark denim pants, urban street background, soft daylight, upper body shot, looking at camera # 负面提示词模板防止换装污染脸部 deformed face, bad anatomy, disfigured, extra fingers, blurry, low qualityWan2.2 对中文提示词支持得还可以但在 ComfyUI 里部分版本对中文 CLIP 长度有限制建议保守用英文。正向提示词里 id photo reference 是关键词它告诉模型这是一张身份参考图脸部特征要稳定服装描述放中间背景和光线放最后权重自然递减。负面提示词不要写太抽象的词像 bad quality 其实效果很弱写具体畸形特征更有用。3.2 从静态图到动态视频Wan2.2 的图生视频条件注入换装静态图拿到手之后SmoothMix 的关键一步就是把它送进 Wan2.2 图生视频节点。Wan2.2 I2V 的底层机制和 SD 的 ControlNet 不一样它不是对每一帧做逐帧控制而是把首帧图像编码成潜空间特征再与文本提示词融合作为整个视频序列的起始条件。这意味着首帧构图决定了视频动态范围如果首帧是正面大头照模型很难生成大幅转身动作如果首帧是全身站姿动作空间会大很多。节点的输入框里除了正向和负向提示词还有 batch_size、length、start_time、end_time 这些参数。很多人直接把 start_time 默认 0end_time 填一个很大的数其实这样会让模型在前面几帧过度发挥导致后半段动作乏力甚至静止。我习惯把 end_time 压在 2 到 3 秒之间动作指令放在提示词前部镜头运动放在后部。还有一个反直觉的经验想让角色动起来负面提示词里写 static, still, photo, frozen 比正面提示词写 walking 更有效。Wan2.2 对语义的敏感度更偏向不要什么把静止类词汇放进负面模型会自动往动态方向偏移。这是我跑了快三十轮图生视频之后才摸出来的规律原理说不太清但效果好。3.3 加载一个 SmoothMix 工作流模板节点图怎么读如果你拿到的 SmoothMix 工作流 JSON 里节点很多别被密集的连线吓住。读图时只需抓住三条链路输入链路、生成链路、输出链路。输入链路一般从 Load Image 开始经过裁剪、缩放最终连接到重绘模块生成链路从 Checkpoint 和 LoRA 开始经过 CLIP 编码后进入采样器输出链路从 VAE Decode 到 Video Combine。很多带模板的工作流会把参数藏在 Primitive Nodes 里这类节点长得像文本框界面上是一堆独立小框。右键这些节点选择 Convert to widget参数就会跑到对应节点的面板上调整起来不用再切到别处找。这是工作流到手后第一步要做的整理。批量跑多个 seed 时手动改参数太费劲。写一个十几行的小脚本批量把采样器里的 seed 随机化顺便检查节点类型是否和预期一致。import json import random with open(smoothmix_workflow.json, encodingutf-8) as f: workflow json.load(f) # 遍历工作流节点把采样器和图生视频节点的 seed 改成随机值 for node_id, node in workflow.items(): if node.get(class_type) in (KSampler, WanImageToVideo, Wan22I2V): if seed in node[inputs]: node[inputs][seed] random.randint(0, 2**31 - 1) print(node_id, node.get(class_type), seed -, node[inputs][seed]) with open(smoothmix_workflow_random_seed.json, w, encodingutf-8) as f: json.dump(workflow, f, ensure_asciiFalse, indent2)代码逻辑不复杂读取工作流 JSON遍历所有节点找到采样器和 Wan2.2 图生视频节点把 seed 替换成随机数然后另存为新文件。跑批量出图时非常管用。需要注意不同版本的 ComfyUI 节点类名可能不同如果打印出来为空先把节点类名打印一份看看再改脚本。4. 实操把一张角色照片变成换装视频完成最小可复现4.1 生成本地可跑的 SmoothMix 最小节点链在动手之前先给一张最小链路图保证从零开始也能搭出来。这里的节点顺序是我在 ComfyUI 里跑过最稳定的一套不掺多余的控制节点适合先验证整个流程能不能通。序号节点关键输入输出1Load Image角色正面图IMAGE2CLIP Text Encode正向换装 动作描述CONDITIONING3CLIP Text Encode负向静态 畸形描述CONDITIONING4Wan2.2 图生视频节点first_frame, positive, negative, lengthIMAGE 序列5VAE Decode潜空间张量视频帧列表6Video Combineframe_rate, format视频文件这套链路不需要换装 LoRA 也能跑只是服装完全依赖提示词控制效果会弱一些。如果想先确认环境是否正常建议就从这条最小链路开始把 LoRA 留到第二步再加。首帧图我建议用一张干净的正面半身照背景不要太乱光照均匀模型对首帧的理解会直接传导到后续每一帧。4.2 关键输入参数换装提示词、长度、分辨率、采样器把最小链路接好后调整参数的顺序也有讲究。先定分辨率再定长度最后才动提示词。分辨率直接决定显存占用和生成时长长度决定视频内容的完整性提示词只是锦上添花。参数推荐值说明主模型Wan2.2 I2V 14B FP8显存 24GB 以内首选分辨率1280x720低于 720p 脸部细节容易崩视频帧数 length81 帧16fps 下约 5 秒单段够用采样器dpmpp_2m_sde配合默认调度器即可CFG3.0 到 5.0超过 5 画面发死动作明显减少seed随机同一参数下不同 seed 动作幅度差异很大CFG 是 Wan2.2 调参里最容易踩的。很多从 SD 转过来的人习惯性把 CFG 调到 7 以上结果生成出来的视频像一张会呼吸的照片人物根本不动。解决方法是理解 Wan2.2 对文本的信任方式提示词越短CFG 可以越低换装描述和动作描述同时存在时CFG 过高会让两者打架反而两头不讨好。length 参数也值得多说一句不要想一次生成 20 秒。视频模型在长序列上会出现动作衰减前 5 秒动得好好的后面逐渐趋近静止。我通常把一段控制在 81 帧左右如果需要更长的视频用上一段的尾帧作为下一段的首帧去接比一次生成长序列稳定得多。4.3 从预览帧到导出视频Video Combine 节点生成完成后输出的是一组图像序列。直接用 Video Combine 节点合并frame_rate 填 16format 选video/h264-mp4一次搞定。但要养成一个好习惯合并之前先抽几帧看看效果别急着导出大文件。用 ffmpeg 手动抽帧是最直接的验证手段。# 从生成视频里抽第 0 帧和最后一帧检查首帧是否与输入一致 ffmpeg -i output.mp4 -vf selecteq(n\,0) -vframes 1 first_frame.png ffmpeg -i output.mp4 -vf selecteq(n\,80) -vframes 1 last_frame.png # 抽中间第 10 帧看动作是否自然 ffmpeg -i output.mp4 -vf selecteq(n\,10) -vframes 1 mid_frame.png抽帧命令里selecteq(n\,0)是选中第 0 帧-vframes 1表示只输出一张图。首帧要和输入的角色图对比看是否有明显构图变化中间帧看动作连贯性最后一帧看身份有没有漂移。这一步只要十秒钟却能在批量跑之前把最明显的翻车问题拦下来。5. 换装视频的常见问题排查从黑屏到角色漂移的五条踩坑记录5.1 现象一脸完全变了换完衣服像换了个人现象静态换装阶段看起来没问题但一进视频生成第一段画面里人脸和原角色明显不是同一张脸。原因Wan2.2 的图生视频条件注入是以首帧整体图像为条件不是单独锁定人脸。如果首帧里脸部区域像素占比小模型很可能把注意力放在衣服和背景上脸部细节被重建时丢失。解决回到静态换装阶段把原图裁剪成包含脸部的构图让重绘模块先做一次低 denoise 的面部重绘再送进视频节点。denoise 控制在 0.55 到 0.65不要打开 0.9 以上。另一个有效做法是同时加载角色 LoRA即使你的角色不是热门 IP一张图也能训练出低权重 LoRA把脸部特征强行锚定住。5.2 现象二衣服在视频里闪烁变形现象衣服在开局两秒内正常突然口袋变大、领口漂移、布料纹理高频闪烁像整个服装在来回拉扯。原因这是视频模型对视觉细节的注意力涣散。提示词里没有写具体材质和结构LoRA 权重又偏高模型在生成第 20 帧到第 40 帧时重新解释服装细节不同帧之间解释不一致。解决把服装 LoRA 权重降到 0.5 到 0.7不要贪效果加满。同时提示词里写更具体的款式描述比如 black leather jacket with silver zippers, dark denim pants with straight leg结构越具体帧间越稳定。不要在衣服上放文字 logoWan2.2 对文字的生成几乎是玄学十次有八次会糊成乱码。5.3 现象三人物站着不动画面像一张会呼吸的照片现象视频输出后只有头发丝和衣角在轻微抖动人物主体完全不动整体像加了微动态的照片。原因最常见的是负面提示词里保留了 static, still, photo 这样的词直接压制了动作其次是 CFG 太高让模型过度遵循文本而失去运动多样性。解决明确在负面提示词里去掉所有与静止相关的词把 CFG 降到 3.0 到 4.0 区间再检查正向提示词里的动作描述是否具体。写 she walks from left to right 比写 walking 有效得多如果提示词同时写了两个动作比如 walking and turning around建议只留一个多动作指令会让模型平均用力结果什么都不动。5.4 现象四显存爆了或边生成边卡现象跑到一半弹窗提示 CUDA out of memory或者节点一直卡在 60% 不动。原因分辨率设置过高比如直接上 1920x1080或者没有给系统预留显存生成过程中其他程序抢占了资源再或者多个模型缓存同时驻留显存比如文本编码器和 VAE 都被塞进了显存。解决优先使用 FP8 模型文件分辨率降到 1280x720。启动命令里加--reserve-vram 2.0如果还是 OOM继续加大到 3.0。生成视频期间关掉浏览器里多余标签页尤其不要开着其他 AI 绘图页面。用--lowvram模式兜底速度慢一点但能跑完。5.5 现象五首帧没对齐画面跳变现象视频前 3 到 5 帧会出现明显闪烁像画面被强行拽了一下之后再恢复正常。原因静态换装图和输入给视频节点的首帧图不是同一张或者两者构图不一致。常见是把换装后的图裁过一刀送进视频节点的却是原始比例图模型在潜空间重建时出现前后冲突。解决确保进入 Wan2.2 图生视频节点的首帧图像和静态换装阶段生成的图完全是同一张文件不做二次压缩和裁剪。如果要调整画面比例在静态换装阶段就完成统一。首帧跳变严重时可以在 Video Combine 前加一个线性混合节点把首帧和后续帧做几帧渐变视觉上平滑很多。提示以上五条踩坑记录是按出现频率排序的其中脸崩和衣服闪烁占了我实际项目中超过六成的问题。排查时先看节点输出预览别直接生成视频否则调试成本太高。6. 让换装结果更可控验证方法、批量出图和后续串联技巧6.1 用 CLIP 相似度和首尾帧对比验证身份保持跑通一次并不能说明工作流稳定批量生成之前必须做验证。我现在的习惯是抽出一个中间帧和原角色图计算 CLIP 图像特征相似度。相似度不是越高越好因为换装本身就改变了画面内容但如果明显低于你觉得正常的基线说明模型根本没把首帧当回事。import torch from PIL import Image from transformers import CLIPProcessor, CLIPModel model CLIPModel.from_pretrained(openai/clip-vit-base-patch32) processor CLIPProcessor.from_pretrained(openai/clip-vit-base-patch32) def similarity(img_a, img_b): inputs_a processor(imagesimg_a, return_tensorspt) inputs_b processor(imagesimg_b, return_tensorspt) with torch.no_grad(): feat_a model.get_image_features(**inputs_a) feat_b model.get_image_features(**inputs_b) return (feat_a feat_b.T).item() / (feat_a.norm() * feat_b.norm()).item() print(相似度:, similarity(Image.open(first_frame.png), Image.open(mid_frame.png)))这段代码用 CLIP 模型提取两张图的特征向量计算余弦相似度范围在 0 到 1 之间。我自己的经验是相似度在 0.7 以上说明身份保持良好掉到 0.5 以下就是严重的身份漂移别再继续加 seed 跑批量了直接回头调首帧权重和 LoRA。每次固定一个视频记录这个分数作为模型调参的基线你会发现比肉眼看视频靠谱得多。6.2 串联一段长镜头用上一段末尾帧当下一段首帧如果 5 秒不够用想拼出一条连续的长镜头做法是把上一段生成视频的最后一帧抽出来当作下一段的首帧输入。连接处会有肉眼可见的轻微跳变但配合线性混合节点或者提示词里写入接续的动作指令整体画面是连贯的。这个技巧适合做角色转身 走进镜头 服装细节特写这种多段式内容。批量出图时我还有一个习惯每轮只改一个变量。比如这一轮只调 seed下一轮只调 CFG避免多个变量同时改动导致问题无法归因。把参数和相似度结果记在一个表格里每个 seed 跑完顺手填一行后面筛选时才不会一团乱麻。我自己最常翻车的场景就是拿到新工作流后急着填提示词没看节点逻辑就硬跑结果调了两天都不知道是哪个节点出了问题。现在的习惯是先拿一个便宜小模型跑通链路再用 Wan2.2 正式抽卡每次只改一个变量记录首帧是否对齐、中间帧脸部是否清晰。按照这套流程之前被衣服纹理烧掉的十几轮测试现在基本能压到三到五轮以内。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →