当前位置: 首页 > article >正文

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 = 1while os.path.exists(os.path.join(canny_save_dir, f"{base_name}_{j}.png")):j += 1canny_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博客

相关文章:

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

目录 前言 背景与需求 代码改进方案 运行过程: 1、Run​编辑 2、过程: 3、过程时间线: 4、最终效果展示: 总结与展望 前言 机器学习缺点之一:即不可解释性。最近,我在使用stable diffusion v1.5 Co…...

【ROS2】行为树:BehaviorTree

1、简介 与状态机不同,行为树强调执行动作,而不是状态之间的转换。 行为树是可组合的。可以重复使用简单的行为来构建复杂的行为。 在游戏领域,行为树已经比较流行了。主要用于维护游戏角色的各种动作和状态。 ROS2的导航框架Navigation2中引入了行为树来组织机器人的工作流…...

《JVM考古现场(十八):造化玉碟·用字节码重写因果律的九种方法》

"鸿蒙初判!当前因果链突破十一维屏障——全体码农修士注意,《JVM考古现场(十八)》即将渡劫飞升!" 目录 上卷阴阳交缠 第一章:混沌初开——JVM因果律的量子纠缠 第二章:诛仙剑阵改—…...

使用nuxt3+tailwindcss4+@nuxt/content3在页面渲染 markdown 文档

nuxt3tailwindcss在页面渲染 markdown 文档 页面效果 依赖 “nuxt/content”: “^3.4.0” “tailwindcss”: “^4.0.10” “nuxt”: “^3.16.2” “tailwindcss/vite”: “^4.0.10” tailwindcss/typography (这个是格式化 md 样式用的) 注意: 这里nuxt/content…...

[250412] OpenSSH 10.0 发布,移除DSA算法,sshd默认禁用有限域DH,并分离认证代码

目录 OpenSSH 10.0 正式发布:关键更新摘要主要变更亮点(潜在不兼容性) OpenSSH 10.0 正式发布:关键更新摘要 OpenSSH 10.0 已于 2025 年 4 月 9 日发布,现在可以从官网列出的镜像站点获取最新版本。 OpenSSH 是一个广…...

部署NFS版StorageClass(存储类)

