Diffusers 文档

控制网

Hugging Face's logo
加入Hugging Face社区

并获取增强型文档体验

开始使用

ControlNet

ControlNet是在《在文本到图像扩散模型中添加条件控制》中引入的,作者为张鲁明、饶安义、阿格拉瓦尔。

有了ControlNet模型,您可以提供额外的控制图像来条件化和控制稳定的 DIFFUSION生成。例如,如果您提供深度图,ControlNet模型将生成一个保留深度图空间信息的图像。这是一种更灵活、更精确的控制图像生成过程的方法。

论文的摘要如下

我们提出了一种名为ControlNet的神经网络架构,用于将空间条件控制添加到大型、预训练的文本到图像扩散模型。ControlNet锁定了成熟的大型扩散模型,并重用了它们的深度和健壮的编码层,这些编码层在数十亿张图片上进行了预训练,作为一个强大的骨干来学习多样化的条件控制。神经网络架构通过“零卷积”(零初始化的卷积层)连接,这些卷积层逐步从零增加参数,并确保不会有害的噪声影响微调。我们使用Stable Diffusion测试了各种条件控制,例如边缘、深度、分割、人体姿态等,使用单或多个条件,是否有提示。我们证明,ControlNet的训练对小型数据集(<50k)和大型数据集(>1m)都是鲁棒的。广泛的结果表明,ControlNet可能促进图像扩散模型更广泛的应用。

此模型由takuma104贡献。💖

原始代码库可以在lllyasviel/ControlNet找到,您可以在lllyasviel的 Hub个人资料中找到官方的ControlNet检查点。

请查看调度器的指南,了解如何在调度器速度和质量之间进行权衡,并查看跨管道复用组件部分,了解如何将相同组件高效加载到多个管道中。

StableDiffusionControlNetPipeline

diffusers.StableDiffusionControlNetPipeline

< >

( vae: AutoencoderKL text_encoder: CLIPTextModel tokenizer: CLIPTokenizer unet: UNet2DConditionModel controlnet: Union scheduler: KarrasDiffusionSchedulers safety_checker: StableDiffusionSafetyChecker feature_extractor: CLIPImageProcessor image_encoder: CLIPVisionModelWithProjection = None requires_safety_checker: bool = True )

参数

  • vae (AutoencoderKL) — 变分自动编码器(VAE)模型,用于将图像编码和解码为潜在表示。
  • text_encoder (CLIPTextModel) — 冻结文本编码器(clip-vit-large-patch14)。
  • tokenizer (CLIPTokenizer) — 用于标记文本的 CLIPTokenizer。
  • unet (UNet2DConditionModel) — 用于去噪编码后的图像潜在值的 UNet2DConditionModel。
  • controlnet (ControlNet模型List[ControlNet模型]) — 在去噪过程中为 unet 提供额外的条件。如果您将多个 ControlNet 作为列表设置,则将每个 ControlNet 的输出相加以创建一个组合附加条件。
  • 调度器 (SchedulerMixin) — 一个调度器,与 unet 结合以去噪编码图像潜伏量。可以是 DDIMSchedulerLMSDiscreteSchedulerPNDMScheduler 之一。
  • 安全检查器 (StableDiffusionSafetyChecker) — 用于估计生成的图像是否可能被认为是冒犯性或有害的分类模块。请参阅有关模型潜在危害的更多详细信息 模型卡片
  • feature_extractor (CLIPImageProcessor) — 用于从生成的图像中提取特征的 CLIPImageProcessor,用作 safety_checker 的输入。

使用 ControlNet 指导的 Stable Diffusion 进行文本到图像生成的管道。

此模型继承自 DiffusionPipeline。请检查超类文档中实现的所有 pipeline 的通用方法(下载、保存、在某些设备上运行等)。

该管道还继承了以下加载方法

__call__

< >

( prompt: Union = None image: Union = None height: Optional = None width: Optional = None num_inference_steps: int = 50 timesteps: List = None sigmas: List = None guidance_scale: float = 7.5 negative_prompt: Union = None num_images_per_prompt: Optional = 1 eta: float = 0.0 generator: Union = None latents: Optional = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None ip_adapter_image: Union = None ip_adapter_image_embeds: Optional = None output_type: Optional = 'pil' return_dict: bool = True cross_attention_kwargs: Optional = None controlnet_conditioning_scale: Union = 1.0 guess_mode: bool = False control_guidance_start: Union = 0.0 control_guidance_end: Union = 1.0 clip_skip: Optional = None callback_on_step_end: Union = None callback_on_step_end_tensor_inputs: List = ['latents'] **kwargs ) StableDiffusionPipelineOutput or tuple

参数

  • prompt (strList[str]可选) — 引导图像生成的提示或提示列表。如果没有定义,则需要传递 prompt_embeds
  • imagetorch.TensorPIL.Image.Imagenp.ndarrayList[torch.Tensor]List[PIL.Image.Image]List[np.ndarray],— List[List[torch.Tensor]]List[List[np.ndarray]]List[List[PIL.Image.Image]]):提供给unet生成引导的控制网输入条件。如果指定类型为torch.Tensor,则直接作为是传递给控制网的。PIL.Image.Image也可以作为图片接收。输出图片的尺寸默认与image相同。如果传递高度和/或宽度,则相应调整图片的大小。如果在init中指定多个ControlNets,则图像必须作为列表传递,以便列表的每个元素都可以正确地分批输入单个ControlNet。当prompt是一个列表,并且为单个ControlNet传递了图像列表时,每个图像将与prompt列表中的每个提示配对。这也适用于多个ControlNets,可以为每个提示和每个ControlNet传递图像列表的列表以进行批量处理。
  • heightint,可选,默认为self.unet.config.sample_size * self.vae_scale_factor)— 生成图片的像素高度。
  • widthint,可选,默认为self.unet.config.sample_size * self.vae_scale_factor)— 生成图片的像素宽度。
  • num_inference_steps (int, 可选, 默认为50) — 噪声消除步骤的数量。通常,更多的噪声消除步骤会使图像质量更高,但会以较慢的推理速度为代价。
  • timesteps (List[int], 可选) — 使用带有支持在set_timesteps方法中具有timesteps参数的调度程序进行降噪过程的自定义timesteps。如果没有定义,当传递num_inference_steps时将使用默认行为。必须按降序排列。
  • sigmas (List[float], 可选) — 使用带有支持在set_timesteps方法中具有sigmas参数的调度程序进行降噪过程的自定义sigma。如果没有定义,当传递num_inference_steps时将使用默认行为。
  • guidance_scale (float, optional, defaults to 7.5) — 较高的引导比例值会鼓励模型生成与文本 prompt 密切相关的图像,牺牲图像质量。当 guidance_scale > 1 时,引导比例启用。
  • negative_prompt (str or List[str], optional) — 指导不包含在图像生成中的提示或提示列表。如果未定义,则需要传递 negative_prompt_embeds。当不使用引导(guidance_scale < 1)时忽略。
  • num_images_per_prompt (int, optional, defaults to 1) — 每个提示生成的图像数量。
  • eta (float, 可选, 默认为 0.0) — 对应于DDIM 论文中的参数 eta (η)。仅适用于 DDIMScheduler,在其他调度器中被忽略。
  • generator (torch.GeneratorList[torch.Generator], 可选) — 一个 torch.Generator,用于使生成过程确定。
  • latents (torch.Tensor, 可选) — 预生成的从高斯分布中采集的噪声 latents,用于图像生成的输入。可用于使用不同的提示调整相同的生成。如果不提供,则通过提供的随机 generator 生成 latents 张量。
  • prompt_embeds (torch.Tensor可选) — 预生成的文本嵌入。可用于轻松调整文本输入(提示加权)。如果未提供,则从 prompt 输入参数生成文本嵌入。
  • negative_prompt_embeds (torch.Tensor可选) — 预生成的负文本嵌入。可用于轻松调整文本输入(提示加权)。如果未提供,则从 negative_prompt 输入参数生成 negative_prompt_embeds。ip_adapter_image — (PipelineImageInput可选):与 IP 适配器一起工作时可选的图像输入。
  • ip_adapter_image_embeds (List[torch.Tensor]可选) — IP-适配器的预生成图像嵌入。它应该是一个与 IP 适配器数量相同的长度列表。每个元素应该是一个形状为 (batch_size, num_images, emb_dim) 的张量。如果 do_classifier_free_guidance 设置为 True,它应该包含负图像嵌入。如果未提供,则从 ip_adapter_image 输入参数计算嵌入。
  • output_type (str, 可选, 默认为 "pil") — 生成的图像的输出格式。选择 PIL.Imagenp.array
  • return_dict (bool, 可选, 默认为 True) — 是否返回 StableDiffusionPipelineOutput 而不是普通元组。
  • callback (Callable, 可选) — 在推理过程中每隔 callback_steps 步调用一次的函数。函数使用以下参数调用: callback(step: int, timestep: int, latents: torch.Tensor)
  • callback_steps (int, 可选, 默认为1) — 调用 callback 函数的频率。如果未指定,则在每一步调用回调函数。
  • cross_attention_kwargs (dict, 可选) — 一个kwargs字典,如果指定,则传递给 AttentionProcessor,如 self.processor 中定义.
  • controlnet_conditioning_scale (floatList[float], 可选, 默认为1.0) — 在将ControlNet的输出添加到原始 unet 的残差之前,将它们乘以 controlnet_conditioning_scale。如果在 init 中指定了多个ControlNet,您可以将相应的缩放级别作为列表设置。
  • guess_mode (bool, 可选, 默认为 False) — ControlNet 编码器即使在您删除所有提示的情况下也会尝试识别输入图像的内容。建议使用 3.0 到 5.0 之间的 guidance_scale 值。
  • control_guidance_start (floatList[float], 可选, 默认为 0.0) — ControlNet 开始应用的步骤总数的百分比。
  • control_guidance_end (floatList[float], 可选, 默认为 1.0) — ControlNet 停止应用的步骤总数的百分比。
  • clip_skip (int, 可选) — 在计算提示嵌入时跳过的CLIP层数。数值1表示预最终层的输出将用于计算提示嵌入。
  • callback_on_step_end (Callable, PipelineCallback, MultiPipelineCallbacks, 可选) — 在推理过程中每个去噪步骤结束时调用的函数或PipelineCallbackMultiPipelineCallbacks的子类。带有以下参数:callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)callback_kwargs将包括由callback_on_step_end_tensor_inputs指定的所有张量的列表。
  • callback_on_step_end_tensor_inputs (List, 可选) — 为callback_on_step_end函数指定的张量输入列表。列表中的张量将作为callback_kwargs参数传递。你只能包含你的管道类._callback_tensor_inputs属性中列出的变量。

