ControlNet
ControlNet 为文生图扩散模型增加空间控制,利用边缘图、深度图或姿态骨架引导布局。了解其工作原理并查看代码。
ControlNet 是一种神经网络架构,可为预训练的文本生成图像扩散模型(例如 Stable Diffusion)添加空间控制。除了文本提示外,它还接收一张条件图像,例如边缘图、深度图、人体姿态骨架或分割图。生成图像会遵循条件图像中的结构,而内容和风格则由提示决定。例如,将“身穿银色盔甲的骑士”这一提示与姿态骨架结合,就能生成姿势完全符合骨架的骑士。斯坦福大学的 Lvmin Zhang、Anyi Rao 和 Maneesh Agrawala 于 2023 年在论文《为文本生成图像的扩散模型添加条件控制》中介绍了 ControlNet;该论文获得了 ICCV 2023 最佳论文 Marr 奖。基础模型的权重保持冻结,因此 ControlNet 在添加控制能力的同时,不会损害模型已有的知识。
ControlNet 如何工作#
Stable Diffusion 通过反复对潜变量去噪,利用 U-Net生成图像。ControlNet 会锁定该 U-Net,并创建一个可训练副本,其中包含 12 个编码模块和一个中间模块。首先,一个小型卷积神经网络会将 512×512 的条件图像转换成 64×64 的特征图,使其与潜变量匹配。可训练副本会处理潜变量和这些条件特征,其输出随后会加入锁定的 U-Net 的 12 个跳跃连接及其中间模块中,因此锁定的解码器会接收到控制信号:
副本只通过零卷积与锁定模型连接:这些 1×1 卷积的权重和偏置初始值均为零。在训练的第一步中,它们的输出为零,因此组合模型的行为与原始模型完全相同,不会有随机噪声传入预训练层。输出零卷积仍会获得非零权重梯度,因为它的输入非零,所以第一次更新就会使其权重偏离零,控制信号也由此逐渐增强。以下 PyTorch代码展示了其中一个模块:
import copy
import torch
from torch import nn
# A frozen block from the pretrained model and a trainable copy of it
torch.manual_seed(0)
locked = nn.Conv2d(64, 64, 3, padding=1).requires_grad_(False)
trainable = copy.deepcopy(locked).requires_grad_(True)
# Zero convolutions: 1x1 convolutions whose weights and biases start at zero
zero_in, zero_out = nn.Conv2d(64, 64, 1), nn.Conv2d(64, 64, 1)
for conv in (zero_in, zero_out):
nn.init.zeros_(conv.weight)
nn.init.zeros_(conv.bias)
x = torch.randn(1, 64, 32, 32) # features entering the block
condition = torch.randn(1, 64, 32, 32) # encoded edge, depth, or pose map
y = locked(x) + zero_out(trainable(x + zero_in(condition)))
# At step 0 the output equals the frozen block's, and only the outer zero conv gets a gradient
print(torch.equal(y, locked(x)))
y.sum().backward()
print(f"zero_in grad: {zero_in.weight.grad.norm():.1f}, zero_out grad: {zero_out.weight.grad.norm():.1f}")它会打印 True 和 zero_in grad: 0.0, zero_out grad: 2040.6。该模块的输出与冻结模型完全相同;由于输入非零,外层零卷积会获得梯度;外层零卷积偏离零后,内层零卷积也开始学习。
条件类型#
原论文分别为 Canny 边缘、深度图、表面法线图、M-LSD 直线、HED 软边缘、ADE20K分割图、OpenPose 人体姿态和用户草图训练了独立的 ControlNet。每张条件图像都会通过现成模型从参考照片中提取,例如使用 OpenCV的 Canny 边缘检测器或深度估计网络;还可以同时应用多个 ControlNet,并为每个 ControlNet 设置各自的强度。Ultralytics YOLO26姿态估计模型可以提取这类姿态条件,为每个人预测 17 个 COCO 关键点,并可将关键点绘制成黑色画布上的骨架:
import cv2
import numpy as np
from ultralytics import YOLO
# 加载 YOLO26 姿态模型,为每个人预测 17 个关键点
model = YOLO("yolo26n-pose.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# 只绘制骨架,并使用与照片尺寸相同的黑色画布
skeletons = result.plot(img=np.zeros_like(result.orig_img), boxes=False)
cv2.imwrite("pose_condition.png", skeletons)保存的图像会以彩色线条显示每个人的四肢,照片中的颜色、纹理和背景则被移除。
ControlNet 与相关方法的对比#
- LoRA:微调一小组新增权重,让模型学会新的风格、角色或对象。LoRA 会改变模型绘制的内容,ControlNet 则控制内容的位置,两者通常会结合使用。
- T2I-Adapter:一种更轻量的替代方案,参数约为 7,700 万;它将条件特征添加到冻结 U-Net 的编码器特征中,而不是运行完整的编码器副本。生成时可以组合不同条件的适配器。
- 图生图:从经过加噪的输入照片副本开始去噪,因此输出会继承该照片的颜色和大致布局。ControlNet 只约束提取出的结构(例如边缘),颜色和纹理由提示决定。
- 图像修复:重新生成图像中的蒙版区域,使其与其他部分匹配。图像修复控制哪些区域会改变,ControlNet 则控制生成内容的结构。
实际应用#
- 建筑与室内设计:房间的草图、CAD 线稿或 M-LSD 线图可转换为不同材质和风格的逼真渲染图,同时保持相同的几何结构。
- 角色艺术与动画:姿态骨架可在不同风格变化中固定角色姿势;从参考视频中逐帧提取的姿态则能生成连贯的动画序列。
- 产品与营销图像:产品照片的深度图或边缘图可固定其形状和位置,同时由提示改变环境、光照和背景。
- 合成数据:根据分割图或姿态生成图像,可以创建标签已预先确定的新训练图像,因为布局是在生成前指定的。
训练 ControlNet#
训练需要成对的图像和条件图,这些条件图可以通过在带标题的图像数据集上运行条件提取器自动生成。由于锁定的权重不需要更新梯度,每次训练迭代只比不使用 ControlNet 优化 Stable Diffusion 多占用约 23% 的 GPU 内存,耗时多 34%;论文报告称,在少于 50,000 张图像到超过 100 万张图像的数据集上,都能进行稳健训练。训练还会出现“突然收敛”:模型会在数千步内忽略条件,然后突然开始遵循条件,通常在 10,000 个优化步骤内发生;论文中的示例在第 6,133 步时出现这一现象。










