Stable Diffusion 换装实战:Inpaint Anything + ControlNet 局部重绘工作流)
1. 换装翻车现场为什么你的 Inpaint Anything 总是糊边又错位先说结论Stable Diffusion 换装做不好九成不是模型的问题而是蒙版和 ControlNet 没配对。我见过太多人把整件衣服涂成一大块黑然后抱怨重绘出来像贴纸。问题出在蒙版边界——你给模型的边界越模糊它就越容易把衣服和皮肤、背景混在一起重绘。具体场景是这样的你有一张模特穿 T 恤的照片想换成吊带裙。直接在图生图里涂蒙版生成出来的结果要么是肩膀位置多出一块布料要么是手臂和衣服边缘出现一圈灰蒙蒙的过渡带。更糟的是如果原图姿势稍微复杂一点比如手叉腰换装后手指可能直接消失或者多出一根。这里有两个核心痛点。第一是蒙版精度Inpaint Anything 的 Segment Anything 模型能自动分割出衣服区域但它默认给的是语义分割图不是精确到像素的蒙版。你需要手动点选扩展才能得到干净的边界。第二是姿态锁定图生图重绘时模型会重新想象整个画面包括肢体位置。如果不加 ControlNet 约束换装后的人体结构很容易崩。我实测下来一套稳定的工作流应该是Inpaint Anything 出蒙版 → 图生图局部重绘 → ControlNet OpenPose 锁骨架 Canny 锁边缘 → 最后用 IP-Adapter 控制服装图案。这套流程跑通后换装成功率能从瞎蒙的 30% 提到 80% 以上。另外如果你需要批量测试不同服装效果手动一张张调参数太慢。这时候可以用 TaoToken 统一 Key 调用 API把整个换装流程脚本化。下面我会先讲本地 WebUI 的配置再讲怎么用 API 批量跑。2. TaoToken 前置统一 Key 调用 API 的准备工作在开始批量换装之前你需要先搞定 API 调用环境。TaoToken 的作用是给你一个统一的 Key不用在每个平台单独注册。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点直接用 https://taotoken.net/api 。第一步是获取 Key。登录后进入控制台在 API Keys 页面创建一个新 Key。建议给这个 Key 起个名字比如 sd-inpaint-batch方便后续管理。创建完成后复制 Key注意它只显示一次。第二步是确认你要调用的模型 ID。TaoToken 支持多种模型换装场景我推荐用 SDXL 系列的模型因为它在服装纹理和边缘融合上比 SD1.5 好很多。你可以在模型对话页面先测试一下模型是否可用输入一个简单的 prompt 看看返回结果。第三步是配置本地环境。如果你用 Python 脚本调用需要安装 requests 库。如果是用 WebUI 的 API 插件需要在设置里填入 Base URL 和 Key。这里有个坑Base URL 要填 https://taotoken.net/api 不要加多余的路径。Key 填在 Authorization 头里格式是 Bearer 你的Key。第四步是测试连通性。用 curl 发一个最简单的请求curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer YOUR_API_KEY \ -H Content-Type: application/json \ -d { model: gpt-4o, messages: [{role: user, content: test}] }如果返回 200 并且有内容说明 Key 和网络都没问题。如果返回 401检查 Key 是否复制完整。如果返回 local proxy failed说明你的本地网络环境有问题需要检查代理设置注意这里指的是本地开发环境的网络配置不是让你用任何违规工具。对于长期做换装测试的用户建议直接上 Coding Plan这样 API 调用额度更充足不用每次担心余额。Coding Plan 的入口在控制台里可以找到。3. 可复制配置Inpaint Anything 蒙版参数 ControlNet 权重这一节是核心我会给出完整的配置片段你可以直接复制到 WebUI 的 settings 里。首先是 Inpaint Anything 的蒙版参数。在扩展设置里找到 Inpaint Anything 标签页关键参数如下{ sam_model: sam_vit_h_4b8939.pth, mask_expand_ratio: 0.15, mask_blur_radius: 4, mask_trim_threshold: 0.5, invert_mask: false }解释一下mask_expand_ratio 是蒙版向外扩展的比例0.15 表示扩展 15%这个值能覆盖衣服边缘的过渡区域。mask_blur_radius 是羽化半径4 像素能让边界更自然。mask_trim_threshold 是修剪阈值0.5 是默认值如果你发现蒙版吃掉了太多皮肤可以调到 0.6。然后是 ControlNet 的配置。换装场景我建议用两个 ControlNet 单元第一个单元用 OpenPose 锁骨架[controlnet_unit_0] enabled true preprocessor openpose_full model control_v11p_sd15_openpose [cab727d4] weight 0.8 starting_control_step 0.0 ending_control_step 1.0 control_mode Balanced resize_mode Crop and Resize第二个单元用 Canny 锁边缘[controlnet_unit_1] enabled true preprocessor canny model control_v11p_sd15_canny [d14c016b] weight 0.6 starting_control_step 0.0 ending_control_step 0.8 control_mode My prompt is more important resize_mode Crop and Resize注意 ending_control_step 设为 0.8意思是后 20% 的采样步不施加 Canny 约束这样能让服装纹理更自然不会太死板。如果你还想控制服装图案可以加第三个单元用 IP-Adapter[controlnet_unit_2] enabled true preprocessor ip-adapter model ip-adapter_sd15_plus [32cd8f7f] weight 0.9 control_mode BalancedIP-Adapter 的图像输入放你想要的服装参考图。权重 0.9 是比较强的控制如果你只想轻微影响风格可以降到 0.6。图生图页面的参数也要调{ denoising_strength: 0.75, mask_blur: 4, inpaint_full_res: true, inpaint_full_res_padding: 32, inpainting_mask_invert: false, inpainting_fill: 1 }denoising_strength 设 0.75 是关键太低换不掉衣服太高会破坏原图结构。inpaint_full_res 设为 true 表示只重绘蒙版区域padding 32 是给蒙版周围留一点上下文。4. 验证请求从蒙版生成到 API 批量换装测试配置写好后先跑一张单图验证流程。步骤是这样的第一步在 Inpaint Anything 里上传原图点击 Run Segment Anything。等分割图出来后用画笔点选衣服区域。注意不要涂满每个部位点一个点就行。然后点击 Create Mask。第二步检查蒙版。如果发现肩带没被选中回到分割图补一个点再重新创建蒙版。确认蒙版覆盖完整后点击 Send to img2img。第三步在图生图页面确认蒙版已经加载。点击 Auto Detect Size 让尺寸匹配原图。选择模型输入 prompt比如 Woman wearing a black silk dress, elegant, high quality。设置生成数量为 4。第四步点击生成。等结果出来后对比四张图。如果发现肢体错位检查 OpenPose 的权重是否太低。如果边缘融合不好调高 mask_blur 或者降低 denoising_strength。单图跑通后就可以用 API 批量测试了。下面是一个 Python 脚本示例import requests import base64 import json API_URL https://taotoken.net/api/v1/images/edits API_KEY YOUR_API_KEY def batch_inpaint(image_path, mask_path, prompt, num_images4): with open(image_path, rb) as f: image_data base64.b64encode(f.read()).decode() with open(mask_path, rb) as f: mask_data base64.b64encode(f.read()).decode() payload { model: sdxl-inpaint, image: image_data, mask: mask_data, prompt: prompt, n: num_images, size: 1024x1024, denoising_strength: 0.75 } headers { Authorization: fBearer {API_KEY}, Content-Type: application/json } response requests.post(API_URL, headersheaders, jsonpayload) if response.status_code 200: result response.json() for i, img in enumerate(result[data]): with open(foutput_{i}.png, wb) as f: f.write(base64.b64decode(img[b64_json])) print(fGenerated {len(result[data])} images) else: print(fError: {response.status_code}, {response.text}) batch_inpaint(model.jpg, mask.png, Woman wearing a red floral dress)这个脚本会把原图和蒙版转成 base64然后发给 TaoToken 的 API。返回的图片会保存到本地。你可以改 prompt 来测试不同服装效果。验证成功的标志是生成的图片中人物姿态和原图一致衣服区域被替换边缘没有明显接缝。如果出现 reading choices 错误说明 API 返回格式不对检查模型 ID 是否正确。5. 常见错排查401、local proxy failed、OAuth 报错对照这一节列出我踩过的坑和解决方案。401 Unauthorized最常见的原因是 Key 复制不完整或者过期。检查 Key 是否有多余空格重新生成一个再试。如果还是 401确认你的账号是否有权限调用该模型。local proxy failed这个报错通常出现在本地脚本调用 API 时。原因是你的本地网络环境无法直接访问 API 端点。检查你的 requests 库是否走了系统代理或者尝试在脚本里设置proxies{http: None, https: None}来禁用代理。reading choices 错误这是 API 返回格式解析失败。通常是因为你用的模型 ID 不对或者请求体里缺少必要字段。检查 model 字段是否拼写正确比如 sdxl-inpaint 不要写成 sdxl_inpaint。OAuth token expired如果你用的是 OAuth 方式认证token 有效期通常只有几小时。重新获取 token 即可。建议用 API Key 方式不会过期。蒙版边缘有灰边这不是报错但很常见。解决方案是降低 denoising_strength 到 0.65或者增加 mask_blur 到 8。另外检查 inpainting_fill 是否设为 1原图填充。换装后肢体错位检查 OpenPose 的 preprocessor 是否选了 openpose_full这个会检测手部和面部关键点。如果只选 openpose手指容易崩。服装图案不生效IP-Adapter 的权重可能太低调到 1.0 试试。另外确认参考图的分辨率不要太小至少 512x512。如果你在配置 ControlNet 时遇到 model not found检查模型文件是否放在正确的目录extensions/sd-webui-controlnet/models/。文件名要和配置里写的一致。6. 语义一致 CTA用 TaoToken 把换装流程脚本化单张换装调好后下一步就是批量跑。手动在 WebUI 里点来点去效率太低用 API 脚本可以一次测试几十种服装组合。具体做法是把 Inpaint Anything 生成的蒙版保存下来然后用 Python 脚本循环调用 TaoToken 的 API。每次改 prompt 里的服装描述比如 red dress、blue jeans、white shirt生成结果自动保存到不同文件夹。如果你需要长期做这类测试建议直接上 Coding PlanAPI 调用额度更充足而且支持并发请求。Coding Plan 的入口在控制台里开通后可以用更高的速率调用。对于需要接入 Claude Code 做自动化脚本的用户TaoToken 也支持 Anthropic 兼容接口。配置方式是设置环境变量export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYYOUR_API_KEY然后在 Claude Code 的 settings.json 里填入对应的 Base URL 和 Key。这样你就能用 Claude 来写换装脚本或者直接调用图像编辑 API。最后提醒一点批量测试时注意控制并发数建议不超过 4 个并发请求否则容易被限流。如果遇到 429 错误加一个 time.sleep(2) 在每次请求之间。整套流程跑下来从蒙版生成到批量换装测试大概需要 10 分钟配置之后每张图生成时间在 15 秒左右。比手动操作快很多而且参数一致结果可复现。