返回值

StableDiffusionPipelineOutputtuple

如果 return_dictTrue,则返回 StableDiffusionPipelineOutput,否则返回一个 tuple,其中第一个元素是一个包含生成的图像的列表,第二个元素是一个包含 bool 值的列表,指示相应的生成图像是否包含“不适合工作场所”(nsfw)的内容。

调用生成管道的调用函数。

示例

>>> # !pip install opencv-python transformers accelerate
>>> from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler
>>> from diffusers.utils import load_image
>>> import numpy as np
>>> import torch

>>> import cv2
>>> from PIL import Image

>>> # download an image
>>> image = load_image(
...     "https://hf.co/datasets/huggingface/documentation-images/resolve/main/diffusers/input_image_vermeer.png"
... )
>>> image = np.array(image)

>>> # get canny image
>>> image = cv2.Canny(image, 100, 200)
>>> image = image[:, :, None]
>>> image = np.concatenate([image, image, image], axis=2)
>>> canny_image = Image.fromarray(image)

>>> # load control net and stable diffusion v1-5
>>> controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny", torch_dtype=torch.float16)
>>> pipe = StableDiffusionControlNetPipeline.from_pretrained(
...     "runwayml/stable-diffusion-v1-5", controlnet=controlnet, torch_dtype=torch.float16
... )

>>> # speed up diffusion process with faster scheduler and memory optimization
>>> pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
>>> # remove following line if xformers is not installed
>>> pipe.enable_xformers_memory_efficient_attention()

>>> pipe.enable_model_cpu_offload()

>>> # generate image
>>> generator = torch.manual_seed(0)
>>> image = pipe(
...     "futuristic-looking woman", num_inference_steps=20, generator=generator, image=canny_image
... ).images[0]

enable_attention_slicing

< >

( slice_size: Union = 'auto' )

参数

  • slice_size (strint可选,默认为 "auto")—当为 "auto" 时,将输入的注意力头数减半,因此会将注意力计算分为两步进行。如果为 "max",将保存最大内存,每次只运行一个切片。如果提供数字,使用 attention_head_dim // slice_size 个切片。在这种情况下,attention_head_dim 必须是 slice_size 的倍数。

启用切片注意力计算。当此选项启用时,注意力模块会将输入张量分成多个切片,分多步计算注意力。对于多个注意力头,计算将依次对每个头进行。这样可以节省一些内存,但会产生轻微的速度下降。

⚠️ 如果你已经使用了 PyTorch 2.0 或 xFormers 的 scaled_dot_product_attention(SDPA),请不要启用注意力切片。这些注意力计算已经非常内存高效,所以你不需要启用此功能。如果使用 SDPA 或 xFormers 启用注意力切片,可能会导致严重的速度降低!

示例

>>> import torch
>>> from diffusers import StableDiffusionPipeline

>>> pipe = StableDiffusionPipeline.from_pretrained(
...     "runwayml/stable-diffusion-v1-5",
...     torch_dtype=torch.float16,
...     use_safetensors=True,
... )

>>> prompt = "a photo of an astronaut riding a horse on mars"
>>> pipe.enable_attention_slicing()
>>> image = pipe(prompt).images[0]

disable_attention_slicing

< >

( )

禁用切片注意力计算。如果之前调用了 enable_attention_slicing,则注意力在一个步骤中计算。

enable_vae_slicing

< >

( )

启用切片 VAE 解码。当此选项启用时,VAE 将将输入张量分割成块来分步骤进行解码。这有助于节省内存并允许更大的批量大小。

disable_vae_slicing

< >

( )

禁用切片 VAE 解码。如果之前启用了 enable_vae_slicing,此方法将回到单个步骤中进行解码计算。

enable_xformers_memory_efficient_attention

< >

( attention_op: 可选 = None )

参数

  • attention_op (Callable, optional) — 用于替换默认的 None 操作符,以作为 xFormers 的 memory_efficient_attention() 函数的 op 参数。

启用来自 xFormers 的内存高效注意力。当此选项启用时,您应该观察到更低的 GPU 内存使用量,并在推理期间可能获得加速。训练期间的加速不能保证。

⚠️ 当同时启用内存高效注意力和切片注意力时,内存高效注意力优先。

示例

>>> import torch
>>> from diffusers import DiffusionPipeline
>>> from xformers.ops import MemoryEfficientAttentionFlashAttentionOp

>>> pipe = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-2-1", torch_dtype=torch.float16)
>>> pipe = pipe.to("cuda")
>>> pipe.enable_xformers_memory_efficient_attention(attention_op=MemoryEfficientAttentionFlashAttentionOp)
>>> # Workaround for not accepting attention shape using VAE for Flash Attention
>>> pipe.vae.enable_xformers_memory_efficient_attention(attention_op=None)

disable_xformers_memory_efficient_attention

< >

( )

禁用来自 xFormers 的内存高效注意力。

load_textual_inversion

< >

( pretrained_model_name_or_path: Union token: Union = None tokenizer: Optional = None text_encoder: Optional = None **kwargs )

参数

  • pretrained_model_name_or_path (stros.PathLikeList[str or os.PathLike]DictList[Dict]) — 可以是以下之一或它们的列表:
  • token (strList[str]可选) — 覆盖用于文本倒置权重的token。如果pretrained_model_name_or_path是列表,则token也必须是长度相等的列表。
  • text_encoder (CLIPTextModel可选) — 冻结的文本编码器 (clip-vit-large-patch14)。如果没有指定,函数将使用self.tokenizer。
  • tokenizer (CLIPTokenizer可选) — 用于标记文本的 CLIPTokenizer。如果没有指定,函数将使用self.tokenizer。
  • weight_name (str, 可选) — 自定义权重文件的名称。以下情况下应使用此选项:

    • 已保存的文本反转文件为 🤗 Diffusers 格式,但以特定的权重名称保存,例如 text_inv.bin
    • 保存的文本反转文件为 Automatic1111 格式。
  • cache_dir (Union[str, os.PathLike], 可选) — 如果不使用标准缓存,则缓存预训练模型配置的目录路径。
  • force_download (bool, 可选, 默认为 False) — 是否强制下载模型权重和配置文件,如果存在缓存版本则覆盖。
  • proxiesDict[str, str]可选)—— 一个按协议或端点使用的代理服务器字典,例如, {'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}。代理在每个请求中都被使用。
  • local_files_onlybool可选,默认为False)—— 是否只加载本地模型权重和配置文件。如果设置为True,则模型不会从Hub下载。
  • tokenstr可选)—— 用于远程文件HTTP携带身份验证的令牌。如果设置为True,将使用从diffusers-cli login生成(存储在~/.huggingface)的令牌。
  • 修订版本 (str, 可选, 默认为 "main") — 要使用的特定模型版本。它可以是一个分支名称、标签名称、提交id或Git允许的任何标识符。
  • 子目录 (str, 可选, 默认为 "") — 在Hub或本地较大的模型仓库中模型文件的子目录位置。
  • 镜像 (str, 可选) — 如果在中国下载模型,用于解决可访问性问题。我们不保证源的时间性或安全性,您应参考镜像站以获取更多信息。

