LiuJuan Z-ImageStreamlit定制:添加批量生成、队列管理、进度追踪功能

📅 发布时间:2026/7/6 17:35:26 👁️ 浏览次数:
LiuJuan Z-ImageStreamlit定制:添加批量生成、队列管理、进度追踪功能
LiuJuan Z-ImageStreamlit定制添加批量生成、队列管理、进度追踪功能你是不是也遇到过这样的烦恼用AI画图工具一次只能生成一张图片想批量出图就得守在电脑前一遍又一遍地点击“生成”按钮。或者好不容易提交了一堆任务却不知道哪个在跑、哪个卡住了只能干等着。今天我要分享的就是如何给LiuJuan Z-Image Generator这个强大的本地AI画图工具加上批量生成、队列管理和进度追踪这些“生产力”功能。经过这次改造你可以一次性提交几十个不同的描述词然后去喝杯咖啡回来就能看到所有图片整整齐齐地生成好了而且每个任务的进度都一目了然。1. 项目简介与改造目标首先让我们快速回顾一下LiuJuan Z-Image Generator是什么。这是一个基于阿里云通义Z-Image扩散模型并加载了LiuJuan自定义权重文件的图片生成工具。它最大的优点是完全在本地运行不需要联网保护隐私而且针对生成稳定性和显存使用做了很多优化。它的核心能力很强但原来的Streamlit界面功能比较基础主要是一次生成一张图。这对于需要大量出图的设计师、内容创作者或者只是想多尝试几个创意的用户来说效率不够高。所以这次改造的核心目标有三个批量生成支持一次性提交多个不同的提示词自动按顺序生成图片。队列管理清晰展示所有等待中和正在运行的任务允许取消未开始的任务。进度追踪实时显示当前生成任务的进度包括步骤、预计剩余时间。想象一下你可以提前设置好一个包含10种不同风格、不同场景的提示词列表然后一键提交。工具会像一个小工厂一样自动排队处理这些任务而你可以在旁边实时看到“工厂”的生产进度。这比手动操作省心太多了。2. 核心功能实现详解下面我们深入到代码层面看看这三个功能是怎么实现的。我会把关键代码拆开讲解确保即使你不是Streamlit专家也能看懂。2.1 任务队列与状态管理任何队列系统的核心都是一个能保存任务状态的地方。在Streamlit里由于每次用户交互都会导致页面重载我们需要一个能跨页面重载保持状态的东西。这里我们选择了st.session_state。import streamlit as st # 初始化session_state中的队列和状态变量 if task_queue not in st.session_state: st.session_state.task_queue [] # 等待执行的任务队列 if current_task not in st.session_state: st.session_state.current_task None # 当前正在执行的任务 if completed_tasks not in st.session_state: st.session_state.completed_tasks [] # 已完成的任务 if is_generating not in st.session_state: st.session_state.is_generating False # 生成状态标志task_queue: 这是一个列表里面存放着所有用户提交但还未开始处理的任务。每个任务是一个字典包含了生成图片所需的所有参数比如提示词、步数等。current_task: 用来存储当前正在执行的那个任务。completed_tasks: 记录已经完成的任务方便后续查看历史。is_generating: 一个简单的开关告诉我们当前是否有任务正在运行防止同时启动多个生成进程。有了这个状态框架我们就能可靠地管理任务的“一生”从进入队列到被取出执行再到最终完成。2.2 批量任务提交界面接下来我们要设计一个让用户方便提交批量任务的界面。这里的关键是提供一个文本区域让用户可以一次性输入多个提示词每行一个。st.header( 批量任务提交) # 多行文本输入框用于输入批量提示词 batch_prompts st.text_area( 请输入批量提示词每行一个:, height150, placeholder例如\n一个在森林里的精灵梦幻风格\n未来城市的赛博朋克夜景\n宁静的湖边小屋水彩画风格 ) # 其他共享参数所有批量任务共用 negative_prompt st.text_input(负面提示词共用:, valuensfw, low quality, text, watermark) steps st.slider(生成步数共用:, min_value1, max_value50, value12) cfg_scale st.slider(CFG Scale共用:, min_value1.0, max_value20.0, value2.0) # 提交批量任务的按钮 if st.button( 提交批量任务, typeprimary): if batch_prompts.strip(): prompt_list [p.strip() for p in batch_prompts.split(\n) if p.strip()] for prompt in prompt_list: # 为每个提示词创建一个任务字典并放入队列 new_task { id: len(st.session_state.task_queue) len(st.session_state.completed_tasks) 1, prompt: prompt, negative_prompt: negative_prompt, steps: steps, cfg_scale: cfg_scale, status: 等待中, # 任务初始状态 progress: 0 # 初始进度为0% } st.session_state.task_queue.append(new_task) st.success(f已成功添加 {len(prompt_list)} 个任务到队列) # 使用st.rerun()让界面立即刷新显示新任务 st.rerun() else: st.warning(请输入至少一个提示词。)这段代码做了几件事创建了一个大文本框(text_area)让用户输入。提供了一些滑块和输入框用于设置这批任务共用的参数如步数、CFG值。这意味着你不需要为每张图单独设置提高了效率。当点击提交按钮时程序会把文本框里的内容按行拆分成多个提示词。为每一个提示词生成一个包含所有信息的“任务包”字典并给它一个唯一的ID和初始状态然后放进task_queue队列。最后提示用户成功并刷新页面。2.3 队列管理与进度追踪界面任务提交后我们需要一个“控制面板”来查看和管理它们。这个面板需要实时更新。st.header( 任务队列与进度) # 创建两列布局左边显示等待队列右边显示进度 col_queue, col_progress st.columns(2) with col_queue: st.subheader(⏳ 等待队列) if st.session_state.task_queue: for i, task in enumerate(st.session_state.task_queue): cols st.columns([5, 1]) with cols[0]: st.text(f任务{task[id]}: {task[prompt][:50]}...) # 只显示提示词前50个字符 with cols[1]: # 为每个等待中的任务提供一个取消按钮 if st.button(取消, keyfcancel_{task[id]}): st.session_state.task_queue.pop(i) st.rerun() # 显示队列统计信息 st.info(f共有 {len(st.session_state.task_queue)} 个任务在等待中。) else: st.write(队列为空) with col_progress: st.subheader( 生成进度) if st.session_state.current_task: # 显示当前任务详情 st.write(f**当前任务 ID:** {st.session_state.current_task[id]}) st.write(f**提示词:** {st.session_state.current_task[prompt]}) # 这里是进度条的核心st.progress会根据值自动更新 progress_bar st.progress(st.session_state.current_task[progress]) st.write(f**进度:** {st.session_state.current_task[progress]}%) # 可以模拟或从生成器获取剩余时间此处为示例 st.write(**状态:** 生成中...) else: st.write(没有正在执行的任务)等待队列区域以列表形式展示所有task_queue里的任务。每个任务旁边都有一个“取消”按钮。点击后该任务会从队列中移除。这里使用了st.columns来并排显示任务描述和按钮布局更紧凑。进度区域这是最吸引人的部分。如果current_task存在即有任务正在运行这里会显示该任务的详细信息和一个动态进度条(st.progress)。进度条的值来自current_task[progress]我们会在后台任务中更新这个值界面就会自动刷新进度。2.4 后台任务生成与进度更新这是整个系统的“发动机”。我们需要一个机制在页面后台运行生成任务同时更新前端进度。这里利用Streamlit的st.empty占位符和循环来实现模拟。import time # 在侧边栏或某个区域放置一个“开始处理队列”的按钮 if st.sidebar.button(▶️ 开始处理队列, disabledst.session_state.is_generating): st.session_state.is_generating True # 在脚本主循环之后检查并执行任务 if st.session_state.is_generating and st.session_state.task_queue: # 从队列中取出第一个任务作为当前任务 st.session_state.current_task st.session_state.task_queue.pop(0) st.session_state.current_task[status] 生成中 # 获取当前任务的参数 prompt st.session_state.current_task[prompt] # ... 获取其他参数 # 这里是关键模拟或调用真实的生成过程并更新进度 for step in range(steps): # 1. 模拟生成耗时 time.sleep(0.1) # 假设每步0.1秒实际应调用你的model(prompt, step...) # 2. 计算并更新进度 progress int((step 1) / steps * 100) st.session_state.current_task[progress] progress # 3. 立即刷新进度显示通过rerun或进度条自动更新 # 注意频繁rerun会影响体验更好的方式是使用st.progress自动更新。 # 因为progress_bar关联的是session_state里的值值改变后在Streamlit的循环中会自动反映。 # 我们需要让脚本执行到这里所以用一个空的st.write来“保持脚本活动” st.write() # 生成完成后的处理 st.session_state.current_task[status] 已完成 st.session_state.completed_tasks.append(st.session_state.current_task) st.session_state.current_task None # 如果队列还有任务可以设置一个标志让循环继续这里简化处理 if not st.session_state.task_queue: st.session_state.is_generating False st.rerun() # 完成一个任务后刷新界面重要说明上面的for step in range(steps)循环是一个简化模拟。在实际的LiuJuan Z-Image生成器中你需要调用真正的模型生成函数。那个函数可能是一个生成器yield或者你能在每一步回调中更新进度。你需要将模型生成步骤整合到这个循环中用实际的生成步骤替换time.sleep并在每一步更新progress。3. 完整功能演示与效果让我们把上面的代码块组合起来看看一个增强版的LiuJuan Z-Image工具界面是什么样子。当你打开工具主界面除了原有的单张图生成区域会新增两个核心板块批量任务提交区在这里你可以粘贴一段小说描写里面包含多个场景比如骑士在晨曦中擦拭他的宝剑 巨龙在山巅洞穴口喷出第一缕火焰 公主在城堡高塔的窗边眺望远方设置好通用的画质参数步数12CFG 2.0点击提交这三个任务瞬间就被加入到下方的队列中。队列与进度监控区这个区域分左右两栏。左边“等待队列”清晰列出“任务1骑士在晨曦中...”、“任务2巨龙在山巅...”每个任务旁边有个“取消”按钮。如果你突然不想生成巨龙了点一下就能把它从列表里去掉。右边“生成进度”当你点击侧边栏的“开始处理队列”按钮后任务1会移动到此处。你会看到“当前任务 ID1”下面有一个从0%逐渐增长到100%的进度条以及当前正在渲染的提示词。进度条的增长是平滑的让你对剩余时间有个大致预期。当一个任务完成进度100%后它会从进度区消失生成的图片会自动保存到指定文件夹比如outputs/batch/并以任务ID或提示词的一部分命名。然后队列中的下一个任务任务2会自动开始进度条重新从0%开始。整个过程完全自动化。4. 总结与扩展思路通过为LiuJuan Z-Image Streamlit工具添加批量生成、队列管理和进度追踪我们把它从一个“手工作坊”升级成了一个“自动化小产线”。这个改造带来了几个实实在在的好处效率提升无需人工值守一次性提交批量产出。过程可控随时查看队列状态取消不必要的任务管理生成计划。体验优化明确的进度反馈消除了等待的焦虑感。更进一步的想法 你可以基于这个框架继续扩展比如任务优先级允许拖动调整队列顺序。生成历史在界面中直接浏览之前批量生成的所有图片。错误处理某个任务生成失败时自动跳过并记录日志而不是让整个队列停止。参数模板为不同的风格如人像、风景、二次元保存多组参数预设提交批量任务时一键选择。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。