批量图生图怎么做?用 Diffusers 保留输入映射并比较重绘强度

按文件夹逐张图生图,保留原图哈希、预处理图片和输入输出清单,比较两档重绘强度,并记录失败与恢复规则。

批量图生图最容易出的问题,不是少写一个提示词,而是结果与原图对应不上、覆盖文件,以及调参数时同时改变太多条件。下面用 Diffusers 逐张处理文件夹中的自有图片,为每张生成两档 strength,保存原文件哈希、预处理图和输入输出清单。

本文面向会用 Python、需要对多张图片尝试同一种风格的用户。依据 2026 年 10 月 1 日核对的 Diffusers 0.35.1 文档编写;未下载模型进行批量推理,未测试吞吐量或显存。脚本采用逐张推理,不代表并行速度优化方案。

批量图生图怎么做?用 Diffusers 保留输入映射并比较重绘强度

准备输入目录,先决定裁切是否可以接受

建立 inputs 文件夹,放入 JPG 或 PNG 原图。代码先按 EXIF 方向转正,再用居中裁切变成 512×512 的 prepared 图;这会丢掉长方形边缘。人物和产品不能被裁切时,先手动补边成方图,或改用符合任务的尺寸方案。AI 结果应与 prepared 图比较,不能把预处理裁掉的部分误认为模型删除。

按 PyTorch 安装页安装与你驱动匹配的 CUDA 版本,再在同一环境执行检查和依赖安装。检查为 False 时先修环境。

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

重绘强度控制什么

官方图生图指南说明,strength 越高,一般越偏离初始图片;越低通常越接近初始图。它还影响实际噪声与去噪流程,所以设定相同 num_inference_steps 不代表不同 strength 的实际工作完全相同。

本例比较 0.35 与 0.70;它们是教学起点,不承诺“0.35 一定保真”或“0.70 一定更好”。如果只是调色且需要产品形状与文字准确,生成式图生图可能改变这些细节,不能替代严谨的修图操作。

保存脚本,逐张处理并留下映射

保存为 batch_img2img.py,再运行 python batch_img2img.py。每次建立新的 runs 子目录;每个输出文件以输入序号和强度命名,原文件不会被覆盖。若某一张失败,mapping.json 会记录该文件与错误,其他图片继续处理。

from pathlib import Path
from datetime import datetime, timezone
import hashlib
import json
import torch
from PIL import Image, ImageOps
from diffusers import AutoPipelineForImage2Image

files = sorted(p for p in Path("inputs").iterdir()
               if p.is_file() and p.suffix.lower() in {".png", ".jpg", ".jpeg"})
if not files:
    raise ValueError("inputs中没有支持的图片")
run = Path("runs") / datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%S%fZ")
run.mkdir(parents=True, exist_ok=False)
model_id = "stable-diffusion-v1-5/stable-diffusion-v1-5"
pipe = AutoPipelineForImage2Image.from_pretrained(
    model_id, torch_dtype=torch.float16,
    variant="fp16", use_safetensors=True,
)
pipe.enable_model_cpu_offload()
prompt = "watercolor illustration, soft colors, clean background"
records = []
for index, source in enumerate(files, start=1):
    record = {"input": str(source), "index": index,
              "sha256": hashlib.sha256(source.read_bytes()).hexdigest(),
              "model": model_id, "prompt": prompt, "seed": 42,
              "steps": 30, "guidance_scale": 7.5, "outputs": []}
    try:
        with Image.open(source) as opened:
            original = ImageOps.exif_transpose(opened).convert("RGB")
            record["original_size"] = list(original.size)
            prepared = ImageOps.fit(original, (512, 512),
                                    method=Image.Resampling.LANCZOS)
        prep_name = f"{index:04d}_prepared.png"
        prepared.save(run / prep_name)
        record["prepared"] = prep_name
        for strength in (0.35, 0.70):
            image = pipe(
                prompt=prompt, image=prepared, strength=strength,
                num_inference_steps=30, guidance_scale=7.5,
                generator=torch.Generator(device="cpu").manual_seed(42),
            ).images[0]
            name = f"{index:04d}_s{strength:.2f}.png"
            image.save(run / name)
            record["outputs"].append({"strength": strength, "file": name})
        record["status"] = "completed"
    except Exception as error:
        record["status"] = "failed"
        record["error"] = f"{type(error).__name__}: {error}"
    records.append(record)
    (run / "mapping.json").write_text(
        json.dumps(records, ensure_ascii=False, indent=2), encoding="utf-8",
    )
print("结果目录:", run)
print("完成:", sum(r["status"] == "completed" for r in records), "输入:", len(files))

代码在每次生成前重新创建相同种子的 Generator。官方随机种子指南说明,复用同一个 Generator 对象会推进随机状态;只在循环外设一次种子,不能保证两档参数从同一状态开始。同一种子也不保证跨硬件或不同框架版本逐像素相同。

用 mapping.json 检查完整性和质量

先打开 mapping.json,条目数应等于受支持的输入文件数;每个 completed 条目应有两个可打开的结果和一个 prepared 图。failed 条目可能已经保存第一张结果,要按 outputs 字段核对,不能只看目录里文件很多就当全部成功。

例如输入中有三张受支持图片且三张都成功,按脚本约定应有六张生成图和三张 prepared 图。这是检查规则的算术示例,不是本次运行统计。中途被终止的任务可能只留下前面已记录的输入;清单不足时须补齐处理,不能用打印过的“结果目录”判断完成。

  • 对照 prepared 图检查主体轮廓、关键文字与数量。水彩风格更明显却多出物体,应淘汰该结果。
  • 比较同一 input 的两个 strength,先判断变化是否满足用途,再决定后续统一采用哪档。
  • 检查原文件哈希与当前文件一致,确认加工期间素材没有被替换;需要重跑时使用新目录保留旧结果。

失败后怎样恢复

损坏图片先修复或移出 inputs;GPU 显存不足先减小批次中的输入规模并检查占用,但逐张处理已经不等于所有权重能装入设备。首次权重下载失败先核对网络和缓存。全局环境错误时应停止整批,修好后再跑,不继续产生大量相同失败记录。

底模使用条件见 SD 1.5 模型卡,输入图也需要具备使用权。本流程用于视觉风格试验,不能保证商品文字、人物或事实场景准确。

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

赞 (0)
AI小管家的头像AI小管家
绘图 LoRA 用在哪?在 Diffusers 中加载并核对底模与权重
上一篇 2小时前
RIFE 视频补帧怎么做?生成中间帧并核对帧率、时长与音轨
下一篇 2小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

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

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