Diffusers 局部重绘怎么替换物体?制作蒙版并核对未选区域

用 SDXL Inpainting 替换照片中的指定物体,制作黑白蒙版,生成后合成原图保留区域,并检查像素、接缝和新物体结构。

局部重绘的输入是原图、黑白蒙版和新物体描述。用 Diffusers 运行 SDXL Inpainting,可以让模型在蒙版选定的位置生成替代物;要让未选区域与原图逐像素一致,还应在生成后做一次蒙版合成。下面以自有桌面照片中“把小盒子换成白色陶瓷杯”为学习示例。

本文依据 2026 年 10 月 1 日核对的 Diffusers 0.35.1 文档与模型卡编写,未下载模型进行生成,也没有测试运行速度、显存或生成效果。示例提示词与坐标是演示材料,需要按你的图片修改。

Diffusers 局部重绘怎么替换物体?制作蒙版并核对未选区域

准备原图、环境和编辑范围

需要能够使用 Python 的用户、可用的 NVIDIA CUDA 环境,以及有权编辑的照片。先按 PyTorch 安装页选择与你的系统、驱动匹配的 CUDA 版本,再在同一个 Python 环境运行检查。CPU offload 是把部分模型暂放在 CPU 上节省显存,实际推理仍使用 GPU,不等于纯 CPU 方案。

python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
python -m pip install diffusers==0.35.1 transformers==4.56.2 accelerate==1.10.1 safetensors pillow numpy

检查中的可用性必须为 True;若为 False,先修正 PyTorch 与驱动环境。把原图保存为 input.png,并提前裁成 1024×1024;不要直接把长方形拉成正方形,否则物体比例已经在生成前改变。本文脚本要求这个尺寸,防止坐标与图片错位。第一次加载还需要联网下载权重,磁盘和显存需求取决于实际环境。

制作黑白蒙版,确认白色区域覆盖旧物体

官方局部重绘指南规定:白色区域用于重绘,黑色区域用于保留。示例用矩形选区;真实照片应在图片编辑器中画出贴近物体的蒙版,并包含需要替换的影子。留出适当边缘供模型衔接,但不要把旁边要保留的文字、手或其他物体划入白区。

先运行以下代码保存 mask.png,再把蒙版与 input.png 对照打开。坐标顺序是左、上、右、下,以图片左上角为原点;下面的 360、380、700、800 只适用于示例选区。

from PIL import Image, ImageDraw

base = Image.open("input.png").convert("RGB")
if base.size != (1024, 1024):
    raise ValueError("请先准备1024×1024原图,再确定蒙版坐标")
mask = Image.new("L", base.size, 0)
ImageDraw.Draw(mask).rectangle((360, 380, 700, 800), fill=255)
mask.save("mask.png")

若旧盒子有一部分在黑区,模型会留下那一部分;若全图都白,任务就变成大范围重新生成。先改蒙版,再调提示词,比反复抽取随机结果更有效。

运行局部重绘,并合成未选区域

保存下面代码为 inpaint_demo.py,再运行 python inpaint_demo.py。使用的模型是 diffusers/stable-diffusion-xl-1.0-inpainting-0.1;模型卡给出了 SDXL 管线与 strength 小于 1 的示例,本文采用 0.99。它是教学配置,不代表所有照片的最佳参数。

import torch
import numpy as np
from PIL import Image
from diffusers import AutoPipelineForInpainting

base = Image.open("input.png").convert("RGB")
mask = Image.open("mask.png").convert("L")
if base.size != (1024, 1024) or mask.size != base.size:
    raise ValueError("原图、蒙版必须同为1024×1024")
if set(np.unique(np.array(mask))) != {0, 255}:
    raise ValueError("本例蒙版必须同时包含纯黑与纯白")

pipe = AutoPipelineForInpainting.from_pretrained(
    "diffusers/stable-diffusion-xl-1.0-inpainting-0.1",
    torch_dtype=torch.float16, variant="fp16",
)
pipe.enable_model_cpu_offload()
raw = pipe(
    prompt="a white ceramic mug on a wooden desk, realistic lighting",
    image=base, mask_image=mask, strength=0.99,
    num_inference_steps=25, guidance_scale=7.5,
    generator=torch.Generator(device="cpu").manual_seed(42),
).images[0].convert("RGB")
raw.save("generated_raw.png")
if raw.size != base.size:
    raise ValueError("生成图尺寸与原图不一致")

# 选区用生成图,黑区用原图。这是像素合成,不是模型承诺。
final = Image.composite(raw, base, mask)
final.save("result.png")
outside = np.array(mask) == 0
equal = np.array_equal(np.array(final)[outside], np.array(base)[outside])
print("未选区域逐像素一致:", equal)
if not equal:
    raise RuntimeError("合成检查失败")

怎样判断替换成功

打开 generated_raw.png、result.png 和原图并排查看。程序输出“未选区域逐像素一致: True”只证明合成保留了黑区,不能证明杯子合理。再检查杯口是否闭合、杯身与桌面接触是否自然、光源和投影方向是否一致,以及蒙版边缘有没有截断或明显色差。

硬边蒙版虽然能做严格像素检查,也可能出现接缝。先让选区包含完整物体和必要过渡区域;需要柔化时另存软蒙版再合成,并接受灰色过渡带会混合原图与生成图。不要在已经宣布“完全未改”的范围里悄悄扩大柔化区域。

  • 显存不足:先确认没有其他 GPU 程序占用,并保留 CPU offload;仍失败则换更适合设备的模型配置。本文不承诺固定显存即可运行。
  • 旧物体残留:检查白区是否覆盖它与投影;提示词应该描述新物体,而不是只写“删除盒子”。
  • 黑图或无效结果:查看安全提示与运行错误,换合法且简单的输入排查,不以关闭安全检查作为通用修复。

相关问题

能保证替换后的照片就是现实存在的场景吗?

不能。新物体与遮挡后的内容是生成结果。模型卡说明它不适合生成真实人物或事件的事实记录,模型还可能产生文字、结构和人物细节错误。涉及纪实内容时保留原图,并说明经过生成编辑。

可以把这套配置直接用于商业项目吗?

先核对模型卡链接的 CreativeML Open RAIL++-M 许可、底模条件以及输入图片权利。本文是学习配置,没有替你判断具体商业用途的授权。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31939.html

赞 (0)
AI小管家的头像AI小管家
WPS AI 怎么润色工作通知?保留日期、责任人与例外条件
上一篇 2小时前
线稿怎么用 AI 上色?用 ControlNet 保留轮廓并调整控制强度
下一篇 2小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部