目录
前言
机器学习缺点之一:即不可解释性。最近,我在使用stable diffusion v1.5 +Contronet优化后(本篇是基于前面contronet继续优化),链接如下:
Stable Diffusion + Contronet,调参实现LPIPS最优(带生成效果+指标对比)------项目学习记录-CSDN博客
由于++Contronet采用Canny边缘图作为约束条件++ ,而最终效果直接展示了++生成图像++ ,相当于视觉观察++对比只能对原图和生成图++ ,出于对可解释性的考虑和定性分析的需要,我决定++将中间图单独保存,这样可同时对比原图、边缘图、生成图,更利于理解生成的过程++。
使用 ControlNet 生成图像并保存中间 Canny 边缘图:代码改进与参数解析,我的思考和实现过程如下:
背景与需求
最近,我与一位朋友讨论了如何利用 ControlNet 模型基于原始图像的 Canny 边缘图生成图像。最初的代码已经++能够从输入图像生成边缘图并直接用于生成最终图像++ 。但朋友提出了一个新需求:希望++将中间生成的 Canny 边缘图保存到一个单独的文件夹++,以便后续对比原始图像、中间边缘图和最终生成图像。这个改进不仅便于调试,还能更清晰地观察生成过程的每一步。
代码改进方案
原始代码的核心逻辑是从文本文件读取图像路径和提示词,生成 Canny 边缘图后直接输入 ControlNet,最终保存生成图像。以下是我对代码做出的改进:
-
新增 Canny 边缘图保存路径
我引入了一个新的文件夹变量
canny_save_dir
,用于存储生成的 Canny 边缘图。通过os.makedirs
来确保该路径存在,用户可以根据需要自定义路径。如:
-
保存 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 的输入格式兼容。 -
完整流程
改进后的代码保留了原有功能,同时新增了中间结果保存。最终输出包括三个文件夹:
-
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博客