Diffusers 中的 ControlNet
Hugging Face 已将 ControlNet 集成到 diffusers 库中,通过 StableDiffusionControlNetPipeline,允许用户使用深度图、分割图、涂鸦和关键点等特定空间上下文来条件化图像生成。此集成提供了一个最小化的接口来定制生成过程,使得可以将草图转换为艺术绘画,或在不同角色之间保持完全相同的姿势。
ControlNet 架构与训练
ControlNet 是由 Lvmin Zhang 和 Maneesh Agrawala 提出的框架,为文本到图像的扩散模型添加条件控制。该架构通过创建扩散模型(例如 Stable Diffusion 的潜在 UNet)预训练参数的 可训练副本,同时保留 锁定副本(原始参数)来实现。
关键技术细节包括:
- 参数保留:锁定副本保留了从大规模数据集学习到的通用知识,而可训练副本学习任务特定的空间条件。
- 零卷积:可训练副本与锁定副本通过 “zero convolution” 层相连。这些层在训练期间被优化,以确保冻结模型已学到的语义在加入新条件时得以保留。
- 条件特异性:每一种新的空间条件都需要一套单独训练的 ControlNet 权重。例如,Canny 边缘图和语义分割图各自使用不同的权重。
推理与内存管理
运行 ControlNet 需要同时加载预训练的扩散模型权重和对应的 ControlNet 权重。例如,在 Stable Diffusion v1‑5 上使用一个 ControlNet 检查点会额外增加约 7 亿参数,导致相较于标准 Stable Diffusion 更高的显存需求。
为优化性能,Hugging Face 在 diffusers 实现中推荐以下技术:
- Smart CPU Offloading:使用
enable_model_cpu_offload()可确保模型组件(CLIP 文本编码器、UNet、ControlNet、VAE 解码器)仅在需要时才加载到 GPU 内存,从而显著降低 VRAM 消耗。 - Fast Schedulers:将默认的 PNDMScheduler 替换为
UniPCMultistepScheduler,可将推理步数从 50 减少到 20,且质量损失不大。 - Attention Acceleration:启用
xformers的内存高效注意力进一步提升速度和内存利用率。
通过这些优化,在 V100 GPU 上使用约 4 GB VRAM,图像生成大约只需 3 秒。
实现与使用案例
StableDiffusionControlNetPipeline 通过将文本提示与空间条件相结合,实现了灵活的图像生成。
单一条件示例
- Canny Edge Detection:用户可以使用 OpenCV 生成图像的 Canny 边缘图,ControlNet 随后利用该图保持原图的精确构图,同时更换主体(例如在经典画作的姿势下渲染不同的名人)。
- OpenPose:使用
controlnet_aux中的OpenposeDetector,用户可以从图像中提取人体姿势,并将这些精确姿势应用到新生成的角色上,如超级英雄做瑜伽。 - DreamBooth Integration:ControlNet 可与微调模型结合使用。通过 DreamBooth 微调的模型(例如 Mr. Potato Head 模型)可以在
StableDiffusionControlNetPipeline中使用,将特定主体放置在受控的空间构图中。
组合多重条件
多个 ControlNet 条件可以同时用于同一图像。通过向管道传入 ControlNetModel 实例列表以及对应的条件列表,用户可以组合不同的空间控制。
为优化多条件结果,推荐以下策略:
- Masking:对某一条件图的区域进行遮罩,使其不与另一条件图重叠(例如遮罩 Canny 图的中心,为 OpenPose 图留出空间)。
- Conditioning Scale:调整
controlnet_conditioning_scale,以在不同空间条件之间设定优先级。
支持的条件模型
- 深度 (
sd-controlnet-depth) - HED (
sd-controlnet-hed) - 法线 (
sd-controlnet-normal) - 涂鸦 (
sd-controlnet-scribble) - 分割 (
sd-controlnet-seg) - OpenPose (
sd-controlnet-openpose) - MLSD (
sd-controlnet-mlsd) - Canny (
sd-controlnet-canny)
Sources
- OriginalControlNet in 🧨 Diffusers