将文本逆变换嵌入加载到《StableDiffusionPipeline》文本编码器中(支持🤗 Diffusers和Automatic1111格式)。

示例

加载🤗 Diffusers格式的文本逆变换嵌入向量

from diffusers import StableDiffusionPipeline
import torch

model_id = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16).to("cuda")

pipe.load_textual_inversion("sd-concepts-library/cat-toy")

prompt = "A <cat-toy> backpack"

image = pipe(prompt, num_inference_steps=50).images[0]
image.save("cat-backpack.png")

加载Automatic1111格式的文本逆变换嵌入向量,请确保先下载该向量(例如从civitAI)然后加载向量

本地

from diffusers import StableDiffusionPipeline
import torch

model_id = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16).to("cuda")

pipe.load_textual_inversion("./charturnerv2.pt", token="charturnerv2")

prompt = "charturnerv2, multiple views of the same character in the same outfit, a character turnaround of a woman wearing a black jacket and red shirt, best quality, intricate details."

image = pipe(prompt, num_inference_steps=50).images[0]
image.save("character.png")

encode_prompt

< >

) 提示 设备 每个提示生成的图片数量 是否启用classifier_free_guideane negative_prompt = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None lora_scale: Optional = None clip_skip: Optional = None )

参数

  • prompt (字符串字符串列表,可选) — 需要编码的prompt设备 — torch.device
  • num_images_per_prompt (int) — 每个提示应生成的图片数量
  • do_classifier_free_guidance (bool) — 是否使用分类器自由指导
  • negative_prompt (strList[str], 可选) — 不用于引导图像生成的提示或提示列表。如果没有定义,必须传递 negative_prompt_embeds。在没有使用引导的情况下(即,如果 guidance_scale 小于 1 则忽略)。
  • prompt_embedstorch.Tensor可选)— 预生成的文本嵌入。可用于轻松调整文本输入,例如调整提示权重。如果没有提供,文本嵌入将从 prompt 输入参数生成。
  • negative_prompt_embedstorch.Tensor可选)— 预生成的负文本嵌入。可用于轻松调整文本输入,例如调整提示权重。如果没有提供,负文本嵌入将从 negative_prompt 输入参数生成。
  • lora_scalefloat可选)— 在加载 LoRA 层的情况下,将应用于文本编码器的所有 LoRA 层的 LoRA 尺度。
  • clip_skip (int, 可选) — 在计算提示嵌入时跳过的CLIP层数。值为1表示将使用预最终层的输出用于计算提示嵌入。

将提示编码成文本编码器的隐藏状态。

get_guidance_scale_embedding

< >

( w: Tensor embedding_dim: int = 512 dtype: dtype = torch.float32 ) torch.Tensor

参数

  • w (torch.Tensor) — 生成具有指定引导缩放率的嵌入向量,然后用它来丰富时间步嵌入。
  • embedding_dim (int, optional, 默认为512) — 要生成嵌入的维度。
  • dtype (torch.dtype, optional, 默认为torch.float32) — 生成的嵌入的数据类型。

返回值

torch.Tensor

嵌入向量,形状为(len(w), embedding_dim)

参见https://github.com/google-research/vdm/blob/dc27b98a554f65cdc654b800da5aa1846545d41b/model_vdm.py#L298

StableDiffusionControlNetImg2ImgPipeline

diffusers.StableDiffusionControlNetImg2ImgPipeline

< >

( vae: AutoencoderKL text_encoder: CLIPTextModel tokenizer: CLIPTokenizer unet: UNet2DConditionModel controlnet: Union scheduler: KarrasDiffusionSchedulers safety_checker: StableDiffusionSafetyChecker feature_extractor: CLIPImageProcessor image_encoder: CLIPVisionModelWithProjection = None requires_safety_checker: bool = True )

参数

  • vae (AutoencoderKL) — 编码和解码图像至潜表示的变分自动编码器 (VAE) 模型。
  • text_encoder (CLIPTextModel) — 冻结文本编码器 (clip-vit-large-patch14)。
  • tokenizer (CLIPTokenizer) — 用于分词的 CLIPTokenizer。
  • unet (UNet2DConditionModel) — 一个用于降噪编码后图像潜在变量的 UNet2DConditionModel
  • controlnet (ControlNetModelList[ControlNetModel]) — 在降噪过程中为 unet 提供额外的条件。如果将多个 ControlNet 作为列表设置,则将每个 ControlNet 的输出相加以创建一个单独的补充条件。
  • scheduler (SchedulerMixin) — 一个用于与 unet 结合使用的调度程序,用于降噪编码后的图像潜在变量。可以是 DDIMSchedulerLMSDiscreteSchedulerPNDMScheduler 之一。
  • 安全检查器 (StableDiffusionSafetyChecker) — 估算生成图像是否可能被视为冒犯性或有害的分类模块。请参考模型卡片获取有关模型潜在危害的更多详细信息。
  • 特征提取器 (CLIPImageProcessor) — 用于从生成图像中提取特征的 CLIPImageProcessor;用作 安全检查器 的输入。

使用 ControlNet 指导的 Stable Diffusion 生成图像的管道。

此模型继承自 DiffusionPipeline。请检查超类文档中实现的所有 pipeline 的通用方法(下载、保存、在某些设备上运行等)。

该管道还继承了以下加载方法

__call__

< >

( prompt: Union = None image: Union = None control_image: Union = None height: Optional = None width: Optional = None strength: float = 0.8 num_inference_steps: int = 50 guidance_scale: float = 7.5 negative_prompt: Union = None num_images_per_prompt: Optional = 1 eta: float = 0.0 generator: Union = None latents: Optional = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None ip_adapter_image: Union = None ip_adapter_image_embeds: Optional = None output_type: Optional = 'pil' return_dict: bool = True cross_attention_kwargs: Optional = None controlnet_conditioning_scale: Union = 0.8 guess_mode: bool = False control_guidance_start: Union = 0.0 control_guidance_end: Union = 1.0 clip_skip: Optional = None callback_on_step_end: Union = None callback_on_step_end_tensor_inputs: List = ['latents'] **kwargs ) StableDiffusionPipelineOutput or tuple

