Stable Diffusion+Pyqt5: 实现图像生成与管理界面(带保存 + 历史记录 + 删除功能)——我的实验记录(结尾附系统效果图)

news2025/4/13 3:34:39

目录

🧠 前言

🧾 我的需求

🔧 实现过程(按功能一步步来)

🚶‍♂️ Step 1:基本图像生成界面

🗃️ Step 2:保存图片并显示历史记录

📏 Step 3:优化长提示词显示和添加删除功能

🧹 Step 4:解决新生成图片删除失败

⚠️ 遇到的问题总结

✅ 最终效果展示

🧩 总结 & 收获


🧠 前言

本科课设做过一个人脸面部表情识别系统,当时是用Pyqt5库实现的图形可视化界面,最近我尝试结合 PyQt5 和 Stable Diffusion 模型开发一个图像生成工具,目标是实现一个带有图形界面的系统,能够输入提示词生成图像、自动保存并按序命名查看历史记录并支持删除功能。在开发过程中,我逐步实现了功能,也遇到了一些问题,最终在优化下达到了预期效果。本文将记录我的需求、实现过程、遇到的问题以及最终成果。
这一篇是在先前部署Stable Diffusion V1.5的基础上,加入了图形界面显示优化,部署可看从零搭建这篇,搭建完即可链接本篇:
深度学习项目记录·Stable Diffusion从零搭建、复现笔记-CSDN博客
从全灰到清晰图像:我的 Stable Diffusion 多尺度优化学习记录-CSDN博客
这里初始图像生成迭代步数我设置为30步,img2img优化迭代步数设置为50步



可能不好理解为什么实际运行生成图片过程中是15步?其实大概知道是微调受strength参数影响,50*0.3=15,这里我查了仔细解释,如下:
在 img2img(图像到图像)模式中,实际执行的迭代步数通常会受到 strength 参数的影响,而不是直接等于 num_inference_steps。
 

第一,strength 参数的作用

  • strength(这里是0.3)控制从初始图像 init_image 到生成新图像的“变化程度”。
  • 它的取值范围是0到1:
    • strength=0:完全保留初始图像,不做任何改变。
    • strength=1:完全忽略初始图像,等同于从头生成(text-to-image)。
    • strength=0.3:表示保留70%的初始图像特征,只对30%的内容进行调整。
       

第二,为什么是15步而不是50步?

  • 在 img2img 模式中,初始图像 init_image 已经提供了大部分结构,模型不需要从完全随机的噪声开始生成。因此,strength=0.3 表示只需要对图像进行轻微调整,实际迭代步数被缩减为 50 * 0.3 = 15。
  • 这是一个优化机制,避免浪费计算资源。
     

 第三,总结

  • 第一行(30/30):对应 pipe(prompt, ..., num_inference_steps=30),完整的30步生成。
  • 第二行(15/15):对应 img2img_pipe(..., num_inference_steps=50, strength=0.3),实际步数被 strength=0.3 缩减为15步。
  • 原因:img2img 模式的 strength 参数调整了实际迭代步数,以适配从已有图像开始的优化过程。

正文开始:

🧾 我的需求

  1. 生成逻辑

    • 输入提示词 → 点击生成 → 得到一张图像并保存,文件名按序递增(如 image_001.png, image_002.png)

    • 生成完成后暂停,等待下一次手动点击“开始生成”。

  2. 交互界面

    • 提供“清空提示词”按钮,方便输入新提示词。

    • 历史记录列表显示生成的图像,格式为:

      image_001.png  
      描述: A beautiful sunset
      
  3. 历史管理

    • 长提示词能完整显示,不被截断。

    • 每张图片支持删除功能,点击图片名称后可删除对应文件。


🔧 实现过程(按功能一步步来)


🚶‍♂️ Step 1:基本图像生成界面

目标:实现一个简单的 PyQt5 界面,能够输入提示词并生成图像,仅显示在界面上,不保存。

主要通过导入PyQt5库实现:

实现要点

  • 使用 StableDiffusionPipeline 和 StableDiffusionImg2ImgPipeline 生成图像。

  • 创建 PyQt5 界面,包含 QLineEdit(输入提示词)、QPushButton(开始生成)、QLabel(显示图像)

  • 将生成过程放入 QThread,通过信号机制 pyqtSignal将生成的图像传回主线程显示。(生成图像是个耗时操作,用 QThread 异步处理)

    用到的 Python 原理和技术

  • 多线程(QThread):避免生成图像时阻塞主界面,使用 pyqtSignal 传递结果。
  • GUI 布局(QVBoxLayout, QHBoxLayout):组织界面元素。
  • 图像处理(PIL 到 QPixmap):将生成的 PIL 图像转换为 PyQt5 可显示的格式。
