资讯动态

Z-Image-Turbo-辉夜巫女实操手册:批量生成脚本编写、CSV提示词导入与结果自动归档

发布时间:2026/8/3 5:32:04 来源:尧图企业网站定制
Z-Image-Turbo-辉夜巫女实操手册批量生成脚本编写、CSV提示词导入与结果自动归档你是不是也遇到过这样的烦恼想用AI模型生成一批辉夜巫女的图片却只能一张一张手动输入提示词生成一张保存一张效率低得让人抓狂。特别是当你想测试不同风格、不同场景的提示词组合时这种重复劳动简直让人崩溃。今天我就来分享一套完整的自动化解决方案。我们将基于已经部署好的Z-Image-Turbo-辉夜巫女模型编写一个Python脚本实现从CSV文件批量读取提示词、自动调用模型生成图片并将结果按规则自动归档保存。整个过程无需人工干预让你从繁琐的重复操作中解放出来专注于创意和提示词的优化。1. 环境准备与脚本基础框架在开始编写脚本之前我们需要先确认环境已经就绪并搭建好脚本的基础框架。1.1 确认模型服务状态首先确保你的Z-Image-Turbo-辉夜巫女模型服务已经通过Xinference成功部署并启动。你可以通过以下命令检查服务日志cat /root/workspace/xinference.log如果看到类似下面的输出说明服务已经启动成功INFO: Uvicorn running on http://0.0.0.0:9997 (Press CTRLC to quit) INFO: Started server process [1234] INFO: Waiting for application startup. INFO: Application startup complete.服务启动后你可以通过Web UI界面通常位于http://你的服务器IP:7860进行手动测试确保模型能够正常生成图片。1.2 安装必要的Python库我们的脚本需要用到几个Python库如果还没有安装可以通过pip安装pip install requests pandas pillowrequests用于向模型服务的API发送请求pandas用于读取和处理CSV文件中的提示词Pillow用于处理生成的图片可选用于图片格式转换等1.3 创建脚本基础框架让我们先创建一个基础的Python脚本框架#!/usr/bin/env python3 # -*- coding: utf-8 -*- Z-Image-Turbo-辉夜巫女批量图片生成脚本 功能从CSV文件读取提示词批量生成图片并自动归档 作者技术博客 日期2024年 import os import time import requests import pandas as pd from datetime import datetime import json class BatchImageGenerator: 批量图片生成器 def __init__(self, api_url, output_dir./output): 初始化生成器 参数 api_url: 模型API地址 output_dir: 输出目录 self.api_url api_url self.output_dir output_dir self.setup_directories() def setup_directories(self): 创建必要的目录结构 os.makedirs(self.output_dir, exist_okTrue) print(f输出目录已创建: {self.output_dir}) def generate_single_image(self, prompt, **kwargs): 生成单张图片待实现 pass def batch_generate_from_csv(self, csv_path): 从CSV文件批量生成待实现 pass def save_image(self, image_data, filename): 保存图片待实现 pass if __name__ __main__: # 这里将填写实际的API地址 API_URL http://localhost:9997/v1/images/generations generator BatchImageGenerator(api_urlAPI_URL) print(批量图片生成器初始化完成)这个框架定义了一个BatchImageGenerator类包含了我们需要的基本功能。接下来我们将逐步实现每个方法。2. 实现单张图片生成功能现在让我们实现最核心的功能——调用模型API生成单张图片。2.1 了解模型API接口首先我们需要知道如何调用Z-Image-Turbo-辉夜巫女模型的API。根据常见的文生图API设计请求通常需要包含以下信息prompt图片描述必填negative_prompt不希望出现在图片中的内容可选width/height图片尺寸可选num_inference_steps生成步数可选guidance_scale引导尺度可选让我们实现generate_single_image方法def generate_single_image(self, prompt, negative_prompt, width512, height512, num_inference_steps20, guidance_scale7.5, seedNone): 生成单张图片 参数 prompt: 图片描述 negative_prompt: 负面提示词 width: 图片宽度 height: 图片高度 num_inference_steps: 生成步数 guidance_scale: 引导尺度 seed: 随机种子用于可重复性 返回 生成的图片数据 # 构建请求数据 payload { prompt: prompt, negative_prompt: negative_prompt, width: width, height: height, num_inference_steps: num_inference_steps, guidance_scale: guidance_scale } # 如果指定了种子添加到请求中 if seed is not None: payload[seed] seed try: # 发送POST请求到API print(f正在生成图片: {prompt[:50]}...) start_time time.time() response requests.post( self.api_url, jsonpayload, headers{Content-Type: application/json}, timeout300 # 5分钟超时 ) # 检查响应状态 if response.status_code 200: elapsed_time time.time() - start_time print(f图片生成成功耗时: {elapsed_time:.2f}秒) # 解析响应假设API返回base64编码的图片 result response.json() if images in result and len(result[images]) 0: # 返回第一张图片的base64数据 return result[images][0] else: print(警告API响应中未找到图片数据) return None else: print(fAPI请求失败: {response.status_code}) print(f错误信息: {response.text}) return None except requests.exceptions.RequestException as e: print(f网络请求异常: {e}) return None except json.JSONDecodeError as e: print(fJSON解析异常: {e}) print(f原始响应: {response.text[:200]}) return None2.2 实现图片保存功能有了图片数据后我们需要将其保存到文件中def save_image(self, image_data, filename, formatpng): 保存图片到文件 参数 image_data: 图片数据base64字符串或字节数据 filename: 文件名不含扩展名 format: 图片格式png/jpg等 返回 保存的文件路径 # 确保输出目录存在 os.makedirs(self.output_dir, exist_okTrue) # 构建完整文件路径 filepath os.path.join(self.output_dir, f{filename}.{format}) try: # 处理base64编码的图片数据 if isinstance(image_data, str) and image_data.startswith(data:image): # 如果是data URL格式提取base64部分 import base64 header, encoded image_data.split(,, 1) image_bytes base64.b64decode(encoded) elif isinstance(image_data, str): # 如果是纯base64字符串 import base64 image_bytes base64.b64decode(image_data) else: # 假设已经是字节数据 image_bytes image_data # 写入文件 with open(filepath, wb) as f: f.write(image_bytes) print(f图片已保存: {filepath}) return filepath except Exception as e: print(f保存图片失败: {e}) return None3. 实现CSV提示词导入功能现在让我们实现从CSV文件读取提示词的功能。我们将设计一个灵活的CSV格式支持多种参数。3.1 设计CSV文件格式创建一个名为prompts.csv的文件内容如下id,prompt,negative_prompt,width,height,seed,style,notes 1,辉夜巫女在樱花树下祈福穿着传统的红白巫女服长发飘飘眼神温柔背景是盛开的樱花树阳光透过花瓣洒下斑驳光影唯美动漫风格,低质量模糊变形丑陋恐怖512,512,42,唯美动漫,测试基本场景 2,辉夜巫女在神社中跳神乐舞动作优雅衣袖飘动周围有点点萤火虫飞舞夜晚场景月光洒在石阶上神秘而宁静,低质量模糊手部变形比例失调512,768,123,神秘夜晚,测试竖版构图 3,辉夜巫女战斗姿态手持御币眼神坚定周围有灵力光效动态感强热血动漫风格,模糊静态平淡缺乏动态感768,512,456,热血战斗,测试横版战斗场景 4,辉夜巫女现代风格穿着改良版巫女服在都市中背景是东京塔赛博朋克元素霓虹灯光,传统背景古老建筑512,512,789,赛博朋克,测试现代融合风格 5,辉夜巫女Q版形象可爱风格大眼睛萌萌的表情适合做表情包,写实恐怖成人内容256,256,321,Q版可爱,测试小尺寸图片这个CSV文件包含了多个字段id: 唯一标识符prompt: 主要提示词negative_prompt: 负面提示词width/height: 图片尺寸seed: 随机种子确保可重复性style: 风格标签用于分类notes: 备注说明3.2 实现CSV读取和批量生成现在实现batch_generate_from_csv方法def batch_generate_from_csv(self, csv_path, start_index0, end_indexNone, delay_between_requests2): 从CSV文件批量生成图片 参数 csv_path: CSV文件路径 start_index: 开始索引从0开始 end_index: 结束索引None表示到最后 delay_between_requests: 请求间隔秒避免服务器过载 返回 生成结果列表 # 读取CSV文件 try: df pd.read_csv(csv_path) print(f成功读取CSV文件共{len(df)}条提示词) except Exception as e: print(f读取CSV文件失败: {e}) return [] # 确定处理范围 if end_index is None or end_index len(df): end_index len(df) results [] # 遍历每一行数据 for i in range(start_index, end_index): row df.iloc[i] print(f\n{*50}) print(f处理第 {i1}/{end_index} 条提示词 (ID: {row.get(id, i1)})) print(f提示词: {row.get(prompt, )[:80]}...) # 提取参数 prompt row.get(prompt, ) if not prompt: print(警告提示词为空跳过) continue # 构建生成参数 params { prompt: prompt, negative_prompt: row.get(negative_prompt, ), width: int(row.get(width, 512)), height: int(row.get(height, 512)), } # 处理种子参数 seed_str str(row.get(seed, )).strip() if seed_str and seed_str.lower() ! nan and seed_str ! : try: params[seed] int(float(seed_str)) except: pass # 如果种子无效使用随机种子 # 生成图片 image_data self.generate_single_image(**params) if image_data: # 生成文件名包含时间戳和ID timestamp datetime.now().strftime(%Y%m%d_%H%M%S) style str(row.get(style, default)).replace(/, _) filename f{timestamp}_id{row.get(id, i1)}_{style} # 保存图片 saved_path self.save_image(image_data, filename) # 记录结果 result { id: row.get(id, i1), prompt: prompt, filename: filename, saved_path: saved_path, params: params, timestamp: timestamp, style: style, notes: row.get(notes, ) } results.append(result) # 保存结果到日志文件 self.save_generation_log(result) else: print(f生成失败: ID {row.get(id, i1)}) # 延迟一段时间避免服务器压力过大 if i end_index - 1: print(f等待 {delay_between_requests} 秒后继续...) time.sleep(delay_between_requests) print(f\n{*50}) print(f批量生成完成成功生成 {len(results)}/{end_index-start_index} 张图片) return results def save_generation_log(self, result): 保存生成日志 log_file os.path.join(self.output_dir, generation_log.csv) # 如果日志文件不存在创建并写入表头 if not os.path.exists(log_file): with open(log_file, w, encodingutf-8) as f: f.write(id,prompt,filename,saved_path,width,height,seed,style,notes,timestamp\n) # 追加日志 with open(log_file, a, encodingutf-8) as f: f.write(f{result[id]},\{result[prompt]}\,{result[filename]}, f{result[saved_path]},{result[params].get(width, 512)}, f{result[params].get(height, 512)},{result[params].get(seed, )}, f{result[style]},\{result[notes]}\,{result[timestamp]}\n)4. 实现智能结果自动归档为了让生成的结果更有条理我们需要实现一个智能的归档系统能够根据图片的风格、尺寸等属性自动分类保存。4.1 创建智能归档系统让我们扩展脚本添加自动归档功能def organize_output_by_style(self, results): 根据风格自动归档图片 参数 results: 生成结果列表 返回 归档统计信息 if not results: print(没有生成结果可供归档) return {} # 创建风格分类目录 style_stats {} for result in results: style result.get(style, unknown) style_dir os.path.join(self.output_dir, styles, style) os.makedirs(style_dir, exist_okTrue) # 移动图片到对应风格目录 if result.get(saved_path) and os.path.exists(result[saved_path]): filename os.path.basename(result[saved_path]) new_path os.path.join(style_dir, filename) # 移动文件 import shutil shutil.move(result[saved_path], new_path) # 更新日志中的路径 result[saved_path] new_path # 统计 if style not in style_stats: style_stats[style] 0 style_stats[style] 1 # 打印归档统计 print(\n图片归档完成按风格分类统计) for style, count in style_stats.items(): print(f {style}: {count} 张图片) return style_stats def organize_output_by_size(self, results): 根据图片尺寸自动归档 参数 results: 生成结果列表 返回 归档统计信息 if not results: print(没有生成结果可供归档) return {} # 创建尺寸分类目录 size_stats {} for result in results: width result[params].get(width, 512) height result[params].get(height, 512) size_key f{width}x{height} size_dir os.path.join(self.output_dir, sizes, size_key) os.makedirs(size_dir, exist_okTrue) # 移动图片到对应尺寸目录 if result.get(saved_path) and os.path.exists(result[saved_path]): filename os.path.basename(result[saved_path]) new_path os.path.join(size_dir, filename) # 移动文件 import shutil shutil.move(result[saved_path], new_path) # 更新日志中的路径 result[saved_path] new_path # 统计 if size_key not in size_stats: size_stats[size_key] 0 size_stats[size_key] 1 # 打印归档统计 print(\n图片归档完成按尺寸分类统计) for size, count in size_stats.items(): print(f {size}: {count} 张图片) return size_stats def generate_preview_html(self, results): 生成预览HTML页面方便查看所有生成的图片 参数 results: 生成结果列表 if not results: print(没有生成结果可供生成预览) return html_file os.path.join(self.output_dir, preview.html) html_content !DOCTYPE html html head meta charsetutf-8 title辉夜巫女图片生成预览/title style body { font-family: Arial, sans-serif; margin: 20px; background: #f5f5f5; } .container { max-width: 1400px; margin: 0 auto; } .header { text-align: center; margin-bottom: 30px; } .header h1 { color: #333; } .stats { background: white; padding: 15px; border-radius: 5px; margin-bottom: 20px; } .image-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; } .image-card { background: white; border-radius: 8px; overflow: hidden; box-shadow: 0 2px 10px rgba(0,0,0,0.1); } .image-card img { width: 100%; height: 300px; object-fit: cover; } .image-info { padding: 15px; } .image-info h3 { margin: 0 0 10px 0; color: #333; font-size: 14px; } .image-info p { margin: 5px 0; color: #666; font-size: 12px; } .prompt { background: #f9f9f9; padding: 10px; border-radius: 4px; margin-top: 10px; font-size: 11px; } .tag { display: inline-block; background: #e0e0e0; padding: 2px 8px; border-radius: 10px; font-size: 11px; margin-right: 5px; } /style /head body div classcontainer div classheader h1辉夜巫女图片生成预览/h1 p共生成 str(len(results)) 张图片 | 生成时间: datetime.now().strftime(%Y-%m-%d %H:%M:%S) /p /div div classstats h3生成统计/h3 p总数量: str(len(results)) 张/p /div div classimage-grid # 添加每张图片的卡片 for result in results: if result.get(saved_path) and os.path.exists(result[saved_path]): # 获取相对路径用于HTML显示 rel_path os.path.relpath(result[saved_path], self.output_dir) html_content f div classimage-card img src{rel_path} alt生成的图片 div classimage-info h3ID: {result[id]} - {result[style]}/h3 pspan classtag尺寸/span {result[params].get(width, 512)}x{result[params].get(height, 512)}/p pspan classtag种子/span {result[params].get(seed, 随机)}/p div classprompt{result[prompt][:100]}.../div /div /div html_content /div /div /body /html # 写入HTML文件 with open(html_file, w, encodingutf-8) as f: f.write(html_content) print(f预览页面已生成: {html_file}) return html_file4.2 完善主程序现在让我们完善主程序将所有功能整合起来def main(): 主程序 # 配置参数 API_URL http://localhost:9997/v1/images/generations # 根据实际API地址修改 CSV_FILE prompts.csv # CSV文件路径 OUTPUT_DIR ./output # 输出目录 # 创建生成器实例 generator BatchImageGenerator(api_urlAPI_URL, output_dirOUTPUT_DIR) print( * 60) print(Z-Image-Turbo-辉夜巫女批量图片生成系统) print( * 60) # 检查CSV文件是否存在 if not os.path.exists(CSV_FILE): print(f错误找不到CSV文件 {CSV_FILE}) print(请创建包含提示词的CSV文件或指定正确的文件路径) return # 用户交互选择处理范围 print(f\n找到CSV文件: {CSV_FILE}) try: df pd.read_csv(CSV_FILE) total_prompts len(df) print(fCSV中共有 {total_prompts} 条提示词) # 询问处理范围 print(\n请选择处理范围) print(1. 处理所有提示词) print(2. 处理指定范围的提示词) print(3. 从指定位置开始处理到结束) choice input(请输入选择 (1/2/3): ).strip() start_idx 0 end_idx total_prompts if choice 2: try: start int(input(请输入开始索引 (从0开始): )) end int(input(请输入结束索引 (不包含): )) start_idx max(0, min(start, total_prompts)) end_idx min(end, total_prompts) except: print(输入无效将处理所有提示词) elif choice 3: try: start int(input(请输入开始索引 (从0开始): )) start_idx max(0, min(start, total_prompts)) except: print(输入无效将从开始处理) print(f\n将处理提示词 {start_idx} 到 {end_idx} (共 {end_idx-start_idx} 条)) # 确认开始 confirm input(\n是否开始批量生成(y/n): ).strip().lower() if confirm ! y: print(操作已取消) return # 开始批量生成 print(\n开始批量生成图片...) results generator.batch_generate_from_csv( CSV_FILE, start_indexstart_idx, end_indexend_idx, delay_between_requests3 # 3秒间隔避免服务器压力 ) if results: # 自动归档 print(\n开始自动归档图片...) # 按风格归档 style_stats generator.organize_output_by_style(results) # 按尺寸归档 size_stats generator.organize_output_by_size(results) # 生成预览页面 html_path generator.generate_preview_html(results) print(\n * 60) print(批量生成任务完成) print(f成功生成图片: {len(results)} 张) print(f输出目录: {os.path.abspath(OUTPUT_DIR)}) if html_path: print(f预览页面: {os.path.abspath(html_path)}) print( * 60) # 保存汇总报告 report_path os.path.join(OUTPUT_DIR, generation_report.txt) with open(report_path, w, encodingutf-8) as f: f.write(批量图片生成报告\n) f.write( * 50 \n) f.write(f生成时间: {datetime.now().strftime(%Y-%m-%d %H:%M:%S)}\n) f.write(f总生成数量: {len(results)} 张\n) f.write(fCSV文件: {CSV_FILE}\n) f.write(f处理范围: {start_idx} - {end_idx}\n\n) f.write(按风格统计:\n) for style, count in style_stats.items(): f.write(f {style}: {count} 张\n) f.write(\n按尺寸统计:\n) for size, count in size_stats.items(): f.write(f {size}: {count} 张\n) print(f详细报告已保存: {report_path}) else: print(没有成功生成任何图片请检查API连接和提示词) except Exception as e: print(f程序执行出错: {e}) import traceback traceback.print_exc() if __name__ __main__: main()5. 使用示例与进阶技巧现在我们已经有了完整的脚本让我们看看如何使用它并学习一些进阶技巧。5.1 基本使用步骤准备CSV文件按照前面介绍的格式创建prompts.csv文件配置API地址在脚本中修改API_URL为你的实际API地址运行脚本执行以下命令python batch_generate.py交互操作根据提示选择处理范围确认后开始批量生成5.2 进阶使用技巧5.2.1 使用配置文件为了更方便地管理配置我们可以创建一个配置文件config.json{ api_url: http://localhost:9997/v1/images/generations, output_dir: ./output, default_width: 512, default_height: 512, default_steps: 20, default_guidance: 7.5, request_timeout: 300, delay_between_requests: 3, auto_organize: true, generate_preview: true }然后在脚本中读取配置import json def load_config(config_pathconfig.json): 加载配置文件 default_config { api_url: http://localhost:9997/v1/images/generations, output_dir: ./output, default_width: 512, default_height: 512, default_steps: 20, default_guidance: 7.5, request_timeout: 300, delay_between_requests: 3, auto_organize: true, generate_preview: true } if os.path.exists(config_path): try: with open(config_path, r, encodingutf-8) as f: user_config json.load(f) # 合并配置 default_config.update(user_config) print(f已加载配置文件: {config_path}) except Exception as e: print(f加载配置文件失败使用默认配置: {e}) return default_config5.2.2 错误处理与重试机制在网络不稳定的情况下添加重试机制可以提高成功率def generate_single_image_with_retry(self, prompt, max_retries3, **kwargs): 带重试机制的图片生成 for attempt in range(max_retries): try: result self.generate_single_image(prompt, **kwargs) if result: return result else: print(f第 {attempt1} 次尝试失败准备重试...) time.sleep(2 ** attempt) # 指数退避 except Exception as e: print(f第 {attempt1} 次尝试异常: {e}) if attempt max_retries - 1: wait_time 2 ** attempt print(f等待 {wait_time} 秒后重试...) time.sleep(wait_time) print(f经过 {max_retries} 次尝试后仍然失败) return None5.2.3 进度显示与估计时间添加进度条和剩余时间估计def batch_generate_with_progress(self, csv_path, start_index0, end_indexNone): 带进度显示的批量生成 # ... 读取CSV文件 ... total end_index - start_index start_time time.time() for i in range(start_index, end_index): # 计算进度 progress (i - start_index 1) / total * 100 elapsed time.time() - start_time if i start_index: estimated_total elapsed / (i - start_index) * total remaining estimated_total - elapsed else: remaining 0 print(f\r进度: {i-start_index1}/{total} ({progress:.1f}%) | f已用: {elapsed:.0f}s | 剩余: {remaining:.0f}s, end) # ... 处理当前提示词 ... print(f\n批量生成完成总用时: {time.time()-start_time:.0f}秒)5.3 实际应用场景这个批量生成脚本可以应用于多种实际场景风格测试创建包含不同风格提示词的CSV批量测试模型对各种风格的响应参数优化系统性地测试不同参数组合尺寸、步数、引导尺度等内容创作为漫画、小说、游戏批量生成角色设定图A/B测试生成同一主题的不同变体选择最佳效果数据集构建为机器学习项目批量生成训练数据6. 总结通过本文的教程我们完成了一个完整的Z-Image-Turbo-辉夜巫女批量图片生成系统。这个系统的主要特点和优势包括6.1 核心功能回顾批量处理能力可以从CSV文件读取大量提示词自动批量生成图片大大提高了工作效率灵活的参数配置支持通过CSV文件为每张图片单独设置尺寸、种子、负面提示词等参数智能归档系统自动按风格、尺寸等属性分类保存图片保持文件组织有序可视化预览自动生成HTML预览页面方便快速浏览所有生成结果完整的日志记录记录每次生成的详细信息便于后续分析和复现6.2 使用建议从简单开始初次使用时先创建包含3-5条提示词的CSV文件进行测试逐步增加复杂度熟悉流程后再尝试更复杂的参数组合和更大的批量注意服务器负载根据服务器性能调整请求间隔时间避免过载定期备份结果重要的生成结果建议定期备份到其他存储位置优化提示词通过批量测试找到效果最好的提示词模板提高生成质量6.3 扩展可能性这个脚本框架具有很强的扩展性你可以根据自己的需求进行定制添加更多参数支持更多的模型参数如采样器、CFG尺度等集成其他模型修改API调用部分可以适配其他文生图模型添加质量评估集成自动评分系统筛选出高质量的图片批量后处理添加自动裁剪、调整大小、添加水印等功能云端部署将脚本部署到云服务器实现24小时不间断批量生成批量生成不仅节省了时间更重要的是让你能够系统性地探索模型的潜力。通过精心设计的提示词矩阵你可以发现哪些词汇组合能产生最佳效果哪些参数设置最适合你的需求。这种数据驱动的方法远比手动尝试更加高效和科学。希望这个脚本能帮助你更好地利用Z-Image-Turbo-辉夜巫女模型创作出更多精彩的作品。如果你有任何改进建议或遇到了问题欢迎分享你的经验。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价