Stable Diffusion + Contronet,调参实现LPIPS最优(带生成效果+指标对比)——项目学习记录

目录

前言 

一、数据集:图像+文本,部分选取于DeepFashion

二、优化一,img2img

 三、优化二,微调sd参数

 四、优化三,dreamshaper优化

 五、优化四,sdv1.5+contronet

六、问题探索历程

1. 从 SDXL 到轻量化模型:模型选择的权衡

2. LoRA 下载受阻:转向基础模型优化

3. ControlNet 约束:提升结构一致性

4. 指标评估:文件名匹配与全黑图处理

5. SSIM 计算错误:尺寸与数据范围问题

6. LPIPS 归一化调整

结果分析

总结

后续优化想法、可参考思路:

1. LoRA 微调

2. 超分辨率后处理

3. 自适应提示词

4. 损失函数优化

5. 多模型融合


由于sd v1.5生成效果一般,主要在人物面部、手部等细节上很差,于是我寻求各种优化,今天最成功的是加入contronet,这的确是一个妥妥提升质量的思路,我用的约束是轮廓图,想复现的思路除这个外,最近几天在基于 Stable Diffusion v1.5模型做优化,旨在优化图像生成质量,并通过 PSNR、SSIM 和 LPIPS 等指标对比评估不同优化方案的效果。在优化过程中,我遇到了一些技术问题,涉及模型选择、代码错误、指标计算等。以下是优化过程的详细记录,重点展示了技术问题、解决方案和实验结果。
✅ Stable Diffusion v1.5:不换模型优化人体细节的实用技巧-CSDN博客

Stable Diffusion+Pyqt5: 实现图像生成与管理界面(带保存 + 历史记录 + 删除功能)——我的实验记录(结尾附系统效果图)-CSDN博客
基于前面搭建的sd v1.5,深度学习项目记录·Stable Diffusion从零搭建、复现笔记-CSDN博客:

前言 

最近围绕stable diffusion v1.5做了一系列实验,寻求各种优化,前面发的一篇是优化思路,这一篇是sd v1.5 + contronet(我采用的是边缘图,先安装opencv:pip install opencv-python依赖 cv2 来生成 Canny 边缘图),忙活几天才彻底完成各优化模型评价指标的测定,最终三个指标均有所提升。模型基于sd v1.5微调,接下来是项目思路的还原:

一、数据集:图像+文本,部分选取于DeepFashion

实验环境:python3.11 Pytorch12.1   

 GPU:RTX4070   

二、优化一,img2img


基于原图的风格统一或提示词约束(添加细节提示)实现对生成图像再优化,上一篇提到了Strength参数作用,主要是控制实际迭代步数。

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

 文本描述:  "MEN-Denim-id_00000089-44_7_additional.jpg": "This man is wearing a short-sleeve shirt with pure color patterns. The shirt is with cotton fabric and its neckline is lapel. The trousers this man wears is of long length. The trousers are with cotton fabric and solid color patterns.",
效果

 三、优化二,微调sd参数


optimized,主要是优化迭代步数和引导强度,附加提示词优化

效果如下:

 

 、优化三,dreamshaper优化

(重新加载模型速度最慢、耗时久)


成功生成:

效果(可能是hugging face基础模型的原因,风格化严重):

 五、优化四,sdv1.5+contronet

 边缘图约束+提示词优化


需先下载库:


 速度比前面慢接近十倍:(与原图保持轮廓一致)


六、问题探索历程

 

1. 从 SDXL 到轻量化模型:模型选择的权衡

技术问题

最初,我计划使用 Stable Diffusion XL (SDXL),因为它在图像质量上表现优异。然而,由于 SDXL 模型体积较大(约 10GB)且对硬件要求高,下载困难并且运行复杂,最终选择了更轻量的模型。

解决方法

转向使用 runwayml/stable-diffusion-v1-5(约 4GB),该模型社区支持广泛,且生成质量适中。为了提升生成效果,引入了 LoRA 微调技术。

技术细节

  • LoRA 微调:使用 LoRA 技术增强模型生成能力,通过加载小型权重文件(几十 MB)进行微调。

  • 代码实现

    from diffusers import StableDiffusionPipeline
    pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16)
    pipe.load_lora_weights(r"D:\YAN\pythonProject\diffusion\lora\fashion-detail-lora.safetensors")
    
  • 参数调整:设置 num_inference_steps=50guidance_scale=7.5 来平衡生成质量和速度。


2. LoRA 下载受阻:转向基础模型优化

技术问题

由于网络限制,我无法顺利从 Civitai 或 Hugging Face 下载 LoRA 权重文件。

解决方法

放弃使用 LoRA,转向通过提示词工程和参数调整优化 runwayml/stable-diffusion-v1-5 的生成效果,并尝试了其他轻量模型,如 Lykon/dreamshaper-8

技术细节

  • 提示词优化:加入更具体的描述,如 highly detailed, realistic textures,并使用负面提示排除低质量元素。

  • 代码调整

    image = pipe(prompt, negative_prompt="blurry, low resolution", num_inference_steps=75, guidance_scale=10.0).images[0]
    
  • DreamShaper 模型:使用 Lykon/dreamshaper-8,并手动下载模型文件避免网络问题:

    model_id = r"D:\YAN\pythonProject\diffusion\models\dreamshaper-8"
    pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)
    

3. ControlNet 约束:提升结构一致性

技术问题

尽管生成图像有了提升,但服装结构和轮廓依然不够精确。我希望通过 ControlNet 强化生成图像的结构一致性。

解决方法

集成了 lllyasviel/sd-controlnet-canny 模型,利用 Canny 边缘图作为输入,以此加强生成图像的结构保持性。

技术细节

  • 依赖安装:安装 opencv-python 处理边缘图:

    pip install opencv-python
    
  • ControlNet 实现

    from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
    controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny", torch_dtype=torch.float16)
    pipe = StableDiffusionControlNetPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", controlnet=controlnet, torch_dtype=torch.float16)
    canny_image = cv2.Canny(cv2.imread(image_path, cv2.IMREAD_GRAYSCALE), 100, 200)
    image = pipe(prompt, image=canny_image, controlnet_conditioning_scale=1.0).images[0]
    

4. 指标评估:文件名匹配与全黑图处理

技术问题

计算 PSNR、SSIM 和 LPIPS 时,出现了文件名匹配失败的问题(图像格式不一致)以及部分图像为全黑图,导致计算结果偏差。

解决方法

调整文件名匹配逻辑,去除扩展名匹配,同时加入全黑图检测,跳过不合适的图像。

技术细节

  • 文件名匹配

    base_name = os.path.splitext(gen_file)[0]
    original_file = original_files.get(base_name)
    
  • 全黑图检测

    def is_black_image(img):return np.all(img == 0)
    if is_black_image(generated_img):print(f"  跳过全黑图: {gen_file}")continue
    

5. SSIM 计算错误:尺寸与数据范围问题

技术问题

SSIM 计算报错,主要是由于图像尺寸过小或数据范围不正确。

解决方法

添加尺寸检查并为 SSIM 指定 data_range=1.0

技术细节

  • 尺寸检查

    h, w = original_img.shape[:2]
    if h < 7 or w < 7:raise ValueError(f"图像尺寸 {h}x{w} 太小,SSIM 需要至少 7x7")
    
  • SSIM 参数调整

    ssim_value = ssim(original, generated, channel_axis=2, win_size=min(7, min(h, w)), data_range=1.0)
    

6. LPIPS 归一化调整

技术问题

LPIPS 计算结果异常,原因是图像数据范围不符合期望。

解决方法

将图像从 [0, 1] 转换为 [-1, 1],以适应 LPIPS 计算。

技术细节

original_tensor = torch.from_numpy((original * 2 - 1).transpose(2, 0, 1)).float().unsqueeze(0).to('cuda')
generated_tensor = torch.from_numpy((generated * 2 - 1).transpose(2, 0, 1)).float().unsqueeze(0).to('cuda')
lpips_value = lpips_model(original_tensor, generated_tensor).item()

最终结果与分析

在优化和调参后,我生成了多个模型的图像并计算了对应的 PSNR、SSIM 和 LPIPS 指标。以下是最终结果:

结果分析

  • PSNRgenerated_pic_controlnet 的 8.44 最高,表示图像与原图差异最小

  • SSIMgenerated_pic_controlnet 的 0.6434 最高,结构相似性最优,验证了 ControlNet 对结构的一致性控制能力。

  • LPIPSgenerated_pic_controlnet 的 0.2713 最低,感知相似性最佳,符合人类视觉评价


总结

通过从 SDXL 的放弃,到 LoRA 的失败,再到 ControlNet 的成功集成,我逐步优化了图像生成质量。最终,ControlNet 在所有指标上均表现优异,特别是在服装生成任务上。

后续优化想法、可参考思路:

在 ControlNet 加入边缘图优化后,接下来可以考虑以下几个改进方向,以进一步提升图像生成质量和效果:


1. LoRA 微调

  • 目标:若网络问题得到解决,可以引入服装特定的 LoRA 微调,以进一步优化细节(如纹理、材质),进而提升 SSIM 和 LPIPS 指标。

  • 实现:下载和加载特定于服装领域的 LoRA 权重文件,微调基础模型,提升生成图像的细节表现。


2. 超分辨率后处理

  • 目标:通过超分辨率技术(如 ESRGAN 或 Real-ESRGAN)对生成的图像进行后处理,提高 PSNR 和图像清晰度。

  • 实现:使用超分辨率网络对生成的低分辨率图像进行放大和细节恢复,从而提高图像质量,减少模糊现象。


3. 自适应提示词

  • 目标:基于原始图像的特征(如颜色、风格)动态生成提示词,减少生成偏差,提升图像与提示词的匹配度和感知一致性。

  • 实现:使用图像分析模型提取图像特征,生成与原图风格和元素一致的提示词,以便引导模型生成更符合预期的图像。


4. 损失函数优化

  • 目标:在训练或微调中加入感知损失(如 LPIPS),使生成图像更贴近人类视觉评价,提升图像质量的感知效果。

  • 实现:在训练过程中加入感知损失函数,优化模型输出,使生成图像与目标图像在视觉上更为相似。


5. 多模型融合

  • 目标:结合 DreamShaper 和 ControlNet 等模型的优势,通过模型集成提升图像生成的综合质量。

  • 实现:在生成过程中融合多个模型的输出,采用加权平均或其他融合策略,以平衡各模型的优缺点,生成更加细腻和多样化的图像。

这些优化方法为 ControlNet 和 Stable Diffusion 图像生成模型提供了更多的潜力和改进空间。通过在细节、分辨率、提示词自适应和模型融合等方面进行优化,能够进一步提升服装生成任务的质量和稳定性,探索更多可能性,有需要可以从以上五点做尝试。

本篇基于sd v1.5:
深度学习项目记录·Stable Diffusion从零搭建、复现笔记-CSDN博客
优化后续强相关:
✅ Stable Diffusion v1.5:不换模型优化人体细节的实用技巧-CSDN博客
Stable Diffusion+Pyqt5: 实现图像生成与管理界面(带保存 + 历史记录 + 删除功能)——我的实验记录(结尾附系统效果图)-CSDN博客

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

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

相关文章

SQL 不走索引的常见情况

在 SQL 查询中&#xff0c;即使表上有索引&#xff0c;某些情况下数据库优化器也可能决定不使用索引。以下是常见的不走索引的情况&#xff1a; 1. 使用否定操作符 NOT IN ! 或 <> NOT EXISTS NOT LIKE 2. 对索引列使用函数或运算 -- 不走索引 SELECT * FROM user…

数据库主从延迟全解析:原因、影响与解决之道

目录 一、引言&#xff1a;理解数据库主从架构 二、数据库主从延迟的定义与测量 2.1 主从延迟的技术定义 2.2 如何测量主从延迟 2.3 主从延迟对系统的影响 三、主从延迟的常见原因分析 3.1 网络延迟因素 3.1.1 网络质量与带宽限制 3.1.2 地理位置分布造成的延迟 3.2 …

分治-归并系列一>翻转对

目录 题目&#xff1a;解析&#xff1a;策略一&#xff1a; 代码&#xff1a;策略二&#xff1a; 代码&#xff1a; 题目&#xff1a; 链接: link 这题和逆序对区别点就是&#xff0c;要找到前一个元素是后一个元素的2倍 先找到目标值再&#xff0c;继续堆排序 解析&#xff1…

从0到1打造一套适合自己接单的脚手架05自动化创建表

上一篇我们是手动创建的表&#xff0c;感觉不方便&#xff0c;后续如果要做成产品在部署的时候一个个的创建表太麻烦了&#xff0c;我们让ai来自动创建表&#xff0c;输入如下提示词 现在这种单独去navicate执行也不方便&#xff0c;我希望是有一个目录里存放的表结构的语句&a…

minio改成https+域名访问

思路有两个&#xff1a; 方式一&#xff1a;通过nginx反向代理&#xff0c;将https配置在nginx&#xff0c;内部的MinIO还是使用HTTP&#xff1b;方式二&#xff1a;MinIO服务端直接配置成HTTPS&#xff1b; 注意&#xff1a; 私钥需要命名为&#xff1a;private.key 公钥需要…

VS Code构建C/C++开发环境(Windows with MinGW and CMake)

文章目录 目的编译工具链基础开发与调试基于CMake开发与调试关于settings.json总结 目的 在Windows上进行C/C开发目前最最常用的IDE就是微软的 Visual Studio &#xff0c;只是对我来说早些年的VS实在是太卡了&#xff0c;留下了不好的印象。后来没怎么用过&#xff0c;现在下…

一组可能的机器学习问题列表

线性回归与多项式拟合的关系最小二乘法在机器学习中的应用梯度下降是如何实现的贝叶斯分类器的应用场景高斯分布与判定在哪里用到模型的评估有哪些参数误差中的偏差和方差定义训练集分组的快捷方式如何度量模型性能查准率查全率的定义roc,aux的含义正则化是什么意思k均值用来解…

linux下io操作详细解析

在 Linux 系统下&#xff0c;IO&#xff08;输入/输出&#xff09;操作是程序与外部设备&#xff08;如文件、网络等&#xff09;交互的重要方式。Linux 提供了丰富的系统调用和库函数来支持各种 IO 操作。以下是对 Linux 下 IO 操作的详细解析&#xff0c;包括文件 IO、网络 I…

wsl2+ubuntu22.04安装blender教程(详细教程)

本章教程介绍,如何在Windows操作系统上通过wsl2+ubuntu安装blender并运行教程。Blender 是一款免费、开源的 ​​3D 创作套件​​,广泛应用于建模、动画、渲染、视频编辑、特效制作等领域。它由全球开发者社区共同维护,支持跨平台(Windows、macOS、Linux),功能强大且完全…

目标检测YOLO实战应用案例100讲- 基于卷积神经网络的小目标检测算法研究与应用

目录 知识储备 基于改进YOLOv5的小目标检测算法 一、环境配置(Python 3.8+) 二、核心代码实现 1. 改进模型定义(models/yolov5s_tiny.py ) 2. 小目标数据增强(datasets/tiny_aug.py ) 3. 训练脚本(train.py ) 三、关键改进点说明 四、实验配置建议 前言 传统…

智能DNS解析:解决高防IP地区访问异常的实战指南

摘要&#xff1a;针对高防IP在部分地区无法访问的问题&#xff0c;本文设计基于智能DNS的流量调度方案&#xff0c;提供GeoDNS配置与故障切换代码示例。 一、问题背景 运营商误拦截或线路波动可能导致高防IP在福建、江苏等地访问异常。传统切换方案成本高&#xff0c;智能DNS可…

根据 PID 找到对应的 Docker 容器

引言 在日常运维与调试过程中&#xff0c;我们常常需要查找某个进程所属的 Docker 容器。当系统出现问题或资源异常时&#xff0c;根据进程的 PID 找到其所属容器可以帮助我们迅速定位问题。本文将介绍如何利用 Linux 的 cgroup 机制&#xff0c;以及 Docker 提供的工具来完成…

NO.88十六届蓝桥杯备战|动态规划-多重背包|摆花(C++)

多重背包 多重背包问题有两种解法&#xff1a; 按照背包问题的常规分析⽅式&#xff0c;仿照完全背包&#xff0c;第三维枚举使⽤的个数&#xff1b;利⽤⼆进制可以表⽰⼀定范围内整数的性质&#xff0c;转化成01 背包问题。 ⼩建议&#xff1a;并不是所有的多重背包问题都能…

【远程工具】0 std::process::Command 介绍

std::process::Command 是 Rust 标准库中用于创建和配置子进程的主要类型。它允许你启动新的进程、设置其参数和环境变量、重定向输入/输出等。 基本用法 use std::process::Command;let output Command::new("echo").arg("Hello, world!").output().ex…

【图书管理系统】深入解析基于 MyBatis 数据持久化操作:全栈开发图书管理系统获取图书列表接口(后端:计算图书页数、查询当前页展示的书籍)

图书列表 实现服务器代码(计算图书总数量查询当前页需要展示的书籍) 后端响应时&#xff0c;需要响应给前端的数据 records&#xff1a;第 pageNum 页要展示的图书有哪些&#xff08;存储到List集合中&#xff09;total&#xff1a;计算一共有多少本书&#xff08;用于告诉前…

如何在idea中快速搭建一个Spring Boot项目?

文章目录 前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热启动&#xff08;热部署&#xff09;结语 前言 Spring Boot 凭借其便捷的开发特性&#xff0c;极大提升了开发效率&#xff0c;为 Java 开发工作带来诸多便利。许多大伙伴希望快速…

制作前的关键筹备:考试考核系统之核心要点

明确系统使用目的​ 制作考试考核系统前&#xff0c;企业需明确系统使用目的&#xff0c;这是开发基石&#xff0c;不同目的决定系统功能特性。用于员工培训考核时&#xff0c;系统要与培训内容结合&#xff0c;能生成相应考题&#xff0c;检验员工知识掌握程度&#xff0c;具备…

Springboot把外部jar包打包进最终的jar包,并实现上传服务器

1、创建lib目录&#xff0c;把jar包放进这个目录下&#xff0c;然后标记lib目录为“资源根路径”&#xff08;鼠标右键lib目录->将目录标记为->资源根路径。之后lib文件夹会有如下的图标变化&#xff09; 文件结构如下&#xff1a; 2、pom文件添加依赖 <dependency…

内容中台的核心架构是什么?

数据中枢与服务API架构 在内容中台的核心架构中&#xff0c;数据中枢作为基础层&#xff0c;通过统一的数据模型与标准化接口&#xff0c;实现多源内容的集中存储与治理。其核心能力体现在对结构化与非结构化数据的清洗、分类及跨系统同步&#xff0c;例如整合企业内部的CRM、…

Light RPC:一款轻量高效的Java RPC框架实践指南

Light RPC&#xff1a;一款轻量高效的Java RPC框架实践指南 一、框架简介二、快速入门1. 环境准备2. 服务端配置2.1 添加依赖2.2 YAML配置2.3 接口与实现 3. 客户端配置3.1 添加依赖3.2 YAML配置3.3 客户端调用 三、核心设计解析四、适用场景与优势对比五、总结 一、框架简介 …