ControlNet
ControlNet是在《在文本到图像扩散模型中添加条件控制》中引入的,作者为张鲁明、饶安义、阿格拉瓦尔。
有了ControlNet模型,您可以提供额外的控制图像来条件化和控制稳定的 DIFFUSION生成。例如,如果您提供深度图,ControlNet模型将生成一个保留深度图空间信息的图像。这是一种更灵活、更精确的控制图像生成过程的方法。
论文的摘要如下
我们提出了一种名为ControlNet的神经网络架构,用于将空间条件控制添加到大型、预训练的文本到图像扩散模型。ControlNet锁定了成熟的大型扩散模型,并重用了它们的深度和健壮的编码层,这些编码层在数十亿张图片上进行了预训练,作为一个强大的骨干来学习多样化的条件控制。神经网络架构通过“零卷积”(零初始化的卷积层)连接,这些卷积层逐步从零增加参数,并确保不会有害的噪声影响微调。我们使用Stable Diffusion测试了各种条件控制,例如边缘、深度、分割、人体姿态等,使用单或多个条件,是否有提示。我们证明,ControlNet的训练对小型数据集(<50k)和大型数据集(>1m)都是鲁棒的。广泛的结果表明,ControlNet可能促进图像扩散模型更广泛的应用。
此模型由takuma104贡献。💖
原始代码库可以在lllyasviel/ControlNet找到,您可以在lllyasviel的 Hub个人资料中找到官方的ControlNet检查点。
StableDiffusionControlNetPipeline
类 diffusers.StableDiffusionControlNetPipeline
< source >( 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
结合以去噪编码图像潜伏量。可以是 DDIMScheduler、LMSDiscreteScheduler 或 PNDMScheduler 之一。 - 安全检查器 (
StableDiffusionSafetyChecker
) — 用于估计生成的图像是否可能被认为是冒犯性或有害的分类模块。请参阅有关模型潜在危害的更多详细信息 模型卡片。 - feature_extractor (CLIPImageProcessor) — 用于从生成的图像中提取特征的
CLIPImageProcessor
,用作safety_checker
的输入。
使用 ControlNet 指导的 Stable Diffusion 进行文本到图像生成的管道。
此模型继承自 DiffusionPipeline。请检查超类文档中实现的所有 pipeline 的通用方法(下载、保存、在某些设备上运行等)。
该管道还继承了以下加载方法
- load_textual_inversion() 用于加载文本反转嵌入
- load_lora_weights() 用于加载 LoRA 权重
- save_lora_weights() 用于保存 LoRA 权重
- from_single_file() 用于加载
.ckpt
文件 - load_ip_adapter() 用于加载 IP 适配器
__call__
< source >( 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 (
str
或List[str]
,可选) — 引导图像生成的提示或提示列表。如果没有定义,则需要传递prompt_embeds
。 - image (
torch.Tensor
,PIL.Image.Image
,np.ndarray
,List[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传递图像列表的列表以进行批量处理。 - height (
int
,可选,默认为self.unet.config.sample_size * self.vae_scale_factor
)— 生成图片的像素高度。 - width (
int
,可选,默认为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
orList[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.Generator
或List[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.Image
或np.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 (
float
或List[float]
, 可选, 默认为1.0) — 在将ControlNet的输出添加到原始unet
的残差之前,将它们乘以controlnet_conditioning_scale
。如果在init
中指定了多个ControlNet,您可以将相应的缩放级别作为列表设置。 - guess_mode (
bool
, 可选, 默认为False
) — ControlNet 编码器即使在您删除所有提示的情况下也会尝试识别输入图像的内容。建议使用 3.0 到 5.0 之间的guidance_scale
值。 - control_guidance_start (
float
或List[float]
, 可选, 默认为 0.0) — ControlNet 开始应用的步骤总数的百分比。 - control_guidance_end (
float
或List[float]
, 可选, 默认为 1.0) — ControlNet 停止应用的步骤总数的百分比。 - clip_skip (
int
, 可选) — 在计算提示嵌入时跳过的CLIP层数。数值1表示预最终层的输出将用于计算提示嵌入。 - callback_on_step_end (
Callable
,PipelineCallback
,MultiPipelineCallbacks
, 可选) — 在推理过程中每个去噪步骤结束时调用的函数或PipelineCallback
或MultiPipelineCallbacks
的子类。带有以下参数: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
属性中列出的变量。
返回值
如果 return_dict
为 True
,则返回 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' )
启用切片注意力计算。当此选项启用时,注意力模块会将输入张量分成多个切片,分多步计算注意力。对于多个注意力头,计算将依次对每个头进行。这样可以节省一些内存,但会产生轻微的速度下降。
⚠️ 如果你已经使用了 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]
禁用切片注意力计算。如果之前调用了 enable_attention_slicing
,则注意力在一个步骤中计算。
启用切片 VAE 解码。当此选项启用时,VAE 将将输入张量分割成块来分步骤进行解码。这有助于节省内存并允许更大的批量大小。
禁用切片 VAE 解码。如果之前启用了 enable_vae_slicing
,此方法将回到单个步骤中进行解码计算。
enable_xformers_memory_efficient_attention
< source >( 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)
禁用来自 xFormers 的内存高效注意力。
load_textual_inversion
< source >( pretrained_model_name_or_path: Union token: Union = None tokenizer: Optional = None text_encoder: Optional = None **kwargs )
参数
- pretrained_model_name_or_path (
str
或os.PathLike
或List[str or os.PathLike]
或Dict
或List[Dict]
) — 可以是以下之一或它们的列表: - token (
str
或List[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 格式。
- 已保存的文本反转文件为 🤗 Diffusers 格式,但以特定的权重名称保存,例如
- 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 (
字符串
或字符串列表
,可选) — 需要编码的prompt设备 —torch.device
- num_images_per_prompt (
int
) — 每个提示应生成的图片数量 - do_classifier_free_guidance (
bool
) — 是否使用分类器自由指导 - negative_prompt (
str
或List[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表示将使用预最终层的输出用于计算提示嵌入。
将提示编码成文本编码器的隐藏状态。
get_guidance_scale_embedding
< 源代码 >( w: Tensor embedding_dim: int = 512 dtype: dtype = torch.float32 ) → torch.Tensor
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 (ControlNetModel 或
List[ControlNetModel]
) — 在降噪过程中为unet
提供额外的条件。如果将多个 ControlNet 作为列表设置,则将每个 ControlNet 的输出相加以创建一个单独的补充条件。 - scheduler (SchedulerMixin) — 一个用于与
unet
结合使用的调度程序,用于降噪编码后的图像潜在变量。可以是 DDIMScheduler、LMSDiscreteScheduler 或 PNDMScheduler 之一。 - 安全检查器 (
StableDiffusionSafetyChecker
) — 估算生成图像是否可能被视为冒犯性或有害的分类模块。请参考模型卡片获取有关模型潜在危害的更多详细信息。 - 特征提取器 (CLIPImageProcessor) — 用于从生成图像中提取特征的
CLIPImageProcessor
;用作安全检查器
的输入。
使用 ControlNet 指导的 Stable Diffusion 生成图像的管道。
此模型继承自 DiffusionPipeline。请检查超类文档中实现的所有 pipeline 的通用方法(下载、保存、在某些设备上运行等)。
该管道还继承了以下加载方法
- load_textual_inversion() 用于加载文本反转嵌入
- load_lora_weights() 用于加载 LoRA 权重
- save_lora_weights() 用于保存 LoRA 权重
- from_single_file() 用于加载
.ckpt
文件 - load_ip_adapter() 用于加载 IP 适配器
__call__
< source >( 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 (
str
或List[str]
,可选)- 用于指导图像生成的提示或提示列表。如果未定义,需要传递prompt_embeds
。 - image (
torch.Tensor
,PIL.Image.Image
,np.ndarray
,List[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.Tensor
,PIL.Image.Image
,np.ndarray
,List[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 (
str
或List[str]
, 可选) — 指导不在图像生成中包含的提示或提示列表。如果没有定义,则需要传递negative_prompt_embeds
。未使用指导时(guidance_scale < 1
)将被忽略。 - num_images_per_prompt (
int
, 可选, 默认为 1) — 每个提示产生的图片数量。 - eta (
float
, 可选, 默认为 0.0) — 对应于DDIM论文中的参数eta(η)。仅适用于DDIMScheduler,在其他调度器中被忽略。 - generator (
torch.Generator
或List[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_guidance
为True
,则应包含负图像嵌入。如果没有提供,则从输入参数ip_adapter_image
中计算嵌入。 - output_type (
str
,可选,默认为"pil"
) — 生成的图像输出格式。可选择PIL.Image
或np.array
。 - return_dict (
bool
,可选,默认为True
) — 是否返回StableDiffusionPipelineOutput对象而不是一个原始元组。 - cross_attention_kwargs (
dict
, 可选) — 一个kwargs字典,如果指定,则传递给定义为self.processor
的AttentionProcessor
。 - controlnet_conditioning_scale (
float
或List[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
, 可选) — 一个在推理过程中每个去噪步骤结束时被调用的函数或PipelineCallback
或MultiPipelineCallbacks
的子类。具有以下参数: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
属性的变量列表的变量。
返回值
如果 return_dict
为 True
,则返回 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' )
启用切片注意力计算。当此选项启用时,注意力模块会将输入张量分成多个切片,分多步计算注意力。对于多个注意力头,计算将依次对每个头进行。这样可以节省一些内存,但会产生轻微的速度下降。
⚠️ 如果你已经使用了 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]
禁用切片注意力计算。如果之前调用了 enable_attention_slicing
,则注意力在一个步骤中计算。
启用切片 VAE 解码。当此选项启用时,VAE 将将输入张量分割成块来分步骤进行解码。这有助于节省内存并允许更大的批量大小。
禁用切片 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 )
参数
- token (
str
或List[str]
,可选) — 覆盖用于文本反演权重的令牌。如果 `pretrained_model_name_or_path` 是一个列表,那么 `token` 也必须是一个长度相等的列表。 - text_encoder (CLIPTextModel,可选) — 冻结的文本编码器(clip-vit-large-patch14)。如果未指定,函数将使用自带的词元器。
- tokenizer (CLIPTokenizer,可选) — 用于标记文本的
CLIPTokenizer
。如果未指定,函数将使用自带的词元器。 - weight_name (
str
, 可选) — 自定义权重文件的名称。当以下情况发生时使用:- 保存的文本反转文件在 🤗 Diffusers 格式,但保存了特定的权重名称,例如
text_inv.bin
。 - 保存的文本反转文件在 Automatic1111 格式。
- 保存的文本反转文件在 🤗 Diffusers 格式,但保存了特定的权重名称,例如
- 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
< source >) 提示 设备 每个提示生成的图片数量 是否启用classifier_free_guideane negative_prompt = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None lora_scale: Optional = None clip_skip: Optional = None )
参数
- prompt (
str
或List[str]
, 可选) — 待编码的提示 - num_images_per_prompt (
int
) — 每个提示应生成的图像数量 - do_classifier_free_guidance (
bool
) — 是否使用分类器自由指导 - negative_prompt (
str
或List[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表示将使用预最终层的输出进行计算提示嵌入。
将提示编码成文本编码器的隐藏状态。
StableDiffusionControlNetInpaintPipeline
类 diffusers.StableDiffusionControlNetInpaintPipeline
source( 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
结合使用以去噪编码图像潜伏量的调度器。可以是 DDIMScheduler,LMSDiscreteScheduler 或 PNDMScheduler 之一。 - 安全检查器 (
StableDiffusionSafetyChecker
) — 估计生成的图像是否可能被认为是有攻击性或有害的分类模块。有关模型潜在危害的更多详细信息,请参阅模型卡片。 - 特征提取器 (CLIPImageProcessor) — 用于从生成的图像中提取特征的
CLIPImageProcessor
;用作safety_checker
的输入。
使用 ControlNet 指导的稳定扩散图像修复管道。
此模型继承自 DiffusionPipeline。请检查超类文档中实现的所有 pipeline 的通用方法(下载、保存、在某些设备上运行等)。
该管道还继承了以下加载方法
- load_textual_inversion() 用于加载文本反转嵌入
- load_lora_weights() 用于加载 LoRA 权重
- save_lora_weights() 用于保存 LoRA 权重
- from_single_file() 用于加载
.ckpt
文件 - load_ip_adapter() 用于加载 IP 适配器
此管道可以使用专门针对修复进行微调的检查点(runwayml/stable-diffusion-inpainting)以及默认文本到图像的稳定扩散检查点(runwayml/stable-diffusion-v1-5)一起使用。默认文本到图像的稳定扩散检查点可能更适合在那些上微调的 ControlNet,例如 lllyasviel/control_v11p_sd15_inpaint。
__call__
< source >( 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 (
str
或List[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_image (
torch.Tensor
,PIL.Image.Image
,np.ndarray
,List[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_image (
torch.Tensor
,PIL.Image.Image
,List[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
orList[str]
, 可选) — 导引图像生成时不包含内容的提示或提示列表。如果没有定义,需要传递negative_prompt_embeds
。在未使用指导的情况下(guidance_scale < 1
)将被忽略。 - num_images_per_prompt (
int
, 可选, 默认为1) — 每个提示生成图像的数量。 - eta (
float
, 可选, 默认为0.0) — 与DDIM论文中的参数eta (η) 相对应。仅适用于DDIMScheduler,在其他调度器中将被忽略。 - generator (
torch.Generator
或List[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.Image
或np.array
。 - return_dict (
bool
, 可选, 默认为True
) — 是否返回StableDiffusionPipelineOutput而不是一个普通的元组。 - cross_attention_kwargs (
dict
, 可选) — 一个kwargs字典,如果指定,将被传递到self.processor
中定义的AttentionProcessor
。 - controlnet_conditioning_scale (
float
或List[float]
, 可选, 默认为0.5) — 在将ControlNet的输出添加到原始unet
中的残差之前,将输出乘以controlnet_conditioning_scale
。如果在init
中指定了多个ControlNet,可以将相应的比例作为列表设置。 - guess_mode (
bool
, 可选, 默认为False
) — 当移除所有提示时,ControlNet 编码器尝试识别输入图像的内容。建议使用位于 3.0 到 5.0 之间的guidance_scale
值。 - control_guidance_start (
float
或List[float]
, 可选, 默认为 0.0) — ControlNet 开始应用的步骤总数的百分比。 - control_guidance_end (
float
或List[float]
, 可选, 默认为 1.0) — ControlNet 停止应用的步骤总数的百分比。 - clip_skip (
int
, 可选) — 在计算提示嵌入时从 CLIP 跳过的层数。值为 1 表示将使用预最终层的输出计算提示嵌入。 - callback_on_step_end (
Callable
,PipelineCallback
,MultiPipelineCallbacks
, 可选) — 在推理过程中,每当去噪步骤结束时被调用的函数或PipelineCallback
或MultiPipelineCallbacks
的子类。带有以下参数: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
属性中列出的变量。
返回值
如果 return_dict
为 True
,则返回 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
< source >( slice_size: Union = 'auto' )
启用切片注意力计算。当此选项启用时,注意力模块会将输入张量分成多个切片,分多步计算注意力。对于多个注意力头,计算将依次对每个头进行。这样可以节省一些内存,但会产生轻微的速度下降。
⚠️ 如果你已经使用了 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]
禁用切片注意力计算。如果之前调用了 enable_attention_slicing
,则注意力在一个步骤中计算。
启用切片 VAE 解码。当此选项启用时,VAE 将将输入张量分割成块来分步骤进行解码。这有助于节省内存并允许更大的批量大小。
禁用切片 VAE 解码。如果之前启用了 enable_vae_slicing
,此方法将回到单个步骤中进行解码计算。
enable_xformers_memory_efficient_attention
< source >( 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)
load_textual_inversion
< 源代码 >( pretrained_model_name_or_path: Union token: Union = None tokenizer: Optional = None text_encoder: Optional = None **kwargs )
参数
- 预训练模型名称或路径 (
str
或os.PathLike
或List[str or os.PathLike]
或Dict
或List[Dict]
) — 可以是以下任何一个或它们的列表:- 字符串,Hub上托管预训练模型的模型ID(例如
sd-concepts-library/low-poly-hd-logos-icons
)。 - 包含文本逆变换权重的目录的路径(例如
./my_text_inversion_directory/
)。 - 包含文本逆变换权重的文件的路径(例如
./my_text_inversions.pt
)。 - torch状态字典。
- 字符串,Hub上托管预训练模型的模型ID(例如
- token (
str
或List[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格式。
- 保存的文本反转文件是🤗 Diffusers格式,但保存时使用了特定的权重名,例如
- 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
或 bool,可选) — 用来作为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
< source >) 提示 设备 每个提示生成的图片数量 是否启用classifier_free_guideane negative_prompt = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None lora_scale: Optional = None clip_skip: Optional = None )
参数
- prompt (
str
或List[str]
, 可选) — 要编码的提示符设备 — (torch.device
):torch 设备 - num_images_per_prompt (
int
) — 每个提示应生成的图像数量 - do_classifier_free_guidance (
bool
) — 是否使用分类器无关的指导 - negative_prompt (
str
或List[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: 可选 )
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
结合使用以去噪编码图像潜伏量的调度器。可以是以下之一:FlaxDDIMScheduler
、FlaxLMSDiscreteScheduler
、FlaxPNDMScheduler
或FlaxDPMSolverMultistepScheduler
。 - 安全检查器 (
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 (
Dict
或FrozenDict
) — 包含模型参数/权重的字典。 - prng_seed (
jax.Array
) — 包含随机数生成器密钥的数组。 - num_inference_steps (
int
, 可选, 默认为 50) — 降噪步骤的数量。更多的降噪步骤通常会导致图像质量更高,但推理速度会变慢。 - guidance_scale (浮点数,可选,默认为7.5)— 更高的指导尺度值会鼓励模型生成与文本
prompt
紧密相关的图像,但会牺牲较低的图像质量。当guidance_scale > 1
时,指导尺度启用。 - latents (
jnp.ndarray
,可选)— 从高斯分布中采样的预生成带噪声的latents,用于生成图像输入。可以用于用不同的提示调整相同的生成。如果不提供,将使用提供的随机generator
生成latents数组。 - controlnet_conditioning_scale (浮点数或
jnp.ndarray
,可选,默认为 1.0)— 在ControlNet的输出被添加到原始unet
的残差之前,将ControlNet的乘以controlnet_conditioning_scale
。 - return_dict (
bool
, optional, defaults toTrue
) — 是否返回 FlaxStableDiffusionPipelineOutput 而不是普通的元组。 - jit (
bool
, defaults toFalse
) — 是否运行生成和安全性打分函数的pmap
版本。
此参数存在是因为
__call__
尚未完全支持pmap
。它将在未来的版本中移除。
返回值
如果 return_dict
为 True
,则返回 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: 列表 )
基于Flax的Stable Diffusion管道的输出类。
“返回一个新的对象,将指定的字段与新的值替换。