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 修复局部瑕疵。调整色彩平衡或对比度使图像更自然。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