参数

  • prompt (strList[str]可选)- 用于指导图像生成的提示或提示列表。如果未定义,需要传递 prompt_embeds
  • image (torch.TensorPIL.Image.Imagenp.ndarrayList[torch.Tensor]List[PIL.Image.Image]List[np.ndarray],- List[List[torch.Tensor]]List[List[np.ndarray]]List[List[PIL.Image.Image]])- 作为图像生成过程起点的初始图像。也可以接受作为 image 的图像隐式,如果直接传递隐式,则不再进行编码。
  • control_image (torch.TensorPIL.Image.Imagenp.ndarrayList[torch.Tensor]List[PIL.Image.Image]List[np.ndarray],- List[List[torch.Tensor]]List[List[np.ndarray]]List[List[PIL.Image.Image]])- 提供给 `unet` 的 ControlNet 输入条件以提供生成指导。如果指定类型为 `torch.Tensor`,则按原样传递给 ControlNet。PIL.Image.Image 也可以接受作为图像。输出图像的尺寸默认为 `image` 的尺寸。如果传递高度和/或宽度,则根据 `image` 的尺寸进行相应调整。如果在 `init` 中指定了多个 ControlNet,则必须将图像作为列表传递,以便列表的每个元素都可以正确分批处理并输入到单个 ControlNet。
  • 高度 (int, 可选,默认为 self.unet.config.sample_size * self.vae_scale_factor) — 生成图像的像素高度。
  • 宽度 (int, 可选,默认为 self.unet.config.sample_size * self.vae_scale_factor) — 生成图像的像素宽度。
  • 强度 (float, 可选,默认为 0.8) — 表示将参考 image 转换的程度。必须在 0 和 1 之间。image 作为起始点使用,而添加的噪声越多,则 strength 越高。去噪步骤的数量取决于最初添加的噪声量。当 strength 为 1 时,添加的噪声最大,去噪过程运行 num_inference_steps 中指定的完整迭代次数。值为 1 实际上忽略了 image
  • num_inference_steps (int, 可选,默认值 50) — 消噪步骤的数量。更多的消噪步骤通常会导致图像质量更高,但推理速度会减慢。
  • guidance_scale (float, 可选,默认值 7.5) — 较高的指导尺度值会鼓励模型生成与文本 prompt 密切相关的图像,但会牺牲图像质量。当 guidance_scale > 1 时启用指导尺度。
  • negative_prompt (strList[str], 可选) — 指导不在图像生成中包含的提示或提示列表。如果没有定义,则需要传递 negative_prompt_embeds。未使用指导时(guidance_scale < 1)将被忽略。
  • num_images_per_prompt (int, 可选, 默认为 1) — 每个提示产生的图片数量。
  • eta (float, 可选, 默认为 0.0) — 对应于DDIM论文中的参数eta(η)。仅适用于DDIMScheduler,在其他调度器中被忽略。
  • generator (torch.GeneratorList[torch.Generator], 可选) — 用于生成确定性的torch.Generator
  • latents (torch.Tensor, 可选) — 从高斯分布中采样的预生成的噪音潜变量,用于图像生成的输入。可以用来调整不同提示下的相同生成。如果没有提供,将使用提供的随机 generator 生成潜变量张量。
  • prompt_embeds (torch.Tensor, 可选) — 预生成的文本嵌入。可用于轻松调整文本输入(提示权重)。如果没有提供,则从 prompt 输入参数中生成文本嵌入。
  • negative_prompt_embeds (torch.Tensor, 可选) — 预生成的负文本嵌入。可用于轻松调整文本输入(提示权重)。如果没有提供,则从 negative_prompt 输入参数生成负文本嵌入。ip_adapter_image — (PipelineImageInput, 可选):用于与IP适配器一起工作的可选图像输入。
  • ip_adapter_image_embeds (torch.Tensor列表,可选) — 为IP-Adapter预生成的图像嵌入。它应该是一个长度与IP-adapter数量相同的列表。每个元素应该是形状为(batch_size, num_images, emb_dim)的张量。如果有设置do_classifier_free_guidanceTrue,则应包含负图像嵌入。如果没有提供,则从输入参数ip_adapter_image中计算嵌入。
  • output_type (str可选,默认为"pil") — 生成的图像输出格式。可选择PIL.Imagenp.array
  • return_dict (bool可选,默认为True) — 是否返回StableDiffusionPipelineOutput对象而不是一个原始元组。
  • cross_attention_kwargs (dict, 可选) — 一个kwargs字典,如果指定,则传递给定义为 self.processorAttentionProcessor
  • controlnet_conditioning_scale (floatList[float], 可选, 默认为 1.0) — 在将 ControlNet 的输出加到原始 unet 的残差之前,将输出乘以 controlnet_conditioning_scale。如果在 init 中指定了多个 ControlNets,您可以将相应的比例作为列表设置。
  • guess_mode (bool, 可选, 默认为 False) — 即使移除了所有提示,ControlNet 编码器也尝试识别输入图像的内容。建议使用 3.0 到 5.0 之间的 guidance_scale 值。
  • callback_on_step_end (Callable, PipelineCallback, MultiPipelineCallbacks, 可选) — 一个在推理过程中每个去噪步骤结束时被调用的函数或PipelineCallbackMultiPipelineCallbacks的子类。具有以下参数:callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)。`callback_kwargs`将包含由`callback_on_step_end_tensor_inputs`指定的所有张量的列表。
  • callback_on_step_end_tensor_inputs (列表, 可选) — callback_on_step_end函数的输入张量列表。列表中指定的张量将被作为 callback_kwargs 参数传递。您只能包括属于您管道类._callback_tensor_inputs属性的变量列表的变量。

返回值

StableDiffusionPipelineOutputtuple

如果 return_dictTrue,则返回 StableDiffusionPipelineOutput,否则返回一个 tuple,其中第一个元素是一个包含生成的图像的列表,第二个元素是一个包含 bool 值的列表,指示相应的生成图像是否包含“不适合工作场所”(nsfw)的内容。

调用生成管道的调用函数。

示例

>>> # !pip install opencv-python transformers accelerate
>>> from diffusers import StableDiffusionControlNetImg2ImgPipeline, ControlNetModel, UniPCMultistepScheduler
>>> from diffusers.utils import load_image
>>> import numpy as np
>>> import torch

>>> import cv2
>>> from PIL import Image

>>> # download an image
>>> image = load_image(
...     "https://hf.co/datasets/huggingface/documentation-images/resolve/main/diffusers/input_image_vermeer.png"
... )
>>> np_image = np.array(image)

>>> # get canny image
>>> np_image = cv2.Canny(np_image, 100, 200)
>>> np_image = np_image[:, :, None]
>>> np_image = np.concatenate([np_image, np_image, np_image], axis=2)
>>> canny_image = Image.fromarray(np_image)

>>> # load control net and stable diffusion v1-5
>>> controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny", torch_dtype=torch.float16)
>>> pipe = StableDiffusionControlNetImg2ImgPipeline.from_pretrained(
...     "runwayml/stable-diffusion-v1-5", controlnet=controlnet, torch_dtype=torch.float16
... )

>>> # speed up diffusion process with faster scheduler and memory optimization
>>> pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
>>> pipe.enable_model_cpu_offload()

>>> # generate image
>>> generator = torch.manual_seed(0)
>>> image = pipe(
...     "futuristic-looking woman",
...     num_inference_steps=20,
...     generator=generator,
...     image=image,
...     control_image=canny_image,
... ).images[0]

enable_attention_slicing

< >

( slice_size: Union = 'auto' )

参数

  • slice_size (strint可选,默认为 "auto")— 当设置为 "auto" 时,将输入数组的尺寸减半,以两步计算注意力。如果设置为 "max",每次只执行一个 slice,从而节省最多内存。当提供数字时,使用的 slice 数量为 attention_head_dim // slice_size。在这种情况下,attention_head_dim 必须是 slice_size 的倍数。

启用切片注意力计算。当此选项启用时,注意力模块会将输入张量分成多个切片,分多步计算注意力。对于多个注意力头,计算将依次对每个头进行。这样可以节省一些内存,但会产生轻微的速度下降。

⚠️ 如果你已经使用了 PyTorch 2.0 或 xFormers 的 scaled_dot_product_attention(SDPA),请不要启用注意力切片。这些注意力计算已经非常内存高效,所以你不需要启用此功能。如果使用 SDPA 或 xFormers 启用注意力切片,可能会导致严重的速度降低!

示例

>>> import torch
>>> from diffusers import StableDiffusionPipeline

>>> pipe = StableDiffusionPipeline.from_pretrained(
...     "runwayml/stable-diffusion-v1-5",
...     torch_dtype=torch.float16,
...     use_safetensors=True,
... )

>>> prompt = "a photo of an astronaut riding a horse on mars"
>>> pipe.enable_attention_slicing()
>>> image = pipe(prompt).images[0]

disable_attention_slicing

< >

( )

禁用切片注意力计算。如果之前调用了 enable_attention_slicing,则注意力在一个步骤中计算。

enable_vae_slicing

< >

( )

启用切片 VAE 解码。当此选项启用时,VAE 将将输入张量分割成块来分步骤进行解码。这有助于节省内存并允许更大的批量大小。

disable_vae_slicing

< >

( )

禁用切片 VAE 解码。如果之前启用了 enable_vae_slicing,此方法将回到单个步骤中进行解码计算。

enable_xformers_memory_efficient_attention

< >

( attention_op: 可选 = None )

参数

  • attention_op (Callable, 可选) — 覆盖默认的 None 操作符,以作为 xFormers 的 memory_efficient_attention() 函数的 op 参数使用。

启用来自 xFormers 的内存高效注意力。当此选项启用时,您应该观察到更低的 GPU 内存使用量,并在推理期间可能获得加速。训练期间的加速不能保证。

⚠️ 当同时启用内存高效注意力和切片注意力时,内存高效注意力优先。

