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

发布于:2025-04-13 ⋅ 阅读:(33) ⋅ 点赞:(0)

目录

前言

背景与需求

代码改进方案

  运行过程:

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博客


网站公告

今日签到

点亮在社区的每一天
去签到