文本到图像
当您想到扩散模型时,文本到图像通常是首先想到的事情之一。文本到图像根据文本描述生成图像(例如,“丛林中的宇航员,冷色调,柔和的颜色,细节丰富,8k”),这也被称为提示。
从非常高的层次上讲,扩散模型接收提示和一些随机的初始噪声,并迭代地去除噪声以构建图像。去噪过程由提示引导,并且一旦去噪过程在预定的时间步长后结束,图像表示就会解码成图像。
阅读稳定扩散是如何工作的? 博客文章,以了解更多关于潜在扩散模型是如何工作的。
您可以在 🤗 Diffusers 中通过两个步骤从提示生成图像
- 将检查点加载到AutoPipelineForText2Image 类中,该类会根据检查点自动检测要使用的适当管道类
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, variant="fp16"
).to("cuda")
- 将提示传递给管道以生成图像
image = pipeline(
"stained glass of darth vader, backlight, centered composition, masterpiece, photorealistic, 8k"
).images[0]
image
流行模型
最常见的文本到图像模型是稳定扩散 v1.5、稳定扩散 XL (SDXL) 和 康定斯基 2.2。还有 ControlNet 模型或适配器,可与文本到图像模型一起使用,以便在生成图像时进行更直接的控制。由于模型的架构和训练过程不同,每个模型的结果略有不同,但无论您选择哪个模型,其用法都或多或少相同。让我们对每个模型使用相同的提示并比较其结果。
稳定扩散 v1.5
稳定扩散 v1.5 是一个潜在的扩散模型,它从 稳定扩散 v1-4 初始化,并在 LAION-Aesthetics V2 数据集的 512x512 图像上经过 595K 步的微调。您可以像这样使用此模型
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, variant="fp16"
).to("cuda")
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", generator=generator).images[0]
image
稳定扩散 XL
SDXL 是之前稳定扩散模型的一个更大版本,它涉及一个两阶段的模型过程,可以为图像添加更多细节。它还包括一些额外的微条件,以生成以主体为中心的优质图像。查看更全面的SDXL 指南,以了解有关如何使用它的更多信息。一般来说,您可以像这样使用 SDXL
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16, variant="fp16"
).to("cuda")
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", generator=generator).images[0]
image
康定斯基 2.2
康定斯基模型与稳定扩散模型略有不同,因为它还使用图像先验模型来创建嵌入,这些嵌入用于更好地对齐扩散模型中的文本和图像。
使用康定斯基 2.2 的最简单方法是
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"kandinsky-community/kandinsky-2-2-decoder", torch_dtype=torch.float16
).to("cuda")
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", generator=generator).images[0]
image
ControlNet
ControlNet 模型是辅助模型或适配器,它们在文本到图像模型(例如 稳定扩散 v1.5)之上进行微调。将 ControlNet 模型与文本到图像模型结合使用,为更明确地控制如何生成图像提供了多种选择。使用 ControlNet,您可以向模型添加额外的条件输入图像。例如,如果您提供一个人体姿势的图像(通常表示为连接成骨骼的多个关键点)作为条件输入,则模型会生成遵循图像姿势的图像。查看更深入的ControlNet 指南,以了解有关其他条件输入以及如何使用它们的更多信息。
在本例中,让我们使用人体姿势估计图像作为 ControlNet 的条件。加载在人体姿势估计上预训练的 ControlNet 模型
from diffusers import ControlNetModel, AutoPipelineForText2Image
from diffusers.utils import load_image
import torch
controlnet = ControlNetModel.from_pretrained(
"lllyasviel/control_v11p_sd15_openpose", torch_dtype=torch.float16, variant="fp16"
).to("cuda")
pose_image = load_image("https://huggingface.co/lllyasviel/control_v11p_sd15_openpose/resolve/main/images/control.png")
将controlnet
传递给 AutoPipelineForText2Image,并提供提示和姿势估计图像
pipeline = AutoPipelineForText2Image.from_pretrained(
"runwayml/stable-diffusion-v1-5", controlnet=controlnet, torch_dtype=torch.float16, variant="fp16"
).to("cuda")
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", image=pose_image, generator=generator).images[0]
image
配置管道参数
管道中可以配置许多参数,这些参数会影响图像的生成方式。您可以更改图像的输出大小,指定负面提示以提高图像质量,等等。本节将深入探讨如何使用这些参数。
高度和宽度
height
和 width
参数控制生成图像的高度和宽度(以像素为单位)。默认情况下,Stable Diffusion v1.5 模型输出 512x512 的图像,但您可以将其更改为任何 8 的倍数。例如,要创建矩形图像
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, variant="fp16"
).to("cuda")
image = pipeline(
"Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", height=768, width=512
).images[0]
image
其他模型可能具有不同的默认图像大小,具体取决于训练数据集中的图像大小。例如,SDXL 的默认图像大小为 1024x1024,使用较低的 height
和 width
值可能会导致图像质量下降。请务必先查看模型的 API 参考!
引导尺度
guidance_scale
参数会影响提示对图像生成的影响程度。较低的值会赋予模型“创造力”,以生成与提示关系较为松散的图像。较高的 guidance_scale
值会迫使模型更紧密地遵循提示,如果此值过高,您可能会在生成的图像中观察到一些伪影。
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16
).to("cuda")
image = pipeline(
"Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", guidance_scale=3.5
).images[0]
image
负面提示
就像提示引导生成一样,负面提示可以引导模型远离您不希望模型生成的事物。这通常用于通过去除诸如“低分辨率”或“糟糕细节”等不良图像特征来提高整体图像质量。您还可以使用负面提示来移除或修改图像的内容和风格。
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16
).to("cuda")
image = pipeline(
prompt="Astronaut in a jungle, cold color palette, muted colors, detailed, 8k",
negative_prompt="ugly, deformed, disfigured, poor details, bad anatomy",
).images[0]
image
生成器
一个torch.Generator
对象通过设置手动种子在管道中启用可重复性。您可以使用 Generator
生成图像批次,并根据使用确定性生成提高图像质量指南中详细介绍的内容,迭代改进从种子生成的图像。
您可以设置种子和 Generator
,如下所示。使用 Generator
创建图像应该每次都返回相同的结果,而不是随机生成新图像。
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16
).to("cuda")
generator = torch.Generator(device="cuda").manual_seed(30)
image = pipeline(
"Astronaut in a jungle, cold color palette, muted colors, detailed, 8k",
generator=generator,
).images[0]
image
控制图像生成
除了配置管道的参数(例如提示加权和 ControlNet 模型)之外,还有几种方法可以对图像的生成方式施加更多控制。
提示加权
提示加权是一种用于提高或降低提示中概念的重要性以强调或最小化图像中某些特征的技术。我们建议使用Compel库来帮助您生成加权提示嵌入。
了解如何在提示加权指南中创建提示嵌入。此示例重点介绍如何在管道中使用提示嵌入。
创建嵌入后,您可以将其传递给管道中的 prompt_embeds
(如果您使用负面提示,则为 negative_prompt_embeds
)参数。
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16
).to("cuda")
image = pipeline(
prompt_embeds=prompt_embeds, # generated from Compel
negative_prompt_embeds=negative_prompt_embeds, # generated from Compel
).images[0]
ControlNet
正如您在ControlNet部分中看到的,这些模型通过合并额外的条件图像输入,提供了一种更灵活、更准确的生成图像的方式。每个 ControlNet 模型都针对特定类型的条件图像进行了预训练,以生成类似于它的新图像。例如,如果您使用在深度图上预训练的 ControlNet 模型,则可以向模型提供深度图作为条件输入,它将生成保留其中空间信息的图像。这比在提示中指定深度信息更快、更容易。您甚至可以将多个条件输入与MultiControlNet结合使用!
您可以使用许多类型的条件输入,并且 🤗 Diffusers 支持 Stable Diffusion 和 SDXL 模型的 ControlNet。请查看更全面的ControlNet指南,了解如何使用这些模型。
优化
扩散模型很大,并且对图像进行去噪的迭代性质在计算上代价高昂且密集。但这并不意味着您需要访问强大的——甚至许多——GPU 才能使用它们。有许多优化技术可以在消费级和免费资源上运行扩散模型。例如,您可以以半精度加载模型权重以节省 GPU 内存并提高速度,或者将整个模型卸载到 GPU 以节省更多内存。
PyTorch 2.0 还支持一种更节省内存的注意力机制,称为缩放点积注意力,如果您使用的是 PyTorch 2.0,则会自动启用。您可以将其与torch.compile
结合使用,以进一步加快代码速度
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, variant="fp16").to("cuda")
pipeline.unet = torch.compile(pipeline.unet, mode="reduce-overhead", fullgraph=True)
有关如何优化代码以节省内存并加快推理速度的更多技巧,请阅读内存和速度和Torch 2.0指南。
< > 在 GitHub 上更新