示例

>>> import torch
>>> from diffusers import DiffusionPipeline
>>> from xformers.ops import MemoryEfficientAttentionFlashAttentionOp

>>> pipe = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-2-1", torch_dtype=torch.float16)
>>> pipe = pipe.to("cuda")
>>> pipe.enable_xformers_memory_efficient_attention(attention_op=MemoryEfficientAttentionFlashAttentionOp)
>>> # Workaround for not accepting attention shape using VAE for Flash Attention
>>> pipe.vae.enable_xformers_memory_efficient_attention(attention_op=None)

disable_xformers_memory_efficient_attention

( )

禁用来自 xFormers 的内存高效注意力。

load_textual_inversion

( pretrained_model_name_or_path: Union token: Union = None tokenizer: Optional = None text_encoder: Optional = None **kwargs )

参数

  • tokenstrList[str],可选) — 覆盖用于文本反演权重的令牌。如果 `pretrained_model_name_or_path` 是一个列表,那么 `token` 也必须是一个长度相等的列表。
  • text_encoderCLIPTextModel,可选) — 冻结的文本编码器(clip-vit-large-patch14)。如果未指定,函数将使用自带的词元器。
  • tokenizerCLIPTokenizer,可选) — 用于标记文本的 CLIPTokenizer。如果未指定,函数将使用自带的词元器。
  • weight_name (str, 可选) — 自定义权重文件的名称。当以下情况发生时使用:

    • 保存的文本反转文件在 🤗 Diffusers 格式,但保存了特定的权重名称,例如 text_inv.bin
    • 保存的文本反转文件在 Automatic1111 格式。
  • cache_dir (Union[str, os.PathLike], 可选) — 如果未使用标准缓存,则预训练模型配置缓存的目录。
  • force_download (bool, 可选,默认为 False) — 是否强制重新下载模型权重和配置文件,覆盖现有缓存版本(如果存在)。
  • proxies (Dict[str, str], 可选) — 使用协议或端点指定的代理服务器的字典,例如,{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}。代理在每次请求中使用。
  • local_files_only (bool, 可选, 默认 False) — 是否只加载本地的模型权重和配置文件。如果设置为 True,则模型不会从 Hub 下载。
  • token (str可选) — 用于远程文件 HTTP 触发授权的令牌。如果设置为 True,则使用从 diffusers-cli login(存储在 ~/.huggingface)生成的令牌。
  • 修订版 (str, 可选, 默认为 "main") — 要使用的特定模型版本。可以是分支名称、标签名称、提交 ID 或 Git 允许的任何标识符。
  • 子文件夹 (str, 可选, 默认为 "") — 在 Hub 或本地更大模型仓库中的模型文件所在子文件夹位置。
  • 镜像 (str, 可选) — 如果在中国下载模型,使用的镜像源以解决访问问题。我们不对源的时间性和安全性做出保证,您应参考镜像网站获取更多信息。

将文本逆变换嵌入加载到《StableDiffusionPipeline》文本编码器中(支持🤗 Diffusers和Automatic1111格式)。

示例

加载🤗 Diffusers格式的文本逆变换嵌入向量

from diffusers import StableDiffusionPipeline
import torch

model_id = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16).to("cuda")

pipe.load_textual_inversion("sd-concepts-library/cat-toy")

prompt = "A <cat-toy> backpack"

image = pipe(prompt, num_inference_steps=50).images[0]
image.save("cat-backpack.png")

加载Automatic1111格式的文本逆变换嵌入向量,请确保先下载该向量(例如从civitAI)然后加载向量

本地

from diffusers import StableDiffusionPipeline
import torch

model_id = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16).to("cuda")

pipe.load_textual_inversion("./charturnerv2.pt", token="charturnerv2")

prompt = "charturnerv2, multiple views of the same character in the same outfit, a character turnaround of a woman wearing a black jacket and red shirt, best quality, intricate details."

image = pipe(prompt, num_inference_steps=50).images[0]
image.save("character.png")

encode_prompt

< >

) 提示 设备 每个提示生成的图片数量 是否启用classifier_free_guideane negative_prompt = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None lora_scale: Optional = None clip_skip: Optional = None )

参数

  • prompt (strList[str], 可选) — 待编码的提示
  • num_images_per_prompt (int) — 每个提示应生成的图像数量
  • do_classifier_free_guidance (bool) — 是否使用分类器自由指导
  • negative_prompt (strList[str]可选) — 不用于指导图像生成的提示或提示列表。如果没有定义,则需要传递negative_prompt_embeds。在不使用指导时(即当 guidance_scale 小于 1 时)将被忽略。
  • prompt_embeds (torch.Tensor可选) — 预生成的文本嵌入。可以用于轻松调整文本输入,例如提示权重。如果没有提供,则从 prompt 输入参数生成文本嵌入。
  • negative_prompt_embeds (torch.Tensor可选) — 预生成的负文本嵌入。可以用于轻松调整文本输入,例如提示权重。如果没有提供,则从 negative_prompt 输入参数生成负文本嵌入。
  • lora_scalefloat可选)— 当加载LoRA层时,将应用于文本编码器中所有LoRA层的LoRA缩放值。
  • clip_skipint可选)— 在计算提示嵌入时要从CLIP跳过的层数。值为1表示将使用预最终层的输出进行计算提示嵌入。

将提示编码成文本编码器的隐藏状态。

StableDiffusionControlNetInpaintPipeline

diffusers.StableDiffusionControlNetInpaintPipeline

( vae: AutoencoderKL text_encoder: CLIPTextModel tokenizer: CLIPTokenizer unet: UNet2DConditionModel controlnet: Union scheduler: KarrasDiffusionSchedulers safety_checker: StableDiffusionSafetyChecker feature_extractor: CLIPImageProcessor image_encoder: CLIPVisionModelWithProjection = None requires_safety_checker: bool = True )

参数

  • vae (AutoencoderKL) — 变分自编码器 (VAE) 模型,用于对图像进行编码和解码以获取潜在的表示。
  • text_encoder (CLIPTextModel) — 冻结的文本编码器 (clip-vit-large-patch14)。
  • 调度器 (SchedulerMixin) — 与 unet 结合使用以去噪编码图像潜伏量的调度器。可以是 DDIMSchedulerLMSDiscreteSchedulerPNDMScheduler 之一。
  • 安全检查器 (StableDiffusionSafetyChecker) — 估计生成的图像是否可能被认为是有攻击性或有害的分类模块。有关模型潜在危害的更多详细信息,请参阅模型卡片
  • 特征提取器 (CLIPImageProcessor) — 用于从生成的图像中提取特征的 CLIPImageProcessor;用作 safety_checker 的输入。

使用 ControlNet 指导的稳定扩散图像修复管道。

此模型继承自 DiffusionPipeline。请检查超类文档中实现的所有 pipeline 的通用方法(下载、保存、在某些设备上运行等)。

该管道还继承了以下加载方法

此管道可以使用专门针对修复进行微调的检查点(runwayml/stable-diffusion-inpainting)以及默认文本到图像的稳定扩散检查点(runwayml/stable-diffusion-v1-5)一起使用。默认文本到图像的稳定扩散检查点可能更适合在那些上微调的 ControlNet,例如 lllyasviel/control_v11p_sd15_inpaint

__call__

< >

( prompt: Union = None image: Union = None mask_image: Union = None control_image: Union = None height: Optional = None width: Optional = None padding_mask_crop: Optional = None strength: float = 1.0 num_inference_steps: int = 50 guidance_scale: float = 7.5 negative_prompt: Union = None num_images_per_prompt: Optional = 1 eta: float = 0.0 generator: Union = None latents: Optional = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None ip_adapter_image: Union = None ip_adapter_image_embeds: Optional = None output_type: Optional = 'pil' return_dict: bool = True cross_attention_kwargs: Optional = None controlnet_conditioning_scale: Union = 0.5 guess_mode: bool = False control_guidance_start: Union = 0.0 control_guidance_end: Union = 1.0 clip_skip: Optional = None callback_on_step_end: Union = None callback_on_step_end_tensor_inputs: List = ['latents'] **kwargs ) StableDiffusionPipelineOutput or tuple