class ImageGenerationThread(QThread):
    finished = pyqtSignal(object)
    def run(self):
        image = self.pipe(self.prompt).images[0]
        self.finished.emit(image)

def generate_image(self):
    self.thread = ImageGenerationThread(prompt, save_path)
    self.thread.finished.connect(self.show_image)
    self.thread.start()

def show_image(self, image):
    image.save("temp.png")
    pixmap = QPixmap("temp.png")
    self.image_label.setPixmap(pixmap)

🗃️ Step 2:保存图片并显示历史记录

目标:在生成图像后自动保存,并用列表显示图片名称和提示词,支持点击查看。

实现要点

  • 添加保存路径和文件名生成逻辑(image_001.png 等)。
  • 使用 QListWidget 显示历史记录,每张图片占两行:文件名和描述。
  • 实现点击列表项显示对应图像的功能。
     

    用到的 Python 原理和技术

  • 文件操作(os.path, os.makedirs):创建目录并保存图像。
  • 列表控件(QListWidget):存储和显示图片名及描述,使用 addItem 添加条目。
  • 字典(dict):用 self.history_data 存储文件名和提示词的映射,便于查看时获取描述。
  • 事件处理(itemClicked):绑定点击事件,加载并显示选中的图像。
def generate_image(self):
    filename = f"image_{self.count:03d}.png"
    save_path = os.path.join(self.save_dir, filename)
    self.thread = ImageGenerationThread(prompt, save_path)
    self.thread.finished.connect(self.on_generation_finished)

def on_generation_finished(self, image, save_path, prompt):
    pixmap = QPixmap(save_path)
    self.image_label.setPixmap(pixmap)
    filename = os.path.basename(save_path)
    self.history_list.addItem(filename)
    self.history_list.addItem(f"描述: {prompt}")
    self.history_data[filename] = prompt
    self.count += 1

📏 Step 3:优化长提示词显示和添加删除功能

目标:解决长提示词截断问题,并为每张图片添加删除按钮。

实现要点

  • 设置 QListWidget 宽度、开启自动换行;

  • 新增“删除图像”按钮,绑定删除逻辑;

  • 删除时移除对应列表项,弹确认框防误删。
     

    用到的 Python 原理和技术

  • 控件属性调整(setMaximumWidth, setWordWrap):增加宽度并启用自动换行。
  • 文件删除(os.remove):删除磁盘上的图片文件。
  • 列表操作(takeItem):从 QListWidget 中移除条目。
  • 对话框(QMessageBox):提供删除确认提示。
self.history_list.setMaximumWidth(400)
self.history_list.setWordWrap(True)

def delete_selected_image(self):
    filename = self.history_list.selectedItems()[0].text()
    image_path = os.path.join(self.save_dir, filename)
    os.remove(image_path)
    row = self.history_list.row(selected_item)
    self.history_list.takeItem(row + 1)  # 描述
    self.history_list.takeItem(row)      # 文件名

🧹 Step 4:解决新生成图片删除失败

现象:已有图片可以删,但刚生成的删不了,会报错 [WinError 2]

原因:生成线程或图像显示时还占着这个文件的资源,没释放。

解决办法

  • 生成完成后手动释放图像对象;

  • 删除前清空当前显示的图像;

  • 加一波 gc.collect() 触发垃圾回收。
     

    用到的 Python 原理和技术

  • 垃圾回收(gc.collect):强制释放内存中的图像对象。
  • 资源管理(del, clear):显式删除图像对象并清除 QLabel 显示。
  • 异常处理(try-except):捕获删除时的错误并显示。
def on_generation_finished(self, image, save_path, prompt):
    # 显示图像 & 加入历史列表 ...
    del image
    gc.collect()
    self.image_label.clear()

def delete_selected_image(self):
    if self.image_label.pixmap():
        self.image_label.clear()
    os.remove(image_path)

⚠️ 遇到的问题总结

问题描述解决方法
❌ 无法保存图像最初没写保存逻辑手动加保存路径 + 文件名管理
❌ 提示词显示不完整长提示词在历史列表中只显示一行增加宽度 + 开启 setWordWrap(True)
❌ 新图片删不掉报错 [WinError 2] 文件被占用显式释放图像资源 + 清空 QLabel + 垃圾回收

