news 2026/7/30 14:19:46

Stable-Diffusion-V1-5 批量处理与自动化脚本编写教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Stable-Diffusion-V1-5 批量处理与自动化脚本编写教程

Stable-Diffusion-V1-5 批量处理与自动化脚本编写教程

你是不是也遇到过这样的场景?需要为新产品生成几十张不同风格的主图,或者为内容创作准备上百张配图,一张一张在WebUI里点“生成”按钮,不仅手累,效率也低得让人抓狂。对于需要大量图片的场景,比如制作数据集、批量生产营销素材,手动操作显然不是长久之计。

今天,我们就来聊聊如何解放双手,用Python写个脚本,让Stable-Diffusion-V1-5自动帮你干活。我会手把手带你,从零开始,搭建一个能读取任务列表、自动调用模型、智能保存结果的“图片生成流水线”。整个过程不复杂,哪怕你Python刚入门,跟着做也能搞定。学完这个,你就能把重复劳动交给机器,自己腾出时间琢磨更重要的创意了。

1. 为什么需要自动化脚本?

在深入代码之前,我们先搞清楚,费劲写脚本到底图个啥。手动操作WebUI界面,适合探索和调试单张图片。但一旦需求变成“批量”和“重复”,它的短板就暴露无遗。

想象一下,你要根据一份包含50个商品描述的Excel表格,生成对应的宣传图。手动操作意味着:复制一个描述到提示词框,调整参数,点击生成,等待,保存图片,重命名,然后再循环下一个… 这个过程不仅极其耗时,还容易因为疲劳而出错,比如保存时命名混乱,或者漏掉某个描述。

自动化脚本的核心价值,就是把上面这个繁琐的流程标准化、程序化。它主要帮我们解决三个痛点:

  • 效率问题:脚本可以7x24小时不间断运行,批量处理成百上千的任务,速度远超人工。
  • 一致性问题:确保每一张图片都使用完全相同的生成参数(如采样器、步数、尺寸),避免人为操作带来的波动,这对于数据集制作至关重要。
  • 可追溯性:脚本可以自动记录每张图片的生成参数和对应的提示词,方便后续查找、分析和复现。

简单说,写一次脚本,是为了以后无数次地“偷懒”。接下来,我们就开始搭建这个“偷懒”工具。

2. 准备工作与环境搭建

工欲善其事,必先利其器。在写脚本之前,我们需要确保运行环境已经就绪。这里假设你已经有一个可以运行的Stable-Diffusion-V1-5环境,无论是通过diffusers库本地部署,还是通过某个API服务(如Automatic1111的WebUI API)来调用。

2.1 核心Python库安装

我们的脚本主要依赖几个Python库。打开你的终端或命令提示符,用pip命令安装它们:

pip install requests pillow pandas
  • requests:这是Python里用来发送HTTP请求的明星库。如果你的Stable-Diffusion是通过WebUI API(例如运行在http://localhost:7860)来调用的,那么就需要用它来和API“对话”。
  • Pillow(PIL):Python的图像处理库。当API返回图片数据给我们时,我们需要用它来打开、处理和保存图片。
  • pandas:数据处理和分析的利器。我们用它来轻松读取和管理包含大量提示词(Prompt)的CSV或Excel文件,比手动写列表方便得多。

如果你的Stable-Diffusion是直接通过diffusers库在Python代码中加载和运行的,那么还需要安装它:

pip install diffusers transformers accelerate torch

不过,为了通用性,本篇教程我们将以更常见的“通过WebUI API调用”作为主要场景,因为它不关心你的模型具体部署在本地还是云端,只要有个API地址就行。

2.2 准备你的“任务清单”

自动化批量生成,首先得有一份清晰的“生产订单”。我们用一个CSV文件来充当这个订单。用Excel或任何文本编辑器创建一个文件,命名为prompt_list.csv,内容如下:

id,prompt,negative_prompt,width,height,steps,cfg_scale 1,a beautiful sunset over a mountain lake, blurry, ugly, 512, 512, 20, 7.5 2,a cyberpunk city street at night, deformed, low quality, 768, 512, 30, 9.0 3,a cute cartoon cat wearing a hat, , 512, 768, 25, 8.0

这个表格的每一行,都定义了一张图片的生成蓝图:

  • id: 任务序号,方便我们追踪。
  • prompt: 正面提示词,描述你想要什么。
  • negative_prompt: 负面提示词,描述你不想要什么(可以为空)。
  • width/height: 生成图片的宽和高。
  • steps: 采样步数,影响细节和生成时间。
  • cfg_scale: 提示词相关性,值越大越遵循你的提示。

有了这份清单,脚本就知道该干什么活了。

3. 编写核心批量生成脚本

现在,进入最核心的部分——编写Python脚本。我们会一步步构建,并解释每一段代码的作用。

3.1 脚本骨架与配置

首先,创建一个新的Python文件,比如叫sd_batch_generate.py。开头部分,我们导入必要的库,并设置一些基础配置。

import requests import pandas as pd from PIL import Image import io import time import os import json # 配置区域 - 根据你的实际情况修改 API_URL = "http://127.0.0.1:7860/sdapi/v1/txt2img" # Stable Diffusion WebUI 的文本生成图片API地址 OUTPUT_DIR = "./generated_images" # 图片输出目录 CSV_FILE = "./prompt_list.csv" # 任务清单CSV文件路径 LOG_FILE = "./generation_log.jsonl" # 日志文件路径 # 创建输出目录 os.makedirs(OUTPUT_DIR, exist_ok=True)

代码解释

  • 我们导入了之前安装的所有库。
  • API_URL:这是最关键的一个配置。它指向你运行的Stable-Diffusion WebUI的API接口。默认情况下,本地运行的WebUI地址就是http://127.0.0.1:7860
  • OUTPUT_DIR:指定一个文件夹,所有生成的图片都会保存到这里。
  • CSV_FILELOG_FILE:定义了我们的任务来源和日志记录位置。
  • os.makedirs(..., exist_ok=True):这行代码会创建输出目录,如果目录已经存在也不会报错。

3.2 构建API请求函数

接下来,我们写一个函数,它的职责就是和Stable-Diffusion API“沟通”,发送生成请求并拿回图片。

def generate_image(prompt, negative_prompt, width, height, steps, cfg_scale, sampler_name="Euler a"): """ 调用Stable Diffusion API生成单张图片。 参数: prompt: 正面提示词 negative_prompt: 负面提示词 width, height: 图片尺寸 steps: 采样步数 cfg_scale: 提示词相关性 sampler_name: 采样器名称,默认'Euler a' 返回: image: PIL Image对象,生成的图片 info: 字典,包含生成参数等信息 """ # 1. 构造请求数据(JSON格式) payload = { "prompt": prompt, "negative_prompt": negative_prompt, "width": width, "height": height, "steps": steps, "cfg_scale": cfg_scale, "sampler_name": sampler_name, "batch_size": 1, # 一次生成一张 } # 2. 发送POST请求到API try: response = requests.post(url=API_URL, json=payload) response.raise_for_status() # 如果请求失败(如4xx, 5xx错误),抛出异常 except requests.exceptions.RequestException as e: print(f"API请求失败: {e}") return None, None # 3. 解析API返回的JSON数据 r = response.json() # 4. 从返回数据中提取图片(Base64编码格式) image_data = r['images'][0] # 5. 将Base64图片数据解码为PIL Image对象 image = Image.open(io.BytesIO(requests.utils.base64.b64decode(image_data.split(",",1)[0]))) # 6. 提取生成信息(可选,用于日志记录) info = r.get('info', {}) return image, info

关键点说明

  • payload字典包含了所有控制图片生成的参数,这些参数和你在WebUI界面上看到的是一一对应的。
  • requests.post发送一个HTTP POST请求,并将我们的参数以JSON格式传递过去。
  • API成功后会返回一个JSON响应,其中images字段里就包含了生成图片的Base64编码数据。
  • 我们通过一系列操作,将这段编码数据还原成PIL库可以处理的图片对象。
  • 函数最后返回图片对象和生成信息,方便后续使用。

3.3 主循环:读取任务并批量处理

有了单次生成函数,我们就可以构建一个循环,来逐个处理CSV文件里的所有任务了。

def main(): # 1. 读取任务清单CSV文件 try: df = pd.read_csv(CSV_FILE) print(f"成功加载任务清单,共 {len(df)} 个任务。") except FileNotFoundError: print(f"错误:找不到CSV文件 '{CSV_FILE}',请检查路径。") return # 2. 打开日志文件,准备记录(使用jsonl格式,每行一个JSON记录) log_entries = [] # 3. 循环处理每一行(每一个生成任务) for index, row in df.iterrows(): task_id = row.get('id', index + 1) # 使用CSV中的id,如果没有则用行号 prompt = str(row['prompt']).strip() negative_prompt = str(row.get('negative_prompt', '')).strip() width = int(row.get('width', 512)) height = int(row.get('height', 512)) steps = int(row.get('steps', 20)) cfg_scale = float(row.get('cfg_scale', 7.5)) print(f"\n--- 开始处理任务 {task_id} ---") print(f"提示词: {prompt[:50]}...") # 只打印前50个字符,避免刷屏 # 4. 调用生成函数 start_time = time.time() image, gen_info = generate_image(prompt, negative_prompt, width, height, steps, cfg_scale) elapsed_time = time.time() - start_time if image is None: print(f"任务 {task_id} 生成失败,跳过。") continue # 5. 保存生成的图片 # 生成一个包含任务ID和提示词前几个单词的文件名 prompt_snippet = "_".join(prompt.split()[:3]) # 取提示词前三个词 filename = f"{task_id:03d}_{prompt_snippet}.png" filepath = os.path.join(OUTPUT_DIR, filename) image.save(filepath) print(f"图片已保存至: {filepath}") print(f"生成耗时: {elapsed_time:.2f} 秒") # 6. 记录日志 log_entry = { "task_id": task_id, "prompt": prompt, "negative_prompt": negative_prompt, "width": width, "height": height, "steps": steps, "cfg_scale": cfg_scale, "output_file": filename, "generation_time": elapsed_time, "info": gen_info # 包含了种子(seed)等详细信息 } log_entries.append(log_entry) # 7. 可选:添加短暂延迟,避免对API造成过大压力 time.sleep(0.5) # 8. 所有任务完成后,将日志写入文件 if log_entries: with open(LOG_FILE, 'w', encoding='utf-8') as f: for entry in log_entries: f.write(json.dumps(entry, ensure_ascii=False) + '\n') print(f"\n所有任务完成!日志已保存至: {LOG_FILE}") else: print("\n没有任务被成功执行。") if __name__ == "__main__": main()

脚本工作流程梳理

  1. 读清单:用pandas读取CSV,把任务列表加载到程序里。
  2. 开日志:准备一个列表,用来记录每张图片的“出生证明”。
  3. 循环干:对CSV里的每一行,提取出提示词、尺寸等参数。
  4. 去生成:调用我们写好的generate_image函数,把参数发给Stable-Diffusion,等着它“画”好。
  5. 存图片:图片回来后,给它起个有意义的文件名(结合任务ID和提示词),保存到指定文件夹。
  6. 记一笔:把这次任务的所有参数、用的时间、生成的图片文件名,都详细记下来。
  7. 歇一下:稍微等零点几秒再处理下一个,让API喘口气,也更稳定。
  8. 写日志:所有活干完后,把刚才记的“流水账”统一写到日志文件里,方便以后查。

4. 运行脚本与查看结果

脚本写好了,怎么让它跑起来呢?

  1. 确保API服务已启动:首先,启动你的Stable-Diffusion WebUI。通常是在命令行进入其目录,运行python launch.py或相应的启动命令。确保它完全启动并监听在7860端口。
  2. 准备文件:将你的prompt_list.csv文件放在和sd_batch_generate.py脚本相同的目录下。
  3. 运行脚本:在终端中,导航到脚本所在目录,运行:
    python sd_batch_generate.py
  4. 观察输出:你会在终端看到类似下面的信息,实时了解生成进度:
    成功加载任务清单,共 3 个任务。 --- 开始处理任务 1 --- 提示词: a beautiful sunset over a mountain lake... 图片已保存至: ./generated_images/001_a_beautiful_sunset.png 生成耗时: 4.23 秒 --- 开始处理任务 2 --- ...
  5. 查看成果:脚本运行完毕后,打开./generated_images文件夹,你就能看到所有生成好的图片。同时,根目录下会生成一个generation_log.jsonl文件,里面记录了每张图片的详细生成参数。

5. 脚本进阶与优化建议

基础的流水线跑通了,但一个健壮的脚本还需要考虑更多。这里给你几个优化方向,让你的脚本更好用、更强大。

5.1 增加错误处理与重试

网络请求可能失败,API也可能偶尔“闹脾气”。我们可以让脚本更“坚韧”。

def generate_image_with_retry(prompt, max_retries=3, **kwargs): """带重试机制的生成函数""" for attempt in range(max_retries): try: image, info = generate_image(prompt, **kwargs) if image is not None: return image, info except Exception as e: print(f"生成失败 (尝试 {attempt+1}/{max_retries}): {e}") time.sleep(2) # 失败后等待2秒再重试 print(f"提示词 '{prompt[:30]}...' 在 {max_retries} 次尝试后仍失败。") return None, None

在主循环中,用这个新的带重试的函数替换原来的generate_image调用。

5.2 支持更多生成参数

我们的CSV和脚本目前只包含了最基础的参数。你可以根据需要轻松扩展,比如控制生成批次、使用不同的模型或VAE、设置高清修复(Hires. fix)参数等。只需要在CSV中增加对应的列(如sampler_name,seed,hires_upscale等),并在payload字典和日志记录中添加它们即可。

5.3 从更多数据源读取任务

任务清单不一定非得是CSV。你可以修改脚本,让它从JSON文件、数据库,甚至一个在线表格(如通过Google Sheets API)读取任务。pandas库支持读取多种格式,这给了你很大的灵活性。

5.4 添加进度提示

对于处理成百上千个任务的长时间运行,一个进度条能极大提升体验。你可以使用tqdm这个库来轻松实现。

pip install tqdm

然后在主循环处稍作修改:

from tqdm import tqdm # ... 在main函数内,替换原有的for循环 ... for index, row in tqdm(df.iterrows(), total=len(df), desc="批量生成进度"): # 循环体内的代码不变 ...

这样,运行时终端就会显示一个美观的进度条,让你清楚知道完成了多少,还剩多少。

6. 总结

走完这一趟,你会发现,为Stable-Diffusion编写自动化脚本并没有想象中那么神秘。核心逻辑就是“读取任务 -> 调用API -> 保存结果”的循环。这个简单的脚本框架,已经能帮你应对绝大多数批量生成的场景了。

实际用起来,最大的好处就是省心。你可以晚上睡觉前把脚本跑起来,指定好一个有几百个提示词的清单,第二天早上起来,所有图片就已经整整齐齐地躺在文件夹里了,附带详细的生成日志。无论是做实验需要大量对比图,还是运营需要周期性生产内容素材,这套方法都能把你从重复劳动中解放出来。

当然,这个脚本只是一个起点。你可以根据自己的需求,把它变得更加强大和智能,比如加入自动审核图片质量的逻辑,或者与你的素材管理系统对接。希望这个教程能帮你打开思路,把更多精力投入到创意和决策上,让机器去处理那些繁琐的重复性工作。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 14:51:18

基于DAMOYOLO-S的AGV视觉导航系统:实时障碍物检测与避障

基于DAMOYOLO-S的AGV视觉导航系统:实时障碍物检测与避障 你有没有想过,那些在仓库里穿梭自如、能自动避开行人和货物的搬运小车,是怎么“看见”世界的?它们不像人一样有眼睛,却要做出同样复杂的判断:前面是…

作者头像 李华
网站建设 2026/7/14 14:51:31

自然语言编程新范式:Open Interpreter技术指南

自然语言编程新范式:Open Interpreter技术指南 【免费下载链接】open-interpreter 项目地址: https://gitcode.com/GitHub_Trending/ope/open-interpreter 在软件开发领域,开发者常常面临这样的困境:需要频繁在自然语言需求与代码实现…

作者头像 李华
网站建设 2026/7/20 3:40:58

算法设计与分析-习题10.2

目录 1.由于最大流量算法需要从两个方向来处理边,我们对网络的邻接矩阵表示法做如下修改会更方便。如果从顶点i到顶点j有一条容量为u₀的有向边,那么第i行和第j列的元素设为u₀,而第j行和第i列的元素设为-u₀;如果顶点i和j之间没有…

作者头像 李华
网站建设 2026/7/14 14:51:31

CompreFace开源人脸识别:企业级部署的完整策略指南

CompreFace开源人脸识别:企业级部署的完整策略指南 【免费下载链接】CompreFace Leading free and open-source face recognition system 项目地址: https://gitcode.com/gh_mirrors/co/CompreFace 在当今数字化时代,人脸识别技术已成为身份验证、…

作者头像 李华
网站建设 2026/7/14 14:51:29

foobox-cn终极方案:专业级foobar2000深度定制与界面美化完全指南

foobox-cn终极方案:专业级foobar2000深度定制与界面美化完全指南 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 还在忍受foobar2000单调的默认界面吗?foobox-cn作为专为fooba…

作者头像 李华