前言
学习记录contronet优化:最近,我基于 diffusers
库的 ControlNet,探索了如何通过 Canny 边缘图控制服装图像生成,并逐步升级到融合颜色图的双条件模型。有不断的问题、解决和进步,从最初的边缘图生成到最终实现 27 张图像的批量生成(包括边缘图、颜色图和生成图),每一步都让我对 ControlNet 的能力有了更深的理解。以下是我的技术演进全记录,梳理了从问题提出到解决的完整过程。
部署、优化顺序:
深度学习项目记录·Stable Diffusion从零搭建、复现笔记-CSDN博客
从全灰到清晰图像:我的 Stable Diffusion 多尺度优化学习记录-CSDN博客
Stable Diffusion + Contronet,调参实现LPIPS最优(带生成效果+指标对比)——项目学习记录-CSDN博客
系统:Stable Diffusion+Pyqt5: 实现图像生成与管理界面(带保存 + 历史记录 + 删除功能)——我的实验记录(结尾附系统效果图)-CSDN博客
效果:上左(原图)、上中(高斯模糊颜色图)、上右(边缘图)。
生成图:左到右依次:颜色因子左0.5,中0.9,前天单contronet canny边缘图效果)
颜色图因子强度对生成图的影响效果还是不足。
背景:ControlNet 与服装生成
ControlNet 是一种强大的条件生成模型,允许用户通过额外输入(如边缘图、颜色图)控制 Stable Diffusion 的图像生成效果。我的目标是基于 DeepFashion 数据集(包含图像和文本描述,如 MEN-Denim-id_00000080-01_7_additional.jpg: "The lower clothing is of long length. The fabric is cotton and it has plaid patterns."
),生成符合描述的服装图像。数据集格式为每行一个键值对(image_name:prompt
),图像存储在 D:\YAN\pythonProject\diffusion\Dateset\DeepFashion\Pic
,文本描述在 captions.txt
。
最初,我实现了基于 Canny 边缘图的 ControlNet 生成,但希望通过加入颜色图,进一步控制图像的色彩分布,提升服装图案和材质的表现。这篇博客记录了我从单条件到双条件(Canny + 颜色图)的技术升级过程。
阶段 1:提出需求——从边缘图到双条件融合
时间:2025年4月12日
问题:
我的初始代码基于 lllyasviel/sd-controlnet-canny
,已经可以生成边缘图控制图像生成,但希望加入颜色图作为额外条件。数据集中只有图像和描述,没有单独的颜色标签,我担心颜色图需要手动标注。
解决方案:
后来明确了一点:颜色图其实可以直接从原始图像中提取,
(这里怎么理解呢?我在得知这一点之前的想法是需从文本中筛选提取颜色信息,我停顿了一会,直接能从原图提取颜色信息,都有原图了还要颜色图何用?可能有人会问相同的问题:既然有原始图像,刚好晚餐间隙看《乔布斯传》里<数字中枢>这一章,我想引用的是,对于“乔布斯为何能比其他任何人更清楚预见到未来的数字革命,并全身心投入到这一潮流之中”的回答:一直以来,他都站在人性与科技的交叉点上。乔布斯在很多次产品介绍的最后都会展示一个简单的页面:上面有一个路标:标示着“人文”和“科技”的十字路口。 乔布斯Apple产品以简洁性和人性化广受赞扬,像理解人一样思考计算机算法的优化原理,我有一个初步的联想和思考:从文本中抽取颜色信息,对于没有颜色标签数据的文本,从原图提取比从文本描述中更容易,为什么呢?Python语言相比于其它语言擅长数据处理,包括图像信息处理,这里颜色信息很容易通过RGB向量表示(每个分量的值通常在 0 到 255 之间) ,计算机与人不同,文本对它而言显然没有向量的数字好理解,相较于一整句语言描述,计算机最擅长处理的是数值。有时一些最优的算法,放到计算机视角,究其底层原理上便容易理解了,它最喜欢的是0和1二进制编码、汇编语言。回到最初的问题,有原图需颜色图做何用,一个物体,人眼是能一眼看清颜色和形状等信息的,但计算机不同,理解为不同的维度,比如这里通过Canny边缘图能提取形状、图像中的人物等构造特征,但对颜色属性的考虑就极为优先,这就是为什么边缘图+颜色图,也是为什么contronet融合使用才是最优解(当然多contronet对显存要求也更高),contronet包括:语义图、草图、姿态图(类似边缘图)、法线图、深度图、涂鸦图(类似草图)、颜色图等,姿态图主要用于视频处理,提取人物关键节点,法线图主要用于控制物体表面的光照和材质,常用于3D演示,这里是图片生成则不需要。计算机读取到图片的颜色、形状等属性信息更易于应用到虚拟试衣等领域。
颜色图其实可以直接从原始图像中提取,比如:
-
从原始图像提取:对原始图像应用高斯模糊,保留颜色分布,去除细节。
-
提示词推断:从文本描述提取颜色信息(复杂,暂不搞),可以找有颜色标签的数据集(.csv、.json等)。
-
用户草图:暂无。
最后采用了从图像直接生成颜色图的方式,用 StableDiffusionControlNetPipeline
同时加载两个 ControlNet:一个是边缘图模型 lllyasviel/sd-controlnet-canny
,另一个用 lllyasviel/sd-controlnet-scribble
来近似处理颜色图。颜色图本质上是做了一个高斯模糊。
代码片段:
controlnet_canny = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny", torch_dtype=torch.float16)
controlnet_color = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-scribble", torch_dtype=torch.float16)
pipe = StableDiffusionControlNetPipeline.from_pretrained("runwayml/stable-diffusion-v1-5",controlnet=[controlnet_canny, controlnet_color],torch_dtype=torch.float16
).to("cuda")# 颜色图
original_color_image = cv2.cvtColor(cv2.imread(image_path), cv2.COLOR_BGR2RGB)
blurred_image = cv2.GaussianBlur(original_color_image, (51, 51), 0)
color_image_pil = Image.fromarray(blurred_image)# 生成
image = pipe(enhanced_prompt, image=[canny_image_pil, color_image_pil], ...).images[0]
进步:
-
明确了颜色图不需要标注。
-
高斯模糊处理方法确立。
-
双 ControlNet 框架构建完毕,支持保存中间图。
阶段 2:适配数据集格式
问题:
默认代码处理的是简单格式(image.jpg: "prompt"
),但我的 captions.txt
是完整路径名 + 描述。比如:
"MEN-Denim-id_00000080-01_7_additional.jpg": "The lower clothing is of long length. The fabric is cotton and it has plaid patterns."
解决方案:
调整了文件解析逻辑,处理了引号和分隔符:
dataset_path = r"D:\YAN\pythonProject\diffusion\Dateset\DeepFashion\captions.txt"
image_dir = r"D:\YAN\pythonProject\diffusion\Dateset\DeepFashion\Pic"with open(dataset_path, "r", encoding="utf-8") as file:lines = [line.strip() for line in file if line.strip()]
for i, line in enumerate(lines, 1):try:image_name, prompt = line.split(":", 1)image_name = image_name.strip().strip('"')prompt = prompt.strip().strip('"')except ValueError:print(f"第 {i} 行格式错误,跳过: {line}")continueenhanced_prompt = f"{prompt}, highly detailed fashion design, realistic textures, vivid colors, photorealistic, studio lighting, 4k quality"
进步:
-
完全适配 DeepFashion 数据格式。
-
提示词更贴合服装风格。
-
加入错误处理机制,鲁棒性增强。
阶段 3:解决运行卡顿
问题:
运行生成脚本长时间无响应,甚至出现:
UserWarning: `huggingface_hub` cache-system uses symlinks by default...
解决方案:
定位问题原因:
-
首次模型加载很慢(大模型下载)。
-
显存吃紧(双 ControlNet 最少 12GB)。
-
图像过多。
-
每张图像生成时间久。
于是进行以下优化:
-
禁用符号链接警告:
os.environ["HF_HUB_DISABLE_SYMLINKS_WARNING"] = "1"
-
清显存:
torch.cuda.empty_cache()
-
降推理步数:从 50 → 30 步(20 秒/张)
-
加日志输出,处理进度清晰
-
限量测试两张图像验证稳定性
torch.cuda.empty_cache()
lines = lines[:2] # 限量测试
for i, line in enumerate(lines, 1):print(f"\n处理第 {i}/{len(lines)} 张图像...")with autocast():image = pipe(..., num_inference_steps=30, ...)
进步:
-
程序不卡了,生成速度快了。
-
日志显示详细,能定位问题。
-
限量测试验证可行性。
阶段 4:确认文件夹路径
问题:
我自己的路径结构比较复杂,之前的代码没对上:
-
边缘图:
generated_pic_contronet_canny1
-
颜色图:
generated_pic_contronet_color1
-
生成图:
generated_pic_contronet_2_color1
解决方案:
代码更新为以下路径配置:
image_dir = r"D:\YAN\pythonProject\diffusion\Dateset\DeepFashion\Pic"
save_dir = r"D:\YAN\pythonProject\diffusion\generated_pic_contronet_2\generated_pic_contronet_2_color1"
canny_save_dir = r"D:\YAN\pythonProject\diffusion\generated_pic_contronet_2\generated_pic_contronet_canny1"
color_save_dir = r"D:\YAN\pythonProject\diffusion\generated_pic_contronet_2\generated_pic_contronet_color1"
dataset_path = r"D:\YAN\pythonProject\diffusion\Dateset\DeepFashion\captions.txt"
还加了两个优化:
-
提示词增加:
ultra-detailed clothing patterns
-
动态模糊核(纯色用
(31, 31)
,其余(51, 51)
)
进步:
路径全部对齐,提示词更服装化,生成图像更细腻。
阶段 5:成功测试 2 张图像
问题:
运行 2 张图像做稳定性测试,控制台输出如下:
开始读取 captions.txt...
共读取 27 行数据
处理第 1/2 张图像...
图像: MEN-Denim-id_00000080-01_7_additional.jpg, 提示词: The lower clothing...
Canny 边缘图已保存: ...
颜色图已保存: ...
开始生成图像,预计耗时 10-20 秒...
图像生成完成: ...
但是出现了警告:
FutureWarning: `torch.cuda.amp.autocast` is deprecated...
解决方案:
警告是因为 autocast
的导入方式老了,更新如下:
from torch.amp import autocast
with autocast('cuda'):image = pipe(...)
进步:
-
2 张图像成功生成:结构准,颜色准。
-
警告消除,代码更干净。
阶段 6:生成全部 27 张图像
问题:
准备跑完整数据,生成 27 张图像(边缘 + 颜色 + 最终图)。
解决方案:
-
注释掉限量代码
lines = lines[:2]
-
保留所有优化(步数 30、模糊核调整、提示词增强等)
-
添加进度日志
-
预计耗时 10~12 分钟
for i, line in enumerate(lines, 1):print(f"\n处理第 {i}/{len(lines)} 张图像...")
进步:
支持完整批量生成,图像质量符合预期,生成过程稳定流畅。
总结与展望
从最初的边缘图到双条件融合,我这次探索走了六个阶段:
-
确定需求,确定颜色图可用高斯模糊搞定
-
适配 DeepFashion 数据集格式,提示词更贴合服装
-
优化运行,解决显存和卡顿问题
-
对齐路径结构,提升整体可用性
-
测试通过,消除所有运行警告
-
批量运行成功,稳定生成所有图像
技术收获:
-
学会了 ControlNet 多条件融合方式(边缘图 + 颜色图)
-
优化了提示词和权重组合([1.0, 0.9])
-
提升了代码鲁棒性(错误处理 + 日志)
后续优化方向:
-
效果评估:看看 plaid、cotton、color 表现如何
-
添加新条件(语义图、深度图)
-
消融实验