最终效果展示

  1. 生成 + 保存

    • 输入提示词,点击“开始生成”,生成一张图像并保存(如 image_001.png),完成后暂停。
    • 清空提示词后输入新提示词,点击生成,保存为 image_002.png,文件名依次递增。
  2. 历史记录显示

    • 历史列表中,文件名和提示词分两行显示,长提示词自动换行,例如:

      image_001.png  
      描述: A beautiful sunset over the mountains with a long description that wraps
      image_002.png  
      描述: A cute kitten playing with a ball
      
  3. 删除功能完善

    • 选中历史中的图片文件名,点“删除”按钮,会弹窗确认;

    • 删除后界面实时刷新,文件从磁盘也会消失;删除后:

    • 新生成的图片也能正常删了!删除001.png

      下方显示已删除图像+图像名
      生成测试:This guy is wearing a short-sleeve T-shirt with pure color patterns. The T-shirt is with cotton fabric and its neckline is v-shape. The pants this guy wears is of long length. The pants are with cotton fabric and solid color patterns
      这位男士穿着一件纯色图案的短袖 T 恤。T恤为棉质面料,领口呈 V 形。这位男士穿着一条长裤。裤子为纯棉面料,纯色图案。
      效果一般,测试2:A little girl is sitting in front of a large painted rainbow .

      测试3:White dog playing with a red ball on the shore near the water .



      关闭系统界面,图像已保存到本地


🧩 总结 & 收获

这个小项目让我逐步实践了以下内容:

  • PyQt5 界面搭建;

  • 多线程 + 信号机制避免卡顿;

  • 图像处理、自动保存、文件管理;

  • 资源释放与垃圾回收(真香);

  • 控件交互与用户体验优化。

最关键的是,从一开始的功能设想到实际落地、再到解决 bug 完善体验,完整走了一遍闭环,非常适合练手或当项目展示。


如果你也想做个图像生成小工具类似系统,可以直接参考我这套逻辑(Pyqt5+生成模型)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用WasmEdge将InternLM集成到Obsidian,打造本地智能笔记助手

本文来自社区投稿,作者Miley Fu,WasmEdge Runtime 创始成员。 本文将介绍如何通过 WasmEdge 将书生浦语(InternLM)大模型部署在本地,并与 Obsidian 笔记软件集成,从而在笔记软件中直接利用大模型实现文本总…

java导入excel更新设备经纬度度数或者度分秒

文章目录 一、背景介绍二、页面效果三、代码0.pom.xml1.ImportDevice.vue2.ImportDeviceError.vue3.system.js4.DeviceManageControl5.DeviceManageUserControl6.Repeater7.FileUtils8.ResponseModel9.EnumLongitudeLatitude10.词条 四、注意点本人其他相关文章链接 一、背景介…

视频设备轨迹回放平台EasyCVR远程监控体系落地筑牢国土监管防线

一、背景概述 我国土地资源遭违法滥用的现象愈发严峻,各类土地不合理利用问题频发。不当的土地开发不仅加剧了地质危害风险,导致良田受损、森林资源的滥伐,还引发了煤矿无序开采、城市开发区违建等乱象,给国家宝贵的土地资源造成…

Stable Diffusion 四重调参优化——项目学习记录

学习记录还原:在本次实验中,我基于 Stable Diffusion v1.5模型,通过一系列优化方法提升生成图像的质量,最终实现了图像质量的显著提升。实验从基础的 Img2Img 技术入手,逐步推进到参数微调、DreamShaper 模型和 Contro…

我可能用到的网站和软件

我可能用到的网站和软件 程序员交流的网站代码管理工具前端组件库前端框架在线工具人工智能问答工具学习的网站Windows系统电脑的常用工具 程序员交流的网站 csdn博客博客园 - 开发者的网上家园InfoQ - 软件开发及相关领域-极客邦掘金 (juejin.cn) 代码管理工具 GitHub 有时…

FPGA状态机设计:流水灯实现、Modelsim仿真、HDLBits练习

一、状态机思想 1.概念 状态机(Finite State Machine, FSM)是计算机科学和工程领域中的一种抽象模型,用于描述系统在不同状态之间的转换逻辑。其核心思想是将复杂的行为拆解为有限的状态,并通过事件触发状态间的转移。 2.状态机…

2024年第十五届蓝桥杯CC++大学A组--成绩统计

2024年第十五届蓝桥杯C&C大学A组--成绩统计 题目: 动态规划, 对于该题,考虑动态规划解法,先取前k个人的成绩计算其方差,并将成绩记录在数组中,记录当前均值,设小蓝已检查前i-1个人的成绩&…

