简介这份资源是面向电商视觉设计与AI绘画初学者的ComfyUI换装实战教程配套源码包聚焦用Flux Fill与Flux Redux工具为商品图快速更换服饰风格解决传统电商换装成本高、风格迁移难把控的问题。压缩包共4个文件约7KB包含md说明文档、html页面、inscode配置与gitignore等类型分别用于流程讲解、页面展示与工程配置结构轻量便于直接运行调试。教程从模型选择、生成参数设置到提示词与反推提示词对比均有实例演示并指出复杂图案换装效果有限建议选用简洁参考衣物、手动处理模特蒙版并做高清修复。已有149人学习适合零基础用户结合stable diffusion安装包、入门教程与关键词合集快速上手AI绘画换装。1. 电商换装工作流到底在解决什么从一张模特图到一套可交付的 SKU 图做电商视觉的同行这两年应该都有体感同一个款式的衣服要出白底图、场景图、细节图、不同模特的上身图传统拍摄流程里这就是四次布光、四次换装、四次修图。一个 SKU 拍下来摄影棚、模特、修图师三头烧钱改一个颜色还要重来一遍。ComfyUI 电商换装教程这类内容之所以被反复搜本质是大家在找一个能把「模特图 服装图」自动合成、并且能批量稳定出图的工程化路径而不是再学一个玩具级 AI 绘画。这篇笔记面向两类人一类是已经会用 ComfyUI 跑通基础文生图、想把它接到电商出图流水线上的从业者另一类是手里有大量服装素材、想搭一套可复用换装工作流的团队。我会把节点怎么连、参数怎么设、批量怎么跑、翻车点在哪讲清楚源码以节点图 JSON 和自定义节点脚本的形式给出你照着搭就能复现。核心链路是人物姿态与遮罩提取 → 服装区域对齐 → 局部重绘inpaint→ 细节修复与一致性校验四步里任何一步偷懒出图都会在领口、袖口、下摆这些地方露馅。2. 换装工作流的节点拆解从人物遮罩到服装对齐的四段链路2.1 为什么不能直接整图重绘很多人第一反应是拿一张模特图把服装图丢进 IPAdapter 或者直接图生图让模型「自己换」。这条路在小分辨率、单张测试时看着还行一旦上批量就崩。原因是整图重绘会同时改动人脸、手部、背景和服装模型没有「只改衣服」的约束人脸漂移、手指变形、背景纹理被污染的概率极高。电商图对人脸和手部的容错率几乎为零一张手指多一根的图直接报废。正确做法是把换装拆成「区域约束 局部生成」。先用分割模型把人物身体、服装区域、背景分离出来只对服装覆盖的像素区域做重绘其余区域用原图 latent 锁死。这样人脸、手、背景完全不动模型只需要专注生成服装的褶皱、材质和光影。代价是你要多花时间在遮罩质量上遮罩边缘差 2 个像素领口就会有一圈脏边。2.2 人物解析与服装遮罩的生成人物解析我一般用 Segformer 的人像分割模型输出 18 类语义标签其中上衣、裤子、裙子、连体衣这几类直接对应服装区域。拿到语义图后把目标服装类别转成二值遮罩再做一次形态学膨胀让遮罩比实际服装区域大 3 到 5 个像素给重绘留出过渡带。import numpy as np import cv2 def build_cloth_mask(seg_logits, cloth_labels(4, 5, 6, 7), dilate_px4): seg_logits: 分割模型输出形状 [H, W]值为类别 id cloth_labels: 上衣/裤/裙/连体衣对应的类别 id按你用的模型文档改 dilate_px: 膨胀像素太小会露原衣服边缘太大会吃掉皮肤 mask np.zeros_like(seg_logits, dtypenp.uint8) for lb in cloth_labels: mask[seg_logits lb] 255 # 闭运算先补内部空洞再膨胀扩边 kernel cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) mask cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) mask cv2.dilate(mask, kernel, iterationsdilate_px // 2) return mask这段逻辑的关键在dilate_px。设 2 像素重绘区域压不住原衣服边缘出图会有一圈原色残留设 8 像素以上遮罩会盖到脖子和手腕皮肤重绘时模型把皮肤也当衣服生成出现「衣服长到肉上」的玄学效果。我实测 4 到 5 像素在 1024 分辨率下最稳。MORPH_CLOSE不能省分割模型在衣服褶皱处经常漏几个像素的小洞不补的话重绘会在洞里生成奇怪的色块。2.3 服装图的对齐与形变服装平铺图和模特上身之间差着一个形变。直接把平铺图 resize 贴上去领口位置、袖长、腰线全对不上。常见做法是用 ControlNet 的 openpose 或者 densepose 提取模特姿态再用一个轻量的形变网络把服装图 warp 到目标姿态。工程上更省事的方案是用服装图做 IPAdapter 的参考图让重绘模型自己学服装的纹理和颜色姿态交给 ControlNet 约束。# ComfyUI 节点图关键连接伪代码对应 JSON 里的节点 id workflow { load_model: {ckpt: sd_xl_inpaint.safetensors}, load_cloth: {image: cloth_001.png}, ipadapter_apply: { model: load_model, image: load_cloth, weight: 0.75, # 服装参考强度 start_at: 0.0, end_at: 0.85 # 留最后 15% 步数给细节收敛 }, controlnet_pose: { image: model_pose.png, strength: 0.9 }, inpaint: { mask: cloth_mask, denoise: 0.92, # 局部重绘强度 steps: 28, cfg: 6.5 } }ipadapter_apply的weight是这套流程里最需要调的参数。0.6 以下服装颜色会偏红色变粉、藏青变灰0.9 以上服装纹理过拟合褶皱会变得像贴纸一样平。0.7 到 0.8 之间是甜区。end_at设 0.85 的意思是前 85% 的采样步数接受服装参考后 15% 让模型自由收敛边缘避免服装边缘出现硬切边。denoise设 0.92 是因为遮罩区域要完全重绘低于 0.85 原衣服会透出来。2.4 局部重绘后的细节修复重绘完的图在遮罩边缘会有一圈色差尤其是衣服和皮肤交界处。这一步用 latent 混合或者简单的泊松融合都能压下去。我习惯在 ComfyUI 里加一个ImageCompositeMasked节点把重绘结果按羽化后的遮罩贴回原图羽化半径 6 到 8 像素。羽化太小边缘有硬线太大衣服边缘会糊。3. 批量出图的工程化队列、命名与一致性校验3.1 用 API 模式跑批量而不是手动点单张调试用界面没问题一天要出几百张 SKU 图就必须走 API。ComfyUI 的/prompt接口接受节点图 JSON你把服装图路径、遮罩路径、随机种子作为变量传进去外面套一层 Python 循环就能批量跑。import json import requests import os SERVER http://127.0.0.1:8188 def queue_workflow(template_path, cloth_path, mask_path, seed, out_prefix): with open(template_path, r, encodingutf-8) as f: wf json.load(f) # 定位到加载服装图和遮罩的节点替换路径 for node in wf.values(): if node.get(class_type) LoadImage: title node.get(_meta, {}).get(title, ) if title cloth_input: node[inputs][image] cloth_path elif title mask_input: node[inputs][image] mask_path if node.get(class_type) KSampler: node[inputs][seed] seed payload {prompt: wf, client_id: batch_runner} r requests.post(f{SERVER}/prompt, jsonpayload, timeout30) r.raise_for_status() return r.json() if __name__ __main__: cloths [f for f in os.listdir(cloths) if f.endswith(.png)] for i, c in enumerate(cloths): queue_workflow( workflow_template.json, fcloths/{c}, fmasks/{c}, seed1000 i, out_prefixfout_{i:04d} )这里有个坑ComfyUI 的节点图 JSON 里节点 id 是字符串_meta.title不一定存在你得先在界面里给关键节点改好标题再导出。seed每张图必须不同固定种子会导致同一件衣服在不同模特上生成完全一样的褶皱批量图看起来像复制粘贴。client_id随便填但同一批任务用同一个 id 方便在队列里追踪。3.2 一致性校验怎么判断这批图能不能交付批量出图最大的风险不是单张崩而是「整体看着还行细看每张都有小毛病」。我一般跑完一批后做两件事一是用 CLIP 相似度算服装图和出图的颜色一致性低于阈值的挑出来人工看二是用一个人脸检测模型确认每张图的人脸没被改动。校验项方法阈值建议不达标处理服装颜色一致性CLIP image encoder 余弦相似度 0.82调高 IPAdapter weight 重跑人脸完整性人脸检测框数量与位置比对原图位置偏移 5px检查遮罩是否盖到脸边缘脏边遮罩边缘梯度检测无连续高梯度带加大羽化半径手部结构手部关键点检测关键点数量一致缩小遮罩范围这张表是我踩过几次坑之后固定下来的。颜色一致性阈值 0.82 是经验值低于这个数基本能肉眼看出色偏。人脸位置偏移超过 5 像素说明重绘区域越界了回去查遮罩膨胀参数。3.3 队列管理与失败重试批量跑的时候总会有几张因为显存不足或者模型加载失败卡住。我的做法是在 API 外面包一层重试失败任务记录到单独文件跑完主批次后单独重跑。显存不足的典型表现是/prompt返回 200 但队列里任务一直 pending这时候要检查是不是同时提交了太多任务。ComfyUI 默认队列是串行的但如果你开了多个 client 并发提交显存会爆。import time def queue_with_retry(template, cloth, mask, seed, retries3): for attempt in range(retries): try: return queue_workflow(template, cloth, mask, seed, ) except requests.exceptions.HTTPError as e: if e.response.status_code 500: time.sleep(5 * (attempt 1)) # 退避等待显存释放 else: raise raise RuntimeError(ftask failed after {retries} retries: {cloth})退避时间用 5 秒递增是因为显存释放和模型卸载需要时间立刻重试大概率还是失败。4. 避坑记录换装工作流里最容易翻车的五个地方4.1 领口出现一圈原衣服颜色现象出图后领口位置有一圈和原衣服同色的脏边放大看像描边。原因是遮罩膨胀不够重绘区域没有完全覆盖原衣服边缘原图 latent 在边缘处和重绘结果混合。解决是把dilate_px从 3 调到 5或者在重绘后加一步ImageCompositeMasked用羽化遮罩重新贴回。我现在的固定做法是膨胀 5 像素加羽化 8 像素两个一起上。4.2 服装纹理变成贴纸现象衣服褶皱消失纹理像平面贴图光影和模特身体不匹配。原因是 IPAdapter weight 设太高模型把参考图当成了必须逐像素复现的目标。解决是把 weight 从 0.9 降到 0.75同时把end_at从 1.0 降到 0.85给模型留出根据身体姿态重新生成褶皱的步数。如果降 weight 后颜色偏了改用 IPAdapter 的 style transfer 模式而不是 composition 模式。4.3 批量出图后人物脸型漂移现象同一模特的多张图脸型、五官有细微差异放在详情页里一眼能看出不是同一个人。原因是重绘时遮罩越界盖到了下巴或脖子模型顺手把脸也改了。解决是回到遮罩生成那一步把服装类别里靠近颈部的区域做一次腐蚀确保遮罩上边界在锁骨以下。另外denoise不要超过 0.95太高会让模型在遮罩边缘向外扩散修改。4.4 显存溢出导致任务静默失败现象提交任务后接口返回成功但队列里任务消失没有输出图。原因是显存不足时 ComfyUI 的 worker 进程崩溃但 API 层已经返回了 200。解决是跑批量前先用一张图测显存占用在启动参数里加--lowvram或者--medvram并且把批量并发数控制在 1。如果必须并发用两个 ComfyUI 实例分别监听不同端口而不是一个实例接多个 client。4.5 不同分辨率下参数全部失效现象512 分辨率调好的参数换到 1024 后边缘脏边、颜色偏移全回来了。原因是遮罩膨胀像素是绝对像素值分辨率翻倍后 5 像素的相对宽度减半。解决是把膨胀和羽化参数改成按分辨率比例计算比如dilate_px int(resolution / 256)1024 下就是 4 像素2048 下就是 8 像素。这个换算不精确但够用比每次手动调省事。5. 进阶技巧用参考图 latent 注入把换装一致性再提一档前面讲的流程已经能出可交付的图但如果你要的是「同一件衣服在十个模特身上颜色、纹理完全一致」光靠 IPAdapter 还不够。IPAdapter 是全局参考模型在生成时会根据姿态和光照做微调十张图放在一起还是能看出色差。我后来用了一个更笨但更稳的办法把服装图的 latent 直接注入到重绘区域的初始噪声里。具体做法是在 KSampler 之前加一个LatentComposite节点把服装图经过 VAE 编码后的 latent按遮罩区域贴到空白 latent 上然后denoise设 0.75 而不是 0.92。这样模型不是从纯噪声开始生成而是从「服装图的模糊版本」开始去噪颜色和纹理的底子被锁死姿态和褶皱由 ControlNet 和模型补全。代价是denoise降低后如果服装图和模特姿态差异太大形变会不自然所以这一步要配合 densepose 做服装图的预形变。# 服装图预形变用 densepose 把平铺图 warp 到目标姿态 import torch from densepose_utils import extract_densepose, warp_cloth_to_pose def prepare_cloth_latent(cloth_img, model_img, vae, denoise0.75): cloth_pose extract_densepose(cloth_img) model_pose extract_densepose(model_img) warped warp_cloth_to_pose(cloth_img, cloth_pose, model_pose) latent vae.encode(warped).latent_dist.sample() return latent, denoisewarp_cloth_to_pose这一步的精度直接决定最终效果。densepose 在衣服褶皱多的地方关键点会抖warp 出来的服装图会有局部拉伸。我的经验是 warp 之后做一次高斯模糊半径 2 像素把拉伸痕迹磨掉反正后面还要去噪。denoise设 0.75 是平衡点再低服装形变跟不上身体再高颜色一致性又保不住。这套 latent 注入方案比纯 IPAdapter 慢大概 20%因为多了 VAE 编码和 warp 两步但批量出图的一致性提升很明显。我拿同一件衬衫在八个模特上跑过对比纯 IPAdapter 方案的颜色相似度最低 0.79latent 注入方案最低 0.88肉眼基本看不出色差。如果你做的是品牌旗舰店的详情页这个提升值得多花那 20% 的时间。最后说个习惯我每次调完参数不会立刻跑全量而是固定拿三张「刁钻图」做回归测试——一张深色衣服、一张浅色衣服、一张带复杂图案的衣服。这三张过了批量基本不会出大问题。参数文件按日期和模型版本存档换模型或者换节点版本后先跑回归别信「这次应该没问题」的直觉。希望帮到你。本文还有配套的精品资源点击获取