ControlNet Canny边缘检测实战手册:从一条命令到可控出图
ControlNet Canny边缘检测实战手册:从一条命令到可控出图
【免费下载链接】ControlNetLet us control diffusion models!项目地址: https://gitcode.com/gh_mirrors/co/ControlNet
ControlNet 是 Stable Diffusion 的附加控制网络,配合 Canny 边缘检测后,你只需上传一张照片,就能让生成图像严格保留原图的构图与轮廓,同时由提示词决定内容、颜色和风格。这篇手册带你从一条启动命令开始,到把参数调出效果。
最短路径跑通第一张图
核心结论:建好环境、下载权重,一条命令就能看到出图。
git clone https://gitcode.com/gh_mirrors/co/ControlNet cd ControlNet conda env create -f environment.yaml conda activate control权重文件(SD 1.5 底模 +control_sd15_canny.pth)放到models/目录,各检测器权重放到annotator/ckpts/,来源是仓库 README 里给出的 Hugging Face 页面,下载一次即可复用。
然后启动 Canny 应用:
python gradio_canny2image.py浏览器会自动打开页面(地址形如http://0.0.0.0:7860)。上传一张图 → Prompt 填一个具体名词(比如bird或cute dog)→ 点Run。第一张图的默认参数已经可用,不用动任何东西:Canny 阈值 100/200,Control Strength 1.0,Steps 20,分辨率 512。
ControlNet 是怎么工作的
核心结论:可训练副本学条件,锁定副本保原模型,边缘图经 zero convolution 逐层注入。
原版 Stable Diffusion 的 encoder 被复制出一份"可训练副本",负责学习 Canny 线条这类条件;原版 encoder 保持锁定,生成能力不受影响。条件信号通过一组初始权重为零的 1×1 卷积(zero convolution)注入原模型,训练前输出全零、不产生任何干扰,所以用少量数据微调也不会"毁掉"底模。实际推理时的流程很短:输入图先缩放到 512,Canny 算子提边,边图与提示词一起喂给 DDIM 采样器,20 步左右即可出图。
参数按什么顺序调
核心结论:先用 Canny 阈值管线条,再用 strength 管贴合度,最后用 steps 管细节。
参数按"它影响什么 → 怎么调"来看,建议按这个顺序动:
- Canny low / high threshold—— 影响线条密度。两个值同时上调,边缘越来越少、越来越干净;同时下调,细节和杂边变多。先只动这对参数,把边图调到"能看清主体轮廓"为止。
- Control Strength(0–2,默认 1.0)—— 影响生成图对线条的服从程度。偏高(1.2–1.5)构图锁死,适合产品、建筑;偏软(0.7–0.9)给模型留变形余量,适合人物和照片重绘。
- Guidance Scale(0.1–30,默认 9.0)—— 影响对提示词的服从度。调高更贴词,调低画面更"野生"。一般 7–10 之间就够了。
- Steps(1–100,默认 20)—— 影响细节与耗时。20 步出图快、够看;30–40 步细节更好;追求极致再加到 50。
- Guess Mode(勾选框)—— 影响无提示词时的行为。勾上之后即使 Prompt 留空,encoder 也会尽力从线条里"猜"内容,玩法见后文对照表。
三组可直接照抄的组合:
| 场景 | Canny 低/高阈值 | Strength | Scale | Steps |
|---|---|---|---|---|
| 通用(照片变插画) | 100 / 200 | 1.0 | 9.0 | 20 |
| 细节丰富(线稿、毛发) | 50 / 150 | 0.8 | 10.0 | 35 |
| 结构严谨(建筑、产品) | 150 / 250 | 1.3 | 7.5 | 40 |
按任务区分写法
核心结论:不同任务先动哪个参数完全不同,别用一套参数打天下。
线稿上色 / 彩稿生成
短清单流程:
- 上传线稿(线条闭合、无杂线最好)。
- Canny 阈值降到 50/150 附近,确保细线也被提取。
- Prompt 只写内容名词,风格词放 Added Prompt 里。
- Strength 0.8–1.0,Steps 25 以上。
- 线稿本身质量差时,别死磕参数——先用 Canny 从参考照片重新提一张线稿。
产品、建筑与结构图
这类任务先保证"线干净",再谈其他:
| 参数 | 建筑结构图 | 室内场景换风格 |
|---|---|---|
| Canny 阈值 | 150/250 | 100/200 |
| Strength | 1.2–1.5 | 1.0 |
| Guidance Scale | 7.0–8.0 | 9.0 |
| Steps | 30–40 | 30 |
| 提示词重点 | 材质、光照、"detailed architecture" | 风格流派、色调 |
直线和几何形体对偏移零容忍,strength 宁高勿低;换风格类任务线条只是骨架,strength 给 1.0 即可。
猜谜模式(Guess Mode)🔎
同一个界面,换个开关就是另一种玩法:
| 维度 | 常规模式 | Guess Mode |
|---|---|---|
| Prompt | 必填,决定内容 | 可留空,encoder 从线条自行推断 |
| 推荐 Steps | 20–40 | 50 |
| 推荐 Scale | 7–10 | 3–5 |
| 结果特征 | 忠实于"线+词" | 每次跑都是新的猜测,风格化更明显 |
猜谜模式下多条边线的"猜测"可能各不相同,连跑几次等于免费抽卡。
避坑清单 ⚠️
核心结论:九成问题出在线条、strength 和显存三件事上。
| 现象 | 常见原因 | 修复方式 |
|---|---|---|
| Canny 边图碎成一片 | 阈值过低、原图噪点多 | 阈值整体上调(如 150/250),或改跑gradio_hed2image.py用 HED 软边界 |
| 结果和线稿对不上 | strength 偏低、提示词与轮廓冲突 | strength 提到 1.2–1.5,把提示词改成与画面内容一致 |
| 显存不足 / OOM | 分辨率或张数偏高、显卡 8GB | docs/low_vram.md 里把config.py的save_memory设为 True,分辨率 512、张数降到 1–2 |
| 出图偏糊 | steps 太少 | Steps 加到 30–40 |
| 换了社区模型效果不一致 | 权重是标准 SD1.5 训练的 | 用tool_transfer_control.py迁移到目标模型 |
进阶与扩展
核心结论:同一套流程可换 8 种控制条件,还能自己训。
仓库里还有深度(gradio_depth2image.py)、人体姿态(gradio_pose2image.py)、语义分割(gradio_seg2image.py)、法线(gradio_normal2image.py)、涂鸦(gradio_scribble2image.py)等 9 个 Gradio 应用,界面和参数逻辑与 Canny 版基本一致,换脚本即可上手。多个 ControlNet 叠加做多条件控制的能力已在 WebUI 插件中实验支持,界面如下:
想用自己的数据训练控制器,docs/train.md 有完整流程(数据标注可参考 docs/annotator.md);显卡在 8GB 档位的,低显存模式开起来后批量生成 12 张也没有压力。
更多细节看 docs/faq.md,跑不通时先在那里找一遍。
【免费下载链接】ControlNetLet us control diffusion models!项目地址: https://gitcode.com/gh_mirrors/co/ControlNet
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考