Kotlin 学习-集合

/*** kotlin 集合* List:是一个有序列表,可通过索引(下标)访问元素。元素可以在list中出现多次、元素可重复* Set:是元素唯一的集合。一般来说 set中的元素顺序并不重要、无序集合* Map:(字典)是一组键值对。键是唯一的…

自动驾驶的未来:多模态感知融合技术最新进展

作为自动驾驶领域的专业人士,我很高兴与大家分享关于多模态感知融合技术的前沿研究和实践经验。在迅速发展的自动驾驶领域,多模态感知融合已成为提升系统性能的关键技术。本文将深入探讨基于摄像头和激光雷达的多模态感知融合技术,重点关注最…

亮相2025全球分布式云大会,火山引擎边缘云落地AI新场景

4 月 9 日,2025 全球分布式云大会暨 AI 基础设施大会在深圳成功举办,火山引擎边缘云产品解决方案高级总监沈建发出席并以《智启边缘,畅想未来:边缘计算新场景落地与 Al 趋势新畅想》为主题,分享了边缘计算在 AI 技术趋…

无损分区管理,硬盘管理的“瑞士军刀”!

打工人们你们好!这里是摸鱼 特供版~ 今天给大家带来一款简单易用、功能强大的无损分区软件——分区助手技术员版,让你的硬盘管理变得轻松又高效! 推荐指数:★★★★★ 软件简介 分区助手技术员版是一款功能强大的硬盘分区工具&…

VS Code下开发FPGA——FPGA开发体验提升__下

上一篇:IntelliJ IDEA下开发FPGA-CSDN博客 Type:Quartus 一、安装插件 在应用商店先安装Digtal IDE插件 安装后,把其他相关的Verilog插件禁用,避免可能的冲突。重启后,可能会弹出下面提示 这是插件默认要求的工具链&a…

ffmpeg播放音视频流程

文章目录 🎬 FFmpeg 解码播放流程概览(以音视频文件为例)1️⃣ 创建结构体2️⃣ 打开音视频文件3️⃣ 查找解码器并打开解码器4️⃣ 循环读取数据包(Packet)5️⃣ 解码成帧(Frame)6️⃣ 播放 / …

SpringCloud微服务: 分布式架构实战

# SpringCloud微服务: 分布式架构实战 第一章:理解SpringCloud微服务架构 什么是SpringCloud微服务架构? 在当今互联网应用开发中,微服务架构已经成为业界的主流趋势。SpringCloud是一个基于Spring Boot的快速开发微服务架构的工具&#xff0…

AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年4月11日第49弹

从今天开始,咱们还是暂时基于旧的模型进行预测,好了,废话不多说,按照老办法,重点8-9码定位,配合三胆下1或下2,杀1-2个和尾,再杀6-8个和值,可以做到100-300注左右。 (1)定…

【models】Transformer 之 各种 Attention 原理和实现

Transformer 之 各种 Attention 原理和实现 本文将介绍Transformer 中常见的Attention的原理和实现,其中包括: Self Attention、Spatial Attention、Temporal Attention、Cross Attention、Grouped Attention、Tensor Product Attention、FlashAttentio…

老硬件也能运行的Win11 IoT LTSC (OEM)物联网版

#记录工作 Windows 11 IoT Enterprise LTSC 2024 属于物联网相关的版本。 Windows 11 IoT Enterprise 是为物联网设备和场景设计的操作系统版本。它通常针对特定的工业控制、智能设备等物联网应用进行了优化和定制,以满足这些领域对稳定性、安全性和长期支持的需求…

Git开发

目录 Linux下Git安装Git基本指令分支管理远程仓库与本地仓库标签管理多人协作同一分支下不同分支下 企业级开发模型 -- git flow 模型 在现实中,当我们完成一个文档的初稿后,后面可能还需要对初稿进行反复修改,从而形成不同版本的文档。显然&…

verilog有符号数的乘法

无符号整数的乘法 1、单周期乘法器( 无符号整数 ) 对于低速要求的乘法器,可以简单的使用 * 实现。 module Mult(input wire [7:0] multiplicand ,input wire [7:0] multipliter ,output wire [7:0] product);as…

DevDocs:抓取并整理技术文档的MCP服务

GitHub:https://github.com/cyberagiinc/DevDocs 更多AI开源软件:发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI DevDocs 是一个完全免费的开源工具,由 CyberAGI 团队开发,托管在 GitHub 上。它专为程序员和软件开发…