参数

  • prompt (strList[str], 可选) — 指导图像生成的提示或提示列表。如果没有定义,需要提供 prompt_embeds
  • image (torch.Tensor, PIL.Image.Image, np.ndarray, List[torch.Tensor], — List[PIL.Image.Image], 或 List[np.ndarray]): Image、NumPy 数组或张量,代表要使用的图像批次的起始点。对于 NumPy 数组和 PyTorch 张量,预期值范围是 [0, 1]。如果是张量或张量列表,则预期形状应为 (B, C, H, W)(C, H, W)。如果是 NumPy 数组或数组列表,则预期形状应为 (B, H, W, C)(H, W, C)。它还可以接受图像滞后作为 image,但如果是直接传递滞后,则不会再次编码。
  • mask_imagetorch.TensorPIL.Image.Imagenp.ndarrayList[torch.Tensor],— List[PIL.Image.Image],或 List[np.ndarray]):表示要遮罩 image 的图像批次的 Image、NumPy 数组或张量。可以在遮罩中重新绘制白色像素,而保留黑色像素。如果 mask_image 是 PIL 图像,在使用前将其转换为单通道(亮度)。如果是 NumPy 数组或 PyTorch 张量,则应包含一个颜色通道(L),而不是 3,因此 PyTorch 张量的预期形状为 (B, 1, H, W)(B, H, W)(1, H, W)(H, W)。NumPy 数组的形状可能为 (B, H, W, 1)(B, H, W)(H, W, 1)(H, W)
  • control_imagetorch.TensorPIL.Image.ImageList[torch.Tensor]List[PIL.Image.Image],— List[List[torch.Tensor]],或 List[List[PIL.Image.Image]]):为 unet 生成提供指导的 ControlNet 输入条件。如果指定的类型为 torch.Tensor,则直接将其传递给 ControlNet。PIL.Image.Image 也可以接受作为图像。输出图像的尺寸默认为 image 的尺寸。如果传入高度和/或宽度,则相应地调整 image 的大小。如果在 init 中指定了多个 ControlNets,则必须将图像作为列表传递,以便正确地将列表中的每个元素批次输入单个 ControlNet。
  • height (int, 可选,默认为 self.unet.config.sample_size * self.vae_scale_factor) — 生成图像的高度(像素)。
  • width (int, 可选,默认为 self.unet.config.sample_size * self.vae_scale_factor) — 生成图像的宽度(像素)。
  • padding_mask_crop (int, 可选,默认为 None) — 对图像及其掩码进行修剪的边框大小。如果为 None,则不对图像和掩码图像进行修剪。如果 padding_mask_crop 不是 None,则首先找到一个与图像具有相同宽高比并包含所有掩码区域的矩形区域,并根据 padding_mask_crop 进行扩展。然后根据扩展区域裁剪图像和掩码图像,在尺寸调整回原始图像大小之前进行修复。这对于掩码区域小而图像大且包含不影响修复背景等无关信息是有用的。
  • strength (float, 可选,默认为1.0) — 表示对参考 image 的变换程度。必须在0和1之间。将使用 image 作为起点,并添加更多噪声,当 strength 越高,添加的噪声就越多。降噪步数取决于初始添加的噪声量。当 strength 为1时,添加的噪声最大,降噪过程运行 num_inference_steps 中指定的全部迭代次数。1的值实际上忽略了 image
  • num_inference_steps (int, 可选,默认为50) — 降噪步骤的数量。更多的降噪步骤通常会导致图像质量更高,但推理会更慢。
  • guidance_scale (float, 可选,默认为7.5) — 较高的引导尺度值会在降低图像质量的同时鼓励模型生成与文本 prompt 密切相关的图像。当 guidance_scale > 1 时,启用引导尺度。
  • negative_prompt (str or List[str], 可选) — 导引图像生成时不包含内容的提示或提示列表。如果没有定义,需要传递 negative_prompt_embeds。在未使用指导的情况下(guidance_scale < 1)将被忽略。
  • num_images_per_prompt (int, 可选, 默认为1) — 每个提示生成图像的数量。
  • eta (float, 可选, 默认为0.0) — 与DDIM论文中的参数eta (η) 相对应。仅适用于DDIMScheduler,在其他调度器中将被忽略。
  • generator (torch.GeneratorList[torch.Generator] 可选) — 用于使生成过程确定性的torch.Generator
  • latents (torch.Tensor 可选) — 从高斯分布中预生成的噪声latents,作为图像生成的输入。可用于使用不同提示调整相同的生成。如果未提供,将使用提供的随机generator生成latents张量。
  • prompt_embeds (torch.Tensor 可选) — 预生成的文本嵌入。可用于轻松调整文本输入(提示权重)。如果未提供,将从prompt输入参数中生成文本嵌入。
  • negative_prompt_embeds (torch.Tensor, 可选) — 预生成的负文本嵌入。可用于轻松调整文本输入(提示权重)。如果未提供,则从 negative_prompt 输入参数生成 negative_prompt_embeds。ip_adapter_image — (PipelineImageInput, 可选):与 IP 适配器一起工作的可选图像输入。
  • ip_adapter_image_embeds (List[torch.Tensor], 可选) — 为 IP-Adapter 预生成的图像嵌入。它应该是一个长度与 IP-适配器数量相同的列表。每个元素应该是一个大小为(batch_size,num_images,emb_dim)的张量。如果 do_classifier_free_guidance 设置为 True,它应包含负图像嵌入。如果未提供,则从 ip_adapter_image 输入参数计算嵌入。
  • output_type (str, 可选,默认为 "pil") — 生成的图像的输出格式。选择 PIL.Imagenp.array
  • return_dict (bool, 可选, 默认为 True) — 是否返回StableDiffusionPipelineOutput而不是一个普通的元组。
  • cross_attention_kwargs (dict, 可选) — 一个kwargs字典,如果指定,将被传递到self.processor中定义的AttentionProcessor
  • controlnet_conditioning_scale (floatList[float], 可选, 默认为0.5) — 在将ControlNet的输出添加到原始unet中的残差之前,将输出乘以controlnet_conditioning_scale。如果在init中指定了多个ControlNet,可以将相应的比例作为列表设置。
  • guess_mode (bool, 可选, 默认为 False) — 当移除所有提示时,ControlNet 编码器尝试识别输入图像的内容。建议使用位于 3.0 到 5.0 之间的 guidance_scale 值。
  • control_guidance_start (floatList[float], 可选, 默认为 0.0) — ControlNet 开始应用的步骤总数的百分比。
  • control_guidance_end (floatList[float], 可选, 默认为 1.0) — ControlNet 停止应用的步骤总数的百分比。
  • clip_skip (int, 可选) — 在计算提示嵌入时从 CLIP 跳过的层数。值为 1 表示将使用预最终层的输出计算提示嵌入。
  • callback_on_step_end (Callable, PipelineCallback, MultiPipelineCallbacks, 可选) — 在推理过程中,每当去噪步骤结束时被调用的函数或 PipelineCallbackMultiPipelineCallbacks 的子类。带有以下参数:callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)callback_kwargs 将包含根据 callback_on_step_end_tensor_inputs 指定的所有张量的列表。
  • callback_on_step_end_tensor_inputs (, 可选) — callback_on_step_end 函数的输入张量列表。列表中指定的张量将作为 callback_kwargs 参数传递。您只能包含您的管道类 ._callback_tensor_inputs 属性中列出的变量。

返回值

StableDiffusionPipelineOutputtuple

如果 return_dictTrue,则返回 StableDiffusionPipelineOutput,否则返回一个 tuple,其中第一个元素是一个包含生成的图像的列表,第二个元素是一个包含 bool 值的列表,指示相应的生成图像是否包含“不适合工作场所”(nsfw)的内容。

调用生成管道的调用函数。

示例

>>> # !pip install transformers accelerate
>>> from diffusers import StableDiffusionControlNetInpaintPipeline, ControlNetModel, DDIMScheduler
>>> from diffusers.utils import load_image
>>> import numpy as np
>>> import torch

>>> init_image = load_image(
...     "https://huggingface.co/datasets/diffusers/test-arrays/resolve/main/stable_diffusion_inpaint/boy.png"
... )
>>> init_image = init_image.resize((512, 512))

>>> generator = torch.Generator(device="cpu").manual_seed(1)

>>> mask_image = load_image(
...     "https://huggingface.co/datasets/diffusers/test-arrays/resolve/main/stable_diffusion_inpaint/boy_mask.png"
... )
>>> mask_image = mask_image.resize((512, 512))


>>> def make_canny_condition(image):
...     image = np.array(image)
...     image = cv2.Canny(image, 100, 200)
...     image = image[:, :, None]
...     image = np.concatenate([image, image, image], axis=2)
...     image = Image.fromarray(image)
...     return image