部署NFS版StorageClass存储类 NFS版PV动态供给StorageClass(存储类)基于NFS实现动态供应下载NFS存储类资源清单部署NFS服务器为StorageClass(存储类)创建所需的RBAC部署nfs-client-provisioner的deployment创建StorageClass使用存储类创建PVC NFS版PV动态供给StorageClass(存储…...

JS【详解】迭代器 Iterator(含可迭代对象、同步迭代器、异步迭代器等)

什么是迭代器? JS 迭代器是一种遍历访问数据结构中所有成员的机制,本质是一个指针对象。 为什么要有迭代器? 为各种不同的数据结构提供统一的访问机制。自定义数据结构的遍历:当你创建了一个自定义的数据结构时,可以实…...

CFS 调度器两种调度类型普通调度 和 组调度

在 Linux 的 CFS(Completely Fair Scheduler) 调度器中,确实存在两种调度类型:普通调度 和 组调度。这两种调度类型分别适用于不同的场景,并通过三个关键维度(权重、抢占优先级、最大配额)来影响…...

Linux网络编程——详解网络层IP协议、网段划分、路由

目录 一、前言 二、IP协议的认识 1、什么是IP协议? 2、IP协议报头 三、网段划分 1、初步认识IP与路由 2、IP地址 I、DHCP动态主机配置协议 3、IP地址的划分 I、CIDR设计 II、子网数目的计算 III、子网掩码的确定 四、特殊的IP地址 五、IP地址的数量限…...

【图像生成之21】融合了Transformer与Diffusion,Meta新作Transfusion实现图像与语言大一统

论文:Transfusion: Predict the Next Token and Diffuse Images with One Multi-Modal Model 地址:https://arxiv.org/abs/2408.11039 类型:理解与生成 Transfusion模型‌是一种将Transformer和Diffusion模型融合的多模态模型,旨…...

Microsoft Office 如何启用和正常播放 Flash 控件

对于新安装的 Office 默认是不支持启用 Flash 组件的,Flash 组件会无法播放或者黑屏。 本片文章就带你解决这个问题,相关资料都在下方连接内。前提概要,教程对应的版本是 mso16,即 Office 2016 及更新版本,以及 365 等…...

深入浅出:信号灯与系统V信号灯的实现与应用

深入浅出:信号灯与系统V信号灯的实现与应用 信号灯(Semaphore)是一种同步机制,用于控制对共享资源的访问。在多线程或多进程环境下,信号灯能够帮助协调多个执行单元对共享资源的访问,确保数据一致性与程序…...

定位改了IP属地没变怎么回事?一文解析

明明用虚拟定位软件将手机位置改到了“三亚”,为何某某应用评论区显示的IP属地还是“北京”?为什么切换了代理IP,平台却似乎“无视”这一变化? 在“IP属地显示”功能普及后,许多用户尝试通过技术手段隐藏真实位置&…...

Cygwin中使用其它平台生成的动态库

在 Cygwin 环境下链接 VC 生成的 DLL 库需解决符号导出格式和调用约定的兼容性问题,以下是具体操作步骤: 一、VC 生成 DLL 的配置要点 ‌声明 C 风格导出函数‌ 在 VC 中使用 extern "C" 和 __declspec(dllexport) 避免 C 名称修饰&#xff0c…...

《深入理解生命周期与作用域:以C语言为例》

🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言 🌍文章目入 一、生命周期:变量的存在时间(一)生命周期的定义(二)C语言中的生命周期类型(三&#…...

算法魅力揭秘:螺旋矩阵 II 的模拟填充与规则总结

算法魅力揭秘:螺旋矩阵 II 的模拟填充与规则总结 作为一个算法人,我们经常在竞赛和面试中遇到各种“矩阵类”问题,而螺旋矩阵 II 是其中一颗耀眼的明星。今天我将带大家从直观理解到实战代码,全面拆解螺旋矩阵 II 的规律与实现。…...

一个插件,免费使用所有顶级大模型(Deepseek,Gpt,Grok,Gemini)

DeepSider是一款集成于浏览器侧边栏的AI对话工具,可免费使用所有顶级大模型 包括GPT-4o,Grok3,Claude 3.5 Sonnet,Claude 3.7,Gemini 2.0,Deepseek R1满血版等 以极简交互与超快的响应速度,完成AI搜索、实时问答、内容创作、翻译、…...

springboot Filter实现请求响应全链路拦截!完整日志监控方案​​

一、为什么你需要这个过滤器?​​ 日志痛点: 🚨 请求参数散落在各处? 🚨 响应数据无法统一记录? 🚨 日志与业务代码严重耦合? ​​解决方案​​: 一个Filter同时拦截请…...

智能车摄像头开源—9 动态权、模糊PID、速度决策、路径优化

目录 一、前言 二、动态权 1.概述 2.偏差值加动态权 三、模糊PID 四、速度决策 1.曲率计算 2.速度拟合 3.速度控制 五、路径 六、国赛视频 一、前言 在前中期通过识别直道、弯道等元素可进行加减速操作实现速度的控制,可进一步缩减一圈的运行速度&#xff…...

《2025蓝桥杯C++B组:D:产值调整》

**作者的个人gitee**​​ 作者的算法讲解主页▶️ 每日一言:“泪眼问花花不语,乱红飞过秋千去🌸🌸” 题目 二.解题策略 本题比较简单,我的思路是写三个函数分别计算黄金白银铜一次新产值,通过k次循环即可获…...

蓝队技能-Web入侵-入口查杀攻击链

Web攻击事件 分析思路: 1、利用时间节点筛选日志行为 2、利用对漏洞进行筛选日志行为 3、利用后门查杀进行筛选日志行为 4、利用文件修改时间筛选日志行为 Web日志分析 明确存储路径以及查看细节 常见中间件存储路径 IIS、Apache、Tomcat 等中间件的日志存放目…...

Android11车载WiFi热点默认名称及密码配置

一、背景 基于车厂信息安全要求,车载热点默认名称不能使用统一的名称,以及默认密码不能为简单的1~9。 基于旧项目经验,组装工厂自动化测试及客户整车组装的时候均存在多台设备同时打开,亦不太推荐使用统一的热点名称,连接无法区分。 二、需求 根据客户的要求,默认名称…...

对于GAI虚假信息对舆论观察分析

摘要 生成式人工智能(Generative Artificial Intelligence, GAI)的技术革新重构了信息生产机制,但也加剧了虚假信息对舆论生态的异化风险。 关键词:生成式人工智能、虚假信息、舆论异化、智能治理 一、生成式人工智能虚假信息下…...

问题 | 对于初学者来说,esp32和stm32哪个比较适合?

对于初学者选择ESP32还是STM32入门嵌入式开发,需综合考虑学习目标、兴趣方向及未来职业规划。以下是两者的对比分析及建议: 1. 适合初学者的关键因素 ESP32的优势 内置无线通信:集成Wi-Fi和蓝牙功能,无需额外模块即可开发物联网…...

grafana/loki 部署搜集 k8s 集群日志

grafana/loki 和 grafana/loki-stack 的区别 ​Grafana 提供了多个 Helm Chart 用于在 Kubernetes 集群中部署 Loki 及相关组件,其中主要包括 grafana/loki 和 grafana/loki-stack。​它们的主要区别如下:​ 1.grafana/loki Helm Chart: 专注于 Loki 部署: 该 Chart 专门…...

EN控制同步整流WD1020 ,3.0V-21V 的宽 VIN 输入范围,0.9V-20V 的宽输出电压范围

WD1020 是一款功能强大且性能卓越的电源管理芯片,凭借其独特的特点在众多电子设备领域中展现出广泛的应用前景。以下是对其特点和应用电路的详细阐述: 集成式功率 MOSFET:WD1020 集成了低 RDS(开)功率 MOSFET&#xff…...

asm汇编语言源代码之-获取环境变量

提供1个子程序: 1. 读取环境变量 GETENVSTR 具体功能及参数描述如下 GETENVSTR PROC FAR ;IN: DSPSP SEG. ;   ES:BX -> ENV VAR NAME ;OUT: DS:DX -> ENV VAR VALUE; IF DX0FFFFH, NOT FOUND   ; more source code at http://www.ahjoe.com/source/srcdown.aspPU…...

2025认证杯一阶段各题需要使用的模型或算法(冲刺阶段)

A题(小行星轨迹预测) 问题一:三角测量法、最小二乘法、空间几何算法、最优化方法 问题二:Gauss/Laplace轨道确定方法、差分校正法、数值积分算法(如Runge-Kutta法)、卡尔曼滤波器 B题(谣言在…...

①(PROFINET 转 EtherNet/IP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

型号 协议转换通信网关 PROFINET 转 EtherNet/IP MS-GW32 概述 MS-GW32 是 PROFINET 和 EtherNet/IP 协议转换网关,为用户提供两种不同通讯协议的 PLC 进行数据交互的解决方案,可以轻松容易将 EtherNet/IP 网络接入 PROFINET 网络中,方便…...

LeetCode 3272.统计好整数的数目:枚举+排列组合+哈希表

【LetMeFly】3272.统计好整数的数目:枚举排列组合哈希表 力扣题目链接:https://leetcode.cn/problems/find-the-count-of-good-integers/ 给你两个 正 整数 n 和 k 。 如果一个整数 x 满足以下条件,那么它被称为 k 回文 整数 。 x 是一个…...