分步骤拆解:ControlNet 高可控生成完整流程
它通过引入可训练的网络分支,将输入条件(如边缘图、深度图、人体姿态等)与原始扩散模型结合,实现高精度的图像生成控制。核心思想是保持原始模型权重不变,仅训练控制分支,避免破坏预训练模型的生成能力。加载 Stable Diffusion 和 ControlNet 模型,将条件图作为控制输入。需指定提示词(prompt)和负向提示词(negative prompt)引导生成方向。生成结果可通过超分辨率模
ControlNet 基础概念
ControlNet 是一种通过额外条件控制扩散模型生成结果的技术。它通过引入可训练的网络分支,将输入条件(如边缘图、深度图、人体姿态等)与原始扩散模型结合,实现高精度的图像生成控制。核心思想是保持原始模型权重不变,仅训练控制分支,避免破坏预训练模型的生成能力。
准备工作
安装 PyTorch 和 Diffusers 库,确保 GPU 支持。ControlNet 通常与 Stable Diffusion 结合使用,需下载预训练模型(如 stable-diffusion-v1-5)和对应的 ControlNet 适配权重(如 controlnet-canny)。
pip install torch diffusers transformers accelerate
输入条件生成
根据需求生成控制条件图:
- 边缘检测:使用 Canny 或 HED 提取图像轮廓。
- 深度图:通过 MiDaS 或 LeReS 模型预测场景深度。
- 姿态关键点:OpenPose 提取人体骨骼信息。
示例代码(Canny 边缘检测):
import cv2
import numpy as np
image = cv2.imread("input.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200) # 调整阈值控制边缘细节
cv2.imwrite("edges.png", edges)
模型加载与推理
加载 Stable Diffusion 和 ControlNet 模型,将条件图作为控制输入。需指定提示词(prompt)和负向提示词(negative prompt)引导生成方向。
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
import torch
controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny", torch_dtype=torch.float16)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=controlnet,
torch_dtype=torch.float16
).to("cuda")
prompt = "a futuristic city, neon lights, 4k detailed"
image = pipe(prompt, image=edges).images[0]
image.save("output.png")
参数调优
- 控制强度:通过
controlnet_conditioning_scale调整条件图的影响权重(默认 1.0),值越高则生成结果越贴近输入条件。 - 去噪步数:
num_inference_steps影响生成质量与时间,通常 20-50 步。 - 提示词权重:使用
(word:weight)语法强调特定元素,如(neon:1.3)。
多条件融合
支持同时使用多个 ControlNet 条件(如边缘+深度),需加载多个 ControlNet 模型并合并输入:
controlnets = [
ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny"),
ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-depth")
]
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=controlnets,
torch_dtype=torch.float16
)
conditions = [canny_image, depth_image]
output = pipe(prompt, image=conditions)
后处理优化
生成结果可通过超分辨率模型(如 ESRGAN)提升细节,或使用 Inpainting 修复局部瑕疵。调整色彩平衡或对比度使图像更自然。
更多推荐



所有评论(0)