>>> control_image = make_canny_condition(init_image)

>>> controlnet = ControlNetModel.from_pretrained(
...     "lllyasviel/control_v11p_sd15_inpaint", torch_dtype=torch.float16
... )
>>> pipe = StableDiffusionControlNetInpaintPipeline.from_pretrained(
...     "runwayml/stable-diffusion-v1-5", controlnet=controlnet, torch_dtype=torch.float16
... )

>>> pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config)
>>> pipe.enable_model_cpu_offload()

>>> # generate image
>>> image = pipe(
...     "a handsome man with ray-ban sunglasses",
...     num_inference_steps=20,
...     generator=generator,
...     eta=1.0,
...     image=init_image,
...     mask_image=mask_image,
...     control_image=control_image,
... ).images[0]

enable_attention_slicing

< >

( slice_size: Union = 'auto' )

参数

  • slice_size (strint可选,默认为 "auto") — 当 "auto" 时,将输入的注意力头数量减半,以便将注意力计算分为两步进行。如果 "max",每次只运行一个切片,以最大程度地节省内存。如果提供了数字,使用 attention_head_dim // slice_size 的切片数量。在这种情况下,attention_head_dim 必须是 slice_size 的倍数。

启用切片注意力计算。当此选项启用时,注意力模块会将输入张量分成多个切片,分多步计算注意力。对于多个注意力头,计算将依次对每个头进行。这样可以节省一些内存,但会产生轻微的速度下降。

⚠️ 如果你已经使用了 PyTorch 2.0 或 xFormers 的 scaled_dot_product_attention(SDPA),请不要启用注意力切片。这些注意力计算已经非常内存高效,所以你不需要启用此功能。如果使用 SDPA 或 xFormers 启用注意力切片,可能会导致严重的速度降低!

示例

>>> import torch
>>> from diffusers import StableDiffusionPipeline

>>> pipe = StableDiffusionPipeline.from_pretrained(
...     "runwayml/stable-diffusion-v1-5",
...     torch_dtype=torch.float16,
...     use_safetensors=True,
... )

>>> prompt = "a photo of an astronaut riding a horse on mars"
>>> pipe.enable_attention_slicing()
>>> image = pipe(prompt).images[0]

disable_attention_slicing

< >

( )

禁用切片注意力计算。如果之前调用了 enable_attention_slicing,则注意力在一个步骤中计算。

enable_vae_slicing

< >

( )

启用切片 VAE 解码。当此选项启用时,VAE 将将输入张量分割成块来分步骤进行解码。这有助于节省内存并允许更大的批量大小。

disable_vae_slicing

< >

( )

禁用切片 VAE 解码。如果之前启用了 enable_vae_slicing,此方法将回到单个步骤中进行解码计算。

enable_xformers_memory_efficient_attention

< >

( attention_op: 可选 = None )

参数

  • attention_op (Callable, 可选) — 覆盖默认的 None 操作符,将其用作 xFormers 的 memory_efficient_attention() 函数的 op 参数。

启用来自 xFormers 的内存高效注意力。当此选项启用时,您应该观察到更低的 GPU 内存使用量,并在推理期间可能获得加速。训练期间的加速不能保证。

⚠️ 当同时启用内存高效注意力和切片注意力时,内存高效注意力优先。

示例

>>> import torch
>>> from diffusers import DiffusionPipeline
>>> from xformers.ops import MemoryEfficientAttentionFlashAttentionOp

>>> pipe = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-2-1", torch_dtype=torch.float16)
>>> pipe = pipe.to("cuda")
>>> pipe.enable_xformers_memory_efficient_attention(attention_op=MemoryEfficientAttentionFlashAttentionOp)
>>> # Workaround for not accepting attention shape using VAE for Flash Attention
>>> pipe.vae.enable_xformers_memory_efficient_attention(attention_op=None)

disable_xformers_memory_efficient_attention

< >

( )

禁用来自 xFormers 的内存高效注意力。

load_textual_inversion

< >

( pretrained_model_name_or_path: Union token: Union = None tokenizer: Optional = None text_encoder: Optional = None **kwargs )

参数

  • 预训练模型名称或路径 (stros.PathLikeList[str or os.PathLike]DictList[Dict]) — 可以是以下任何一个或它们的列表:

    • 字符串,Hub上托管预训练模型的模型ID(例如 sd-concepts-library/low-poly-hd-logos-icons)。
    • 包含文本逆变换权重的目录的路径(例如 ./my_text_inversion_directory/)。
    • 包含文本逆变换权重的文件的路径(例如 ./my_text_inversions.pt)。
    • torch状态字典
  • token (strList[str],可选) — 重写用于文本逆变换权的token。如果 pretrained_model_name_or_path 是一个列表,那么 token 也必须是一个长度相等的列表。
  • text_encoder (CLIPTextModel,可选) — 冻结的文本编码器(clip-vit-large-patch14)。如果不指定,函数将使用self.tokenizer。
  • tokenizer (CLIPTokenizer, 可以省略) — 用于分词的CLIPTokenizer。如果没有指定,函数将使用self.tokenizer。
  • weight_name (str, 可以省略) — 自定义权重文件的名字。当以下情况时使用此参数:

    • 保存的文本反转文件是🤗 Diffusers格式,但保存时使用了特定的权重名,例如text_inv.bin
    • 保存的文本反转文件是Automatic1111格式。
  • cache_dir (Union[str, os.PathLike], 可以省略) — 当不使用标准缓存时,预训练模型配置缓存的路径。
  • force_download (bool, 可选,默认为 False) — 是否强制重新下载模型权重和配置文件,如存在缓存版本则覆盖。
  • proxies (Dict[str, str], 可选) — 使用协议或端点指定的代理服务器字典,例如,{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}。代理将在每次请求中使用。
  • local_files_only (bool, 可选,默认为 False) — 是否仅加载本地模型权重和配置文件。如果设置为 True,则不会从 Hub 下载模型。
  • token (strbool可选) — 用来作为HTTP载体授权用于远程文件的令牌。如果为 True,则使用由 diffusers-cli login 生成(存储在 ~/.huggingface)的令牌。
  • revision (str可选,默认为 "main") — 要使用的特定模型版本。它可以是一个分支名称、一个标签名称、一个提交id或Git允许的任何标识符。
  • subfolder (str可选,默认为 "") — 在Hub或本地更大模型存储库中模型文件的子文件夹位置。
  • mirror (str, 可选) — 镜像源地址,用于解决在中国下载模型时可能出现的可访问性问题。我们不保证源的及时性和安全性,请参阅镜像站点获取更多信息。

将文本逆变换嵌入加载到《StableDiffusionPipeline》文本编码器中(支持🤗 Diffusers和Automatic1111格式)。

示例

加载🤗 Diffusers格式的文本逆变换嵌入向量

from diffusers import StableDiffusionPipeline
import torch

model_id = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16).to("cuda")

pipe.load_textual_inversion("sd-concepts-library/cat-toy")

prompt = "A <cat-toy> backpack"

image = pipe(prompt, num_inference_steps=50).images[0]
image.save("cat-backpack.png")

加载Automatic1111格式的文本逆变换嵌入向量,请确保先下载该向量(例如从civitAI)然后加载向量

本地

from diffusers import StableDiffusionPipeline
import torch

model_id = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16).to("cuda")

pipe.load_textual_inversion("./charturnerv2.pt", token="charturnerv2")

prompt = "charturnerv2, multiple views of the same character in the same outfit, a character turnaround of a woman wearing a black jacket and red shirt, best quality, intricate details."

image = pipe(prompt, num_inference_steps=50).images[0]
image.save("character.png")

encode_prompt

< >

) 提示 设备 每个提示生成的图片数量 是否启用classifier_free_guideane negative_prompt = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None lora_scale: Optional = None clip_skip: Optional = None )

参数

  • prompt (strList[str], 可选) — 要编码的提示符设备 — (torch.device):torch 设备
  • num_images_per_prompt (int) — 每个提示应生成的图像数量
  • do_classifier_free_guidance (bool) — 是否使用分类器无关的指导
  • negative_prompt (strList[str], 可选) — 不指导图像生成的提示或提示列表。如果未定义,则必须传递 negative_prompt_embeds。在没有使用指导的情况(即如果 guidance_scale 小于 1)将被忽略。
  • prompt_embeds (torch.Tensor, 可选) — 预生成的文本嵌入。可用于轻松调整文本输入,例如提示权重。如果没有提供,将从 prompt 输入参数生成文本嵌入。
  • negative_prompt_embeds (torch.Tensor, 可选) — 预生成的负文本嵌入。可用于轻松调整文本输入,例如提示权重。如果没有提供,将从 negative_prompt 输入参数生成负文本嵌入。
  • lora_scale (float, 可选) — 如果加载了 LoRA 层,将应用于文本解码器的所有 LoRA 层的 LoRA 比例。
  • clip_skip (int, 可选) — 在计算提示嵌入时跳过的 CLIP 层数数。值 1 表示将使用预最终层的输出计算提示嵌入。

将提示编码成文本编码器的隐藏状态。

StableDiffusionPipelineOutput

diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput

< >

( images: 联合 nsfw_content_detected: 可选 )

参数

  • images (List[PIL.Image.Image]np.ndarray) — 长度为 batch_size 的去噪 PIL 图像列表,或形状为 (batch_size, height, width, num_channels) 的 NumPy 数组。
  • nsfw_content_detected (List[bool]) — 指示相应生成的图像是否包含“不适宜工作场所”(NSFW)内容的列表,或者如果无法进行安全检查则为 None

Stable Diffusion 流程的输出类。

FlaxStableDiffusionControlNetPipeline

diffusers.FlaxStableDiffusionControlNetPipeline

< >

( vae: FlaxAutoencoderKL text_encoder: FlaxCLIPTextModel tokenizer: CLIPTokenizer unet: FlaxUNet2DConditionModel controlnet: FlaxControlNetModel scheduler: Union safety_checker: FlaxStableDiffusionSafetyChecker feature_extractor: CLIPImageProcessor dtype: dtype = <class 'jax.numpy.float32'> )

参数

  • vae (FlaxAutoencoderKL) —— 变分自动编码器 (VAE) 模型,用于将图像编码和解码为潜在表示。
  • text_encoder (FlaxCLIPTextModel) — 冻结文本编码器 (clip-vit-large-patch14)。
  • tokenizer (CLIPTokenizer) — 用于文本分词的 CLIPTokenizer。
  • unet (FlaxUNet2DConditionModel) — 用于去噪编码图隐矢量的 FlaxUNet2DConditionModel。
  • controlnet (FlaxControlNetModel — 在去噪过程中向 unet 提供额外条件。
  • 调度器SchedulerMixin) — 与 unet 结合使用以去噪编码图像潜伏量的调度器。可以是以下之一: FlaxDDIMSchedulerFlaxLMSDiscreteSchedulerFlaxPNDMSchedulerFlaxDPMSolverMultistepScheduler
  • 安全检查器FlaxStableDiffusionSafetyChecker) — 评估生成图像是否可能被视为攻击性或有害的分类模块。请参阅 模型卡片 了解有关模型潜在危害的更多详细信息。
  • 特征提取器CLIPImageProcessor) — 用于从生成图像中提取特征的 CLIPImageProcessor;用作 safety_checker 的输入。

基于Flax的文本到图像生成流水线,采用Stable Diffusion和控制网引导。

此模型继承自 FlaxDiffusionPipeline。请参阅超类文档了解所有流水线实现的通用方法(下载、保存、在特定设备上运行等)。

__call__

< >

( prompt_ids: 数组 image: 数组 params: 合并 prng_seed: 数组 num_inference_steps: int = 50 guidance_scale: 合并 = 7.5 latents: 数组 = None neg_prompt_ids: 数组 = None controlnet_conditioning_scale: 合并 = 1.0 return_dict: bool = True jit: bool = False ) FlaxStableDiffusionPipelineOutput元组

参数

  • prompt_ids (jnp.ndarray) — 指导图像生成的提示或提示列表。
  • image (jnp.ndarray) — 表示提供指导以供 unet 生成条件的 ControlNet 输入条件。
  • params (DictFrozenDict) — 包含模型参数/权重的字典。
  • prng_seed (jax.Array) — 包含随机数生成器密钥的数组。
  • num_inference_steps (int, 可选, 默认为 50) — 降噪步骤的数量。更多的降噪步骤通常会导致图像质量更高,但推理速度会变慢。
  • guidance_scale (浮点数,可选,默认为7.5)— 更高的指导尺度值会鼓励模型生成与文本 prompt 紧密相关的图像,但会牺牲较低的图像质量。当 guidance_scale > 1 时,指导尺度启用。
  • latentsjnp.ndarray,可选)— 从高斯分布中采样的预生成带噪声的latents,用于生成图像输入。可以用于用不同的提示调整相同的生成。如果不提供,将使用提供的随机 generator 生成latents数组。
  • controlnet_conditioning_scale (浮点数或 jnp.ndarray,可选,默认为 1.0)— 在ControlNet的输出被添加到原始 unet 的残差之前,将ControlNet的乘以 controlnet_conditioning_scale
  • return_dict (bool, optional, defaults to True) — 是否返回 FlaxStableDiffusionPipelineOutput 而不是普通的元组。
  • jit (bool, defaults to False) — 是否运行生成和安全性打分函数的 pmap 版本。

    此参数存在是因为 __call__ 尚未完全支持 pmap。它将在未来的版本中移除。

返回值

FlaxStableDiffusionPipelineOutputtuple

如果 return_dictTrue,则返回 FlaxStableDiffusionPipelineOutput,否则返回一个包含生成的图像列表的第一个元素和指示相应生成的图像是否包含“不适合工作” (nsfw) 内容的布尔值列表的元组。

调用生成管道的调用函数。

示例

>>> import jax
>>> import numpy as np
>>> import jax.numpy as jnp
>>> from flax.jax_utils import replicate
>>> from flax.training.common_utils import shard
>>> from diffusers.utils import load_image, make_image_grid
>>> from PIL import Image
>>> from diffusers import FlaxStableDiffusionControlNetPipeline, FlaxControlNetModel


>>> def create_key(seed=0):
...     return jax.random.PRNGKey(seed)


>>> rng = create_key(0)

>>> # get canny image
>>> canny_image = load_image(
...     "https://huggingface.co/datasets/YiYiXu/test-doc-assets/resolve/main/blog_post_cell_10_output_0.jpeg"
... )

>>> prompts = "best quality, extremely detailed"
>>> negative_prompts = "monochrome, lowres, bad anatomy, worst quality, low quality"

>>> # load control net and stable diffusion v1-5
>>> controlnet, controlnet_params = FlaxControlNetModel.from_pretrained(
...     "lllyasviel/sd-controlnet-canny", from_pt=True, dtype=jnp.float32
... )
>>> pipe, params = FlaxStableDiffusionControlNetPipeline.from_pretrained(
...     "runwayml/stable-diffusion-v1-5", controlnet=controlnet, revision="flax", dtype=jnp.float32
... )
>>> params["controlnet"] = controlnet_params

>>> num_samples = jax.device_count()
>>> rng = jax.random.split(rng, jax.device_count())

>>> prompt_ids = pipe.prepare_text_inputs([prompts] * num_samples)
>>> negative_prompt_ids = pipe.prepare_text_inputs([negative_prompts] * num_samples)
>>> processed_image = pipe.prepare_image_inputs([canny_image] * num_samples)

>>> p_params = replicate(params)
>>> prompt_ids = shard(prompt_ids)
>>> negative_prompt_ids = shard(negative_prompt_ids)
>>> processed_image = shard(processed_image)

>>> output = pipe(
...     prompt_ids=prompt_ids,
...     image=processed_image,
...     params=p_params,
...     prng_seed=rng,
...     num_inference_steps=50,
...     neg_prompt_ids=negative_prompt_ids,
...     jit=True,
... ).images

>>> output_images = pipe.numpy_to_pil(np.asarray(output.reshape((num_samples,) + output.shape[-3:])))
>>> output_images = make_image_grid(output_images, num_samples // 4, 4)
>>> output_images.save("generated_image.png")

FlaxStableDiffusionControlNetPipelineOutput

diffusers.pipelines.stable_diffusion.FlaxStableDiffusionPipelineOutput

< >

( images: ndarray nsfw_content_detected: 列表 )

参数

  • images (np.ndarray) — 形状为 (batch_size, height, width, num_channels) 的去噪图像数组。
  • nsfw_content_detected (bool 列表) — 表示对应生成的图像是否包含“不适宜工作环境” (nsfw) 内容的列表;如果无法执行安全性检查则返回 None

基于Flax的Stable Diffusion管道的输出类。

替换

< >

( **更新** )

“返回一个新的对象,将指定的字段与新的值替换。

< > GitHub上的更新