社区计算机视觉课程文档
扩散模型的控制
并获得增强的文档体验
开始使用
扩散模型的控制
Dreambooth
尽管扩散模型和GAN可以生成许多独特的图像,但它们并非总能精确生成您需要的图像。因此,您必须微调模型,这通常需要大量数据和计算。然而,有些技术可以通过少量示例来个性化模型。
一个例子是Google Research的Dreambooth,这是一种训练技术,通过仅使用主题或风格的少量图像进行训练来更新整个扩散模型。它的工作原理是将提示中的一个特殊词与示例图像关联起来。有关Dreambooth的详细信息可以在论文和Hugging Face Dreambooth训练文档中找到。
下面您可以看到使用Dreambooth在4张狗的图像上进行训练并进行一些推理示例的结果。 您可以按照上面给出的Hugging Face文档重现结果。
从这个例子可以看出,模型已经学会了关于那只特定狗的信息,并且可以生成该狗在不同姿势和背景下的新图像。尽管计算、数据和时间都有改进,但其他人已经找到了更有效的方法来定制模型。
这就是目前最流行的方法:低秩适应(LoRA)。该方法最初由微软在这篇论文中提出,旨在高效微调大型语言模型。其主要思想是将权重更新矩阵分解为两个低秩矩阵,在训练过程中优化这些矩阵,而模型的其余部分则保持冻结。Hugging Face文档提供了一份关于LoRA工作原理的良好概念指南。
现在,如果我们把这些想法结合起来,就可以使用LoRA通过Dreambooth高效地用少量示例微调扩散模型。关于如何实现这一点的Google Colab教程可以在这里找到。
由于这种方法的质量和效率,许多人创建了自己的LoRA参数,其中许多可以在Civitai和Hugging Face这两个网站上找到。对于Civitai,您可以下载通常在50-500MB范围内的LoRA权重;对于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经过边缘检测条件训练,左上角的图像用作输入。在这里,我们可以看到所有生成的图像形状非常相似,但颜色不同。这是因为ControlNet正在引导扩散模型创建与输入图像形状相同的图像。
要使用Stable Diffusion XL运行ControlNet的代码,请参阅此处的官方文档,但如果您只想测试一些示例,请查看此Gradio演示,它允许您尝试不同类型的ControlNet。
< > 在 GitHub 上更新