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

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 pandasrequests这是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_okTrue)代码解释我们导入了之前安装的所有库。API_URL这是最关键的一个配置。它指向你运行的Stable-Diffusion WebUI的API接口。默认情况下本地运行的WebUI地址就是http://127.0.0.1:7860。OUTPUT_DIR指定一个文件夹所有生成的图片都会保存到这里。CSV_FILE和LOG_FILE定义了我们的任务来源和日志记录位置。os.makedirs(..., exist_okTrue)这行代码会创建输出目录如果目录已经存在也不会报错。3.2 构建API请求函数接下来我们写一个函数它的职责就是和Stable-Diffusion API“沟通”发送生成请求并拿回图片。def generate_image(prompt, negative_prompt, width, height, steps, cfg_scale, sampler_nameEuler 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(urlAPI_URL, jsonpayload) response.raise_for_status() # 如果请求失败如4xx, 5xx错误抛出异常 except requests.exceptions.RequestException as e: print(fAPI请求失败: {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, encodingutf-8) as f: for entry in log_entries: f.write(json.dumps(entry, ensure_asciiFalse) \n) print(f\n所有任务完成日志已保存至: {LOG_FILE}) else: print(\n没有任务被成功执行。) if __name__ __main__: main()脚本工作流程梳理读清单用pandas读取CSV把任务列表加载到程序里。开日志准备一个列表用来记录每张图片的“出生证明”。循环干对CSV里的每一行提取出提示词、尺寸等参数。去生成调用我们写好的generate_image函数把参数发给Stable-Diffusion等着它“画”好。存图片图片回来后给它起个有意义的文件名结合任务ID和提示词保存到指定文件夹。记一笔把这次任务的所有参数、用的时间、生成的图片文件名都详细记下来。歇一下稍微等零点几秒再处理下一个让API喘口气也更稳定。写日志所有活干完后把刚才记的“流水账”统一写到日志文件里方便以后查。4. 运行脚本与查看结果脚本写好了怎么让它跑起来呢确保API服务已启动首先启动你的Stable-Diffusion WebUI。通常是在命令行进入其目录运行python launch.py或相应的启动命令。确保它完全启动并监听在7860端口。准备文件将你的prompt_list.csv文件放在和sd_batch_generate.py脚本相同的目录下。运行脚本在终端中导航到脚本所在目录运行python sd_batch_generate.py观察输出你会在终端看到类似下面的信息实时了解生成进度成功加载任务清单共 3 个任务。 --- 开始处理任务 1 --- 提示词: a beautiful sunset over a mountain lake... 图片已保存至: ./generated_images/001_a_beautiful_sunset.png 生成耗时: 4.23 秒 --- 开始处理任务 2 --- ...查看成果脚本运行完毕后打开./generated_images文件夹你就能看到所有生成好的图片。同时根目录下会生成一个generation_log.jsonl文件里面记录了每张图片的详细生成参数。5. 脚本进阶与优化建议基础的流水线跑通了但一个健壮的脚本还需要考虑更多。这里给你几个优化方向让你的脚本更好用、更强大。5.1 增加错误处理与重试网络请求可能失败API也可能偶尔“闹脾气”。我们可以让脚本更“坚韧”。def generate_image_with_retry(prompt, max_retries3, **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生成失败 (尝试 {attempt1}/{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(), totallen(df), desc批量生成进度): # 循环体内的代码不变 ...这样运行时终端就会显示一个美观的进度条让你清楚知道完成了多少还剩多少。6. 总结走完这一趟你会发现为Stable-Diffusion编写自动化脚本并没有想象中那么神秘。核心逻辑就是“读取任务 - 调用API - 保存结果”的循环。这个简单的脚本框架已经能帮你应对绝大多数批量生成的场景了。实际用起来最大的好处就是省心。你可以晚上睡觉前把脚本跑起来指定好一个有几百个提示词的清单第二天早上起来所有图片就已经整整齐齐地躺在文件夹里了附带详细的生成日志。无论是做实验需要大量对比图还是运营需要周期性生产内容素材这套方法都能把你从重复劳动中解放出来。当然这个脚本只是一个起点。你可以根据自己的需求把它变得更加强大和智能比如加入自动审核图片质量的逻辑或者与你的素材管理系统对接。希望这个教程能帮你打开思路把更多精力投入到创意和决策上让机器去处理那些繁琐的重复性工作。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。