社区计算机视觉课程文档
扩散模型的控制
并获得增强的文档体验
开始
扩散模型的控制
Dreambooth
尽管扩散模型和 GANs 可以生成许多独特的图像,但它们并不总是能准确生成您需要的内容。因此,您必须微调模型,这通常需要大量数据和计算。然而,有些技术可以使用少量示例来个性化模型。
一个例子是 Google Research 的 Dreambooth,这是一种训练技术,通过仅在少量主题或风格的图像上训练来更新整个扩散模型。它的工作原理是将提示中的一个特殊词与示例图像关联起来。Dreambooth 的详细信息可以在论文和 Hugging Face Dreambooth 训练文档中找到。
下面,您可以看到 Dreambooth 用于训练 4 张狗的图像和一些推理示例的结果。 您可以按照上面给出的 Hugging Face 文档重现结果。
从这个例子中,很明显模型已经学习了关于那只特定狗的信息,并且可以生成那只狗在不同姿势和背景下的新图像。尽管计算、数据和时间有所改进,但其他人已经找到了更有效的方法来定制模型。
这就是目前最流行的模型定制方法 Low Rank Adaptation (LoRA) 的用武之地。此方法最初由微软在此论文中开发,用于高效地微调大型语言模型。其主要思想是将权重更新矩阵分解为 2 个低秩矩阵,这些矩阵在训练期间进行优化,而模型的其余部分则被冻结。Hugging Face 文档对 LoRA 的工作原理有很好的概念性指导。
现在,如果我们把这些想法结合起来,我们可以使用 LoRA 在少量示例上有效地微调扩散模型,使用 Dreambooth。关于如何做到这一点的教程 Google Colab notebook 可以在这里找到。
由于此方法的质量和效率,许多人创建了自己的 LoRA 参数,其中许多可以在名为 Civitai 和 Hugging Face 的网站上找到。对于 Civitai,您可以下载 LoRA 权重,这些权重通常在 50-500MB 范围内;对于 Hugging Face 版本,您可以直接从模型中心加载模型。下面是如何在这两种情况下加载 LoRA 权重,然后将它们与模型融合的示例。
我们可以从安装 diffusers 库开始。
pip install diffusers
我们将初始化 StableDiffusionXLPipeline
并加载 LoRA 适配器权重。
from diffusers import StableDiffusionXLPipeline
import torch
model = "stabilityai/stable-diffusion-xl-base-1.0"
pipe = StableDiffusionXLPipeline.from_pretrained(model, torch_dtype=torch.float16)
pipe.load_lora_weights(
"lora_weights.safetensors"
) # if you want to install from a weight file
pipe.load_lora_weights(
"ostris/crayon_style_lora_sdxl"
) # if you wish to install a lora from a repository directly
pipe.fuse_lora(lora_scale=0.8)
这使得快速加载定制的扩散模型并将其用于推理变得容易,尤其是在有很多模型可供选择的情况下。然后,如果我们想移除 LoRA 权重,我们可以调用 pipe.unfuse_lora()
,这将使模型恢复到原始状态。至于 lora_scale
参数,这是一个超参数,用于控制在推理期间使用多少 LoRA 权重。值为 1.0 表示 LoRA 权重完全使用,值为 0.0 表示根本不使用 LoRA 权重。最佳值通常在 0.7 和 1.0 之间,但值得尝试不同的值,看看哪一个最适合您的用例。
您可以在此 Gradio 演示中尝试一些 Hugging Face LoRA 模型
通过 ControlNet 的引导扩散
扩散模型有很多方法可以引导它们创建所需的输出,例如提示、负面提示、引导尺度、图像修复等等。在这里,我们将重点介绍一种名为 ControlNet 的方法,该方法有许多变体,并且可以与其他所有方法结合使用。它是由斯坦福大学在这篇论文中介绍的。此方法允许我们使用图像来引导扩散模型,该图像通常包含非常具体的信息,例如深度、姿势、边缘等等。这使得生成的图像更加一致,而这通常是扩散模型的一个问题。
ControlNet 可用于文本到图像和图像到图像。下面是一个文本到图像的示例,使用了一个在边缘检测条件下训练的 ControlNet,其中左上角的图像用作输入。在这里,我们可以看到所有生成的图像都具有非常相似的形状,但颜色不同。这是因为 ControlNet 正在引导扩散模型创建与输入图像形状相同的图像。
要使用 Stable Diffusion XL 运行 ControlNet 的代码,请参阅此处的官方文档here,但如果您只想测试一些示例,请查看此 Gradio 演示,该演示允许您尝试不同类型的 ControlNet
< > 在 GitHub 上更新