SD + Contronet,扩散模型V1.5+约束条件后续优化:保存Canny边缘图,便于视觉理解——stable diffusion项目学习笔记

目录

前言

背景与需求

代码改进方案

运行过程:

1、Run​编辑

2、过程:

3、过程时间线:

4、最终效果展示:

总结与展望

前言

机器学习缺点之一:即不可解释性。最近,我在使用stable diffusion v1.5 +Contronet优化后(本篇是基于前面contronet继续优化),链接如下:
Stable Diffusion + Contronet,调参实现LPIPS最优(带生成效果+指标对比)------项目学习记录-CSDN博客

由于++Contronet采用Canny边缘图作为约束条件++ ,而最终效果直接展示了++生成图像++ ,相当于视觉观察++对比只能对原图和生成图++ ,出于对可解释性的考虑和定性分析的需要,我决定++将中间图单独保存,这样可同时对比原图、边缘图、生成图,更利于理解生成的过程++。

使用 ControlNet 生成图像并保存中间 Canny 边缘图:代码改进与参数解析,我的思考和实现过程如下:

背景与需求

最近,我与一位朋友讨论了如何利用 ControlNet 模型基于原始图像的 Canny 边缘图生成图像。最初的代码已经++能够从输入图像生成边缘图并直接用于生成最终图像++ 。但朋友提出了一个新需求:希望++将中间生成的 Canny 边缘图保存到一个单独的文件夹++,以便后续对比原始图像、中间边缘图和最终生成图像。这个改进不仅便于调试,还能更清晰地观察生成过程的每一步。

代码改进方案

原始代码的核心逻辑是从文本文件读取图像路径和提示词,生成 Canny 边缘图后直接输入 ControlNet,最终保存生成图像。以下是我对代码做出的改进:

  1. 新增 Canny 边缘图保存路径

    我引入了一个新的文件夹变量 canny_save_dir,用于存储生成的 Canny 边缘图。通过 os.makedirs 来确保该路径存在,用户可以根据需要自定义路径。如:

  2. 保存 Canny 边缘图

    在生成 Canny 边缘图后,新增了保存步骤。边缘图会以原始图像文件名加 _canny 后缀保存,并通过循环检查避免文件名冲突:如下:

    复制代码
    canny_filename = image_name.replace(".jpg", "_canny.png")
    canny_save_path = os.path.join(canny_save_dir, canny_filename)
    if os.path.exists(canny_save_path):
        base_name = os.path.splitext(canny_filename)[0]
        j = 1
        while os.path.exists(os.path.join(canny_save_dir, f"{base_name}_{j}.png")):
            j += 1
        canny_save_path = os.path.join(canny_save_dir, f"{base_name}_{j}.png")
    canny_image_pil.save(canny_save_path)
    print(f"第 {i} 张 Canny 边缘图已保存为 {canny_save_path}")

    这里,canny_image_pil 是通过 Image.fromarray 从 OpenCV 的边缘图转换得到的 PIL 图像,确保与 ControlNet 的输入格式兼容。

  3. 完整流程

    改进后的代码保留了原有功能,同时新增了中间结果保存。最终输出包括三个文件夹:

    • image_dir:原始图像

    • canny_save_dir:Canny 边缘图

    • save_dir:ControlNet 生成图像

这里,迭代步数依旧采用50步,contrnet强度设置为1,guidance_scale=7.5,前篇没有介绍guidance_scale这个参数,可能有不理解。
解释:

`guidance_scale=7.5` 是 ControlNet 中++控制生成图像与提示词一致性的参数++ ,全称是 "Classifier-Free Guidance Scale"。它决定了模型在生成时对文本提示的遵循程度。值越高(如 7.5),生成的图像越贴近提示描述,细节更符合预期;值越低,图像更自由,可能偏离提示。++通常设在 7-10 之间++ ,7.5 是一个平衡点,既保证提示的指导性,又保留一定创造性。生动地讲:调整它可以控制生成结果的"听话"程度!

运行过程:

1、Run

(红色提示涉及一个问题):++loading pipeline components,这个需要联网吗?++还是直接本地加载的? 回答:第一次会从hugging face加载,后面若无法联网会直接从本地缓存加载,如上图,我关闭了科学上网。可正常加载并生成图像

2、过程:

++引入了contronet的sd v1.5生成慢了近十倍++

3、过程时间线:

19:11正生成12张


19.16第22张 差不多5分钟生成10张的样子


19:18 生成27张 8分钟15、16张的样子

4、最终效果展示:


原图 Canny边缘图 生成图

可能由于没加颜色图、语义图,导致颜色细节捕 捉不够。

总结与展望

这次改进,实现了中间 Canny 边缘图的保存,还理解了 guidance_scale 的作用,并进一步熟悉了生成流程。这样的代码结构更适合研究或调试场景,方便分析生成过程中的每一步。如果你也对 ControlNet 的参数调整或中间结果感兴趣,可以试试这个思路。谢谢观阅。

后续优化思路:可以尝试加入颜色约束、语义约束、深度图约束等。
部署思路:
深度学习项目记录·Stable Diffusion从零搭建、复现笔记-CSDN博客

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

相关推荐
爱代码的小黄人2 小时前
深入解析系统频率响应:通过MATLAB模拟积分器对信号的稳态响应
开发语言·算法·matlab
是僵尸不是姜丝5 小时前
每日算法:洛谷U535992 J-C 小梦的宝石收集(双指针、二分)
c语言·开发语言·算法
寒页_7 小时前
2025年第十六届蓝桥杯省赛真题解析 Java B组(简单经验分享)
java·数据结构·经验分享·算法·蓝桥杯
smile-yan7 小时前
拓扑排序 —— 2. 力扣刷题207. 课程表
数据结构·算法·图论·拓扑排序
空雲.8 小时前
牛客周赛88
数据结构·c++·算法
深度学习算法与自然语言处理8 小时前
单卡4090微调大模型 DeepSeek-R1-32B
深度学习·算法·大模型·微调·transformer·面试题
Y1nhl8 小时前
基础算法:滑动窗口_python版本
开发语言·python·算法·力扣·滑动窗口
烟锁池塘柳08 小时前
【数学建模】(智能优化算法)鲸鱼优化算法(Whale Optimization Algorithm)详解与应用
算法·数学建模
地平线开发者9 小时前
【征程 6】工具链 VP 示例中 Cmakelists 解读
算法·自动驾驶
邪神与厨二病9 小时前
2025蓝桥杯python A组题解
数据结构·c++·python·算法·蓝桥杯·单调栈·反悔贪心