AWS Trainium & Inferentia 文档

ControlNet

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

ControlNet

ControlNet 通过附加输入图像来调节稳定扩散模型。在 Optimum Neuron 中,我们支持将一个或多个 ControlNet 与稳定扩散检查点一起编译。然后,您可以使用编译后的工件生成风格化图像。

导出到 Neuron

我们可以通过 Optimum CLI 或通过传递 `controlnet_ids` 的 `NeuronStableDiffusionControlNetPipeline` 类以编程方式编译一个或多个 ControlNet。

选项 1:CLI

optimum-cli export neuron -m stable-diffusion-v1-5/stable-diffusion-v1-5 --batch_size 1 --height 512 --width 512 --controlnet_ids lllyasviel/sd-controlnet-canny --num_images_per_prompt 1 sd_neuron_controlnet/

选项 2:Python API

from optimum.neuron import NeuronStableDiffusionControlNetPipeline

model_id = "stable-diffusion-v1-5/stable-diffusion-v1-5"
controlnet_id = "lllyasviel/sd-controlnet-canny"

# [Neuron] pipeline
input_shapes = {"batch_size": 1, "height": 512, "width": 512, "num_images_per_prompt": 1}
compiler_args = {"auto_cast": "matmul", "auto_cast_type": "bf16"}
pipe = NeuronStableDiffusionControlNetPipeline.from_pretrained(
    model_id,
    controlnet_ids=controlnet_id,
    export=True,
    **input_shapes,
    **compiler_args,
)
pipe.save_pretrained("sd_neuron_controlnet")

文本到图像

对于文本到图像,我们可以指定一个额外的条件输入。

这是一个带边缘图像的示例,即图像在黑色背景上的白色轮廓。ControlNet 将使用边缘图像作为控制,引导模型生成具有相同轮廓的图像。

import cv2
import numpy as np
from diffusers import UniPCMultistepScheduler
from diffusers.utils import load_image, make_image_grid
from PIL import Image

from optimum.neuron import NeuronStableDiffusionControlNetPipeline


# prepare canny image
original_image = load_image(
    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/input_image_vermeer.png"
)

image = np.array(original_image)

low_threshold = 100
high_threshold = 200

image = cv2.Canny(image, low_threshold, high_threshold)
image = image[:, :, None]
image = np.concatenate([image, image, image], axis=2)
canny_image = Image.fromarray(image)

# load pre-compiled neuron model
pipe = NeuronStableDiffusionControlNetPipeline.from_pretrained("sd_neuron_controlnet")
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)

# inference
output = pipe("the mona lisa", image=canny_image).images[0]
compare = make_image_grid([original_image, canny_image, output], rows=1, cols=3)
compare.save("compare.png")
stable diffusion 1.5 generated image with controlnet.

多 ControlNet

使用 Optimum Neuron,您还可以从不同的图像输入中组合多个 ControlNet 条件

  • 为 SD1.5 编译多个 ControlNet
optimum-cli export neuron --inline-weights-neff --model jyoung105/stable-diffusion-v1-5 --task stable-diffusion --auto_cast matmul --auto_cast_type bf16 --batch_size 1 --num_images_per_prompt 1 --controlnet_ids lllyasviel/control_v11p_sd15_openpose lllyasviel/control_v11f1p_sd15_depth --height 512 --width 512 sd15-512x512-bf16-openpose-depth
  • 使用 OpenPose 和深度条件运行 SD1.5
import numpy as np
import torch
from PIL import Image

from controlnet_aux import OpenposeDetector
from transformers import pipeline
from diffusers import UniPCMultistepScheduler
from diffusers.utils import load_image
from optimum.neuron import NeuronStableDiffusionControlNetPipeline


# OpenPose+Depth ControlNet
model_id = "sd15-512x512-bf16-openpose-depth"

# Load ControlNet images

# 1. openpose
image = load_image("https://huggingface.co/lllyasviel/control_v11p_sd15_openpose/resolve/main/images/input.png")
processor = OpenposeDetector.from_pretrained('lllyasviel/ControlNet')
openpose_image = processor(image)

# 2. depth
image = load_image("https://huggingface.co/lllyasviel/control_v11p_sd15_depth/resolve/main/images/input.png")
depth_estimator = pipeline('depth-estimation')
image = depth_estimator(image)['depth']
image = np.array(image)
image = image[:, :, None]
image = np.concatenate([image, image, image], axis=2)
depth_image = Image.fromarray(image)

images = [openpose_image.resize((512, 512)), depth_image.resize((512, 512))]

# 3. inference
pipe = NeuronStableDiffusionControlNetPipeline.from_pretrained(model_id)
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
prompt = "a giant in a fantasy landscape, best quality"
negative_prompt = "monochrome, lowres, bad anatomy, worst quality, low quality"

image = pipe(prompt=prompt, image=images).images[0]
image.save('out.png')
stable diffusion 1.5 generated image with OpenPose and Depth controlnet.

ControlNet 与 Stable Diffusion XL

导出到 Neuron

optimum-cli export neuron -m stabilityai/stable-diffusion-xl-base-1.0 --task stable-diffusion-xl --batch_size 1 --height 1024 --width 1024 --controlnet_ids diffusers/controlnet-canny-sdxl-1.0-small --num_images_per_prompt 1 sdxl_neuron_controlnet/

文本到图像

import cv2
import numpy as np
from diffusers.utils import load_image
from PIL import Image
from optimum.neuron import NeuronStableDiffusionXLControlNetPipeline

# Inputs
prompt = "aerial view, a futuristic research complex in a bright foggy jungle, hard lighting"
negative_prompt = "low quality, bad quality, sketches"

image = load_image(
    "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/sd_controlnet/hf-logo.png"
)
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)

controlnet_conditioning_scale = 0.5  # recommended for good generalization

pipe = NeuronStableDiffusionXLControlNetPipeline.from_pretrained("sdxl_neuron_controlnet")

images = pipe(
    prompt,
    negative_prompt=negative_prompt,
    image=image,
    controlnet_conditioning_scale=controlnet_conditioning_scale,
).images
images[0].save("hug_lab.png")
stable diffusion xl generated image with controlnet.

NeuronStableDiffusionControlNetPipeline

optimum.neuron.NeuronStableDiffusionControlNetPipeline

< >

( config: dict[str, typing.Any] configs: dict[str, 'PretrainedConfig'] neuron_configs: dict[str, 'NeuronDefaultConfig'] data_parallel_mode: typing.Literal['none', 'unet', 'transformer', 'all'] scheduler: diffusers.schedulers.scheduling_utils.SchedulerMixin | None vae_decoder: torch.jit._script.ScriptModule | NeuronModelVaeDecoder text_encoder: torch.jit._script.ScriptModule | NeuronModelTextEncoder | None = None text_encoder_2: torch.jit._script.ScriptModule | NeuronModelTextEncoder | None = None unet: torch.jit._script.ScriptModule | NeuronModelUnet | None = None transformer: torch.jit._script.ScriptModule | NeuronModelTransformer | None = None vae_encoder: torch.jit._script.ScriptModule | NeuronModelVaeEncoder | None = None image_encoder: torch.jit._script.ScriptModule | None = None safety_checker: torch.jit._script.ScriptModule | None = None tokenizer: transformers.models.clip.tokenization_clip.CLIPTokenizer | transformers.models.t5.tokenization_t5.T5Tokenizer | None = None tokenizer_2: transformers.models.clip.tokenization_clip.CLIPTokenizer | None = None feature_extractor: transformers.models.clip.feature_extraction_clip.CLIPFeatureExtractor | None = None controlnet: torch.jit._script.ScriptModule | list[torch.jit._script.ScriptModule]| NeuronControlNetModel | NeuronMultiControlNetModel | None = None requires_aesthetics_score: bool = False force_zeros_for_empty_prompt: bool = True add_watermarker: bool | None = None model_save_dir: str | pathlib.Path | tempfile.TemporaryDirectory | None = None model_and_config_save_paths: dict[str, tuple[str, pathlib.Path]] | None = None )

__call__

< >

( prompt: str | list[str] | None = None image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, typing.List[PIL.Image.Image], typing.List[numpy.ndarray], typing.List[torch.Tensor]] = None num_inference_steps: int = 50 timesteps: list[int] | None = None sigmas: list[float] | None = None guidance_scale: float = 7.5 negative_prompt: str | list[str] | None = None num_images_per_prompt: int | None = 1 eta: float = 0.0 generator: torch._C.Generator | list[torch._C.Generator] | None = None latents: torch.Tensor | None = None prompt_embeds: torch.Tensor | None = None negative_prompt_embeds: torch.Tensor | None = None ip_adapter_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, typing.List[PIL.Image.Image], typing.List[numpy.ndarray], typing.List[torch.Tensor], NoneType] = None ip_adapter_image_embeds: list[torch.Tensor] | None = None output_type: str = 'pil' return_dict: bool = True cross_attention_kwargs: dict[str, typing.Any] | None = None controlnet_conditioning_scale: float | list[float] = 1.0 guess_mode: bool = False control_guidance_start: float | list[float] = 0.0 control_guidance_end: float | list[float] = 1.0 clip_skip: int | None = None callback_on_step_end: typing.Union[typing.Callable[[int, int, dict], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = None callback_on_step_end_tensor_inputs: list[str] = ['latents'] **kwargs ) diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutputtuple

参数

  • prompt (str | list[str] | None, 默认为 None) — 用于引导图像生成的提示或提示列表。如果未定义,需要传递 prompt_embeds
  • image ("PipelineImageInput" | None, 默认为 None) — ControlNet 输入条件,用于为 unet 的生成提供引导。如果类型指定为 torch.Tensor,则直接传递给 ControlNet。PIL.Image.Image 也可以作为图像接受。输出图像的尺寸默认为 image 的尺寸。如果传递了 height 和/或 width,则 image 会相应地调整大小。如果在 init 中指定了多个 ControlNet,则图像必须作为列表传递,以便列表的每个元素都可以正确批处理以输入到单个 ControlNet。当 prompt 是一个列表时,如果为单个 ControlNet 传递了图像列表,则每个图像将与 prompt 列表中的每个提示配对。这也适用于多个 ControlNet,其中可以传递图像列表的列表,以批处理每个提示和每个 ControlNet。
  • num_inference_steps (int, 默认为 50) — 去噪步数。更多去噪步数通常会带来更高质量的图像,但推理速度较慢。
  • timesteps (list[int] | None, 默认为 None) — 自定义时间步长,用于支持 set_timesteps 方法中 timesteps 参数的调度器进行去噪过程。如果未定义,将使用传递 num_inference_steps 时的默认行为。必须按降序排列。
  • sigmas (list[int] | None, 默认为 None) — 自定义 sigma,用于支持 set_timesteps 方法中 sigmas 参数的调度器进行去噪过程。如果未定义,将使用传递 num_inference_steps 时的默认行为。
  • guidance_scale (float, 默认为 7.5) — 较高的引导比例值会促使模型生成与文本 prompt 紧密相关的图像,但图像质量较低。当 guidance_scale > 1 时启用引导比例。
  • negative_prompt (str | list[str] | None, 默认为 None) — 用于引导图像生成中不包含内容的提示或提示列表。如果未定义,则需要传递 negative_prompt_embeds。当不使用引导时 (guidance_scale < 1) 忽略。
  • num_images_per_prompt (int, 默认为 1) — 每个提示生成的图像数量。如果与编译时使用的批处理大小不同,则会被 neuron 的静态批处理大小覆盖(动态批处理除外)。
  • eta (float, 默认为 0.0) — 对应于 DDIM 论文中的参数 eta (η)。仅适用于 diffusers.schedulers.DDIMScheduler,在其他调度器中忽略。
  • generator (torch.Generator | list[torch.Generator] | None, 默认为 None) — 一个 torch.Generator,用于使生成确定化。
  • latents (torch.Tensor | None, 默认为 None) — 从高斯分布中采样的预生成噪声潜在变量,用作图像生成的输入。可用于使用不同的提示调整相同的生成。如果未提供,则使用提供的随机 generator 采样生成潜在张量。
  • prompt_embeds (torch.Tensor | None, 默认为 None) — 预生成的文本嵌入。可用于轻松调整文本输入(提示权重)。如果未提供,则从 prompt 输入参数生成文本嵌入。
  • negative_prompt_embeds (torch.Tensor | None, 默认为 None) — 预生成的负文本嵌入。可用于轻松调整文本输入(提示权重)。如果未提供,则从 negative_prompt 输入参数生成 negative_prompt_embeds
  • ip_adapter_image — (PipelineImageInput | None, 默认为 None): 可选的图像输入,用于与 IP 适配器配合使用。
  • ip_adapter_image_embeds (list[torch.Tensor] | None, 默认为 None) — 用于 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) — 是否返回 diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput 而不是普通元组。
  • cross_attention_kwargs (dict[str, Any] | None, 默认为 None) — 如果指定,则将 kwargs 字典传递给 self.processor 中定义的 AttentionProcessor
  • controlnet_conditioning_scale (float | list[float], 默认为 1.0) — ControlNet 的输出在添加到原始 unet 中的残差之前,乘以 controlnet_conditioning_scale。如果 init 中指定了多个 ControlNet,可以将相应的比例设置为列表。
  • guess_mode (bool, 默认为 False) — ControlNet 编码器即使您删除所有提示也会尝试识别输入图像的内容。建议 guidance_scale 值在 3.0 到 5.0 之间。
  • control_guidance_start (float | list[float], 默认为 0.0) — ControlNet 开始应用的步骤总数的百分比。
  • control_guidance_end (float | list[float], 可选, 默认为 1.0) — ControlNet 停止应用的步骤总数的百分比。
  • clip_skip (int | None, 默认为 None) — 在计算提示嵌入时,从 CLIP 跳过的层数。值为 1 表示将使用预最终层的输出计算提示嵌入。
  • callback_on_step_end (Callable[[int, int, dict], None] | PipelineCallback | MultiPipelineCallbacks | None, 默认为 None) — 一个函数或 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[str], 默认为 ["latents"]) — callback_on_step_end 函数的张量输入列表。列表中指定的张量将作为 callback_kwargs 参数传递。您只能包含管道类 ._callback_tensor_inputs 属性中列出的变量。

返回

diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutputtuple

如果 `return_dict` 为 `True`,则返回 `diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput`,否则返回一个 `tuple`,其中第一个元素是生成的图像列表,第二个元素是一个 `bool` 列表,指示相应的生成图像是否包含“不适合工作”(nsfw) 内容。

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

NeuronStableDiffusionXLControlNetPipeline

optimum.neuron.NeuronStableDiffusionXLControlNetPipeline

< >

( config: dict[str, typing.Any] configs: dict[str, 'PretrainedConfig'] neuron_configs: dict[str, 'NeuronDefaultConfig'] data_parallel_mode: typing.Literal['none', 'unet', 'transformer', 'all'] scheduler: diffusers.schedulers.scheduling_utils.SchedulerMixin | None vae_decoder: torch.jit._script.ScriptModule | NeuronModelVaeDecoder text_encoder: torch.jit._script.ScriptModule | NeuronModelTextEncoder | None = None text_encoder_2: torch.jit._script.ScriptModule | NeuronModelTextEncoder | None = None unet: torch.jit._script.ScriptModule | NeuronModelUnet | None = None transformer: torch.jit._script.ScriptModule | NeuronModelTransformer | None = None vae_encoder: torch.jit._script.ScriptModule | NeuronModelVaeEncoder | None = None image_encoder: torch.jit._script.ScriptModule | None = None safety_checker: torch.jit._script.ScriptModule | None = None tokenizer: transformers.models.clip.tokenization_clip.CLIPTokenizer | transformers.models.t5.tokenization_t5.T5Tokenizer | None = None tokenizer_2: transformers.models.clip.tokenization_clip.CLIPTokenizer | None = None feature_extractor: transformers.models.clip.feature_extraction_clip.CLIPFeatureExtractor | None = None controlnet: torch.jit._script.ScriptModule | list[torch.jit._script.ScriptModule]| NeuronControlNetModel | NeuronMultiControlNetModel | None = None requires_aesthetics_score: bool = False force_zeros_for_empty_prompt: bool = True add_watermarker: bool | None = None model_save_dir: str | pathlib.Path | tempfile.TemporaryDirectory | None = None model_and_config_save_paths: dict[str, tuple[str, pathlib.Path]] | None = None )

__call__

< >

( prompt: str | list[str] | None = None prompt_2: str | list[str] | None = None image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, typing.List[PIL.Image.Image], typing.List[numpy.ndarray], typing.List[torch.Tensor], NoneType] = None num_inference_steps: int = 50 timesteps: list[int] | None = None sigmas: list[float] | None = None denoising_end: float | None = None guidance_scale: float = 5.0 negative_prompt: str | list[str] | None = None negative_prompt_2: str | list[str] | None = None num_images_per_prompt: int | None = 1 eta: float = 0.0 generator: torch._C.Generator | list[torch._C.Generator] | None = None latents: torch.Tensor | None = None prompt_embeds: torch.Tensor | None = None negative_prompt_embeds: torch.Tensor | None = None pooled_prompt_embeds: torch.Tensor | None = None negative_pooled_prompt_embeds: torch.Tensor | None = None ip_adapter_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, typing.List[PIL.Image.Image], typing.List[numpy.ndarray], typing.List[torch.Tensor], NoneType] = None ip_adapter_image_embeds: list[torch.Tensor] | None = None output_type: str | None = 'pil' return_dict: bool = True cross_attention_kwargs: dict[str, typing.Any] | None = None controlnet_conditioning_scale: float | list[float] = 1.0 guess_mode: bool = False control_guidance_start: float | list[float] = 0.0 control_guidance_end: float | list[float] = 1.0 original_size: tuple[int, int] | None = None crops_coords_top_left: tuple[int, int] = (0, 0) target_size: tuple[int, int] | None = None negative_original_size: tuple[int, int] | None = None negative_crops_coords_top_left: tuple[int, int] = (0, 0) negative_target_size: tuple[int, int] | None = None clip_skip: int | None = None callback_on_step_end: typing.Union[typing.Callable[[int, int, dict], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = None callback_on_step_end_tensor_inputs: list[str] = ['latents'] **kwargs ) diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutputtuple

参数

  • prompt (str | list[str], 默认为 None) — 用于指导图像生成的提示词或提示词列表。如果未定义,则需要传递 prompt_embeds
  • prompt_2 (str | list[str], 默认为 None) — 发送到 tokenizer_2text_encoder_2 的提示词或提示词列表。如果未定义,prompt 将用于两个文本编码器。
  • image (PipelineImageInput | None, 默认为 None) — ControlNet 输入条件,用于为 unet 生成提供指导。如果类型指定为 torch.Tensor,则直接将其传递给 ControlNet。PIL.Image.Image 也可以作为图像接受。输出图像的尺寸默认为 image 的尺寸。如果传递了高度和/或宽度,则 image 将相应地调整大小。如果在 init 中指定了多个 ControlNet,则图像必须作为列表传递,以便列表的每个元素都可以正确地批处理以输入到单个 ControlNet。
  • num_inference_steps (int, 默认为 50) — 去噪步数。更多的去噪步数通常会带来更高质量的图像,但推理速度会变慢。
  • timesteps (list[int] | None, 默认为 None) — 用于支持 timesteps 参数的调度器的去噪过程的自定义时间步。如果未定义,将使用传递 num_inference_steps 时的默认行为。必须按降序排列。
  • sigmas (list[float] | None, 默认为 None) — 用于支持 sigmas 参数的调度器的去噪过程的自定义 sigma 值。如果未定义,将使用传递 num_inference_steps 时的默认行为。
  • denoising_end (float | None, 默认为 None) — 指定时,确定在有意提前终止之前要完成的总去噪过程的分数(介于 0.0 和 1.0 之间)。因此,返回的样本将根据调度器选择的离散时间步保留大量噪声。denoising_end 参数理想情况下应在管道构成“去噪器混合”多管道设置的一部分时使用,如优化图像输出中所详述。
  • guidance_scale (float, 默认为 5.0) — 较高的指导比例值会鼓励模型生成与文本 prompt 紧密相关的图像,但会牺牲图像质量。当 guidance_scale > 1 时,启用指导比例。
  • negative_prompt (str | list[str] | None, 默认为 None) — 用于指导图像生成中不包含内容的提示词或提示词列表。如果未定义,则需要传递 negative_prompt_embeds。当不使用指导时 (guidance_scale < 1) 忽略。
  • negative_prompt_2 (str | list[str] | None, 默认为 None) — 用于指导图像生成中不包含内容的提示词或提示词列表。这将被发送到 tokenizer_2text_encoder_2。如果未定义,negative_prompt 将用于两个文本编码器。
  • num_images_per_prompt (int, 默认为 1) — 每个提示词生成的图像数量。
  • eta (float, 默认为 0.0) — 对应于 DDIM 论文中的参数 eta (η)。仅适用于 diffusers.schedulers.DDIMScheduler,在其他调度器中被忽略。
  • generator (torch.Generator | list[torch.Generator] | None, 默认为 None) — 用于使生成具有确定性的 torch.Generator
  • latents (torch.Tensor | None, 默认为 None) — 从高斯分布中采样的预生成噪声潜在变量,用作图像生成的输入。可用于使用不同的提示词调整相同的生成。如果未提供,则使用提供的随机 generator 进行采样生成一个潜在张量。
  • prompt_embeds (torch.Tensor | None, 默认为 None) — 预生成的文本嵌入。可用于轻松调整文本输入(提示词权重)。如果未提供,文本嵌入将从 prompt 输入参数生成。
  • negative_prompt_embeds (torch.Tensor | None, 默认为 None) — 预生成的负文本嵌入。可用于轻松调整文本输入(提示词权重)。如果未提供,negative_prompt_embeds 将从 negative_prompt 输入参数生成。
  • pooled_prompt_embeds (torch.Tensor | None, 默认为 None) — 预生成的池化文本嵌入。可用于轻松调整文本输入(提示词权重)。如果未提供,池化文本嵌入将从 prompt 输入参数生成。
  • negative_pooled_prompt_embeds (torch.Tensor | None, 默认为 None) — 预生成的负池化文本嵌入。可用于轻松调整文本输入(提示词权重)。如果未提供,池化 negative_prompt_embeds 将从 negative_prompt 输入参数生成。
  • ip_adapter_image (PipelineImageInput | None, 默认为 None) — 可选的图像输入,用于与 IP 适配器配合使用。
  • ip_adapter_image_embeds (list[torch.Tensor] | None, 默认为 None) — IP-Adapter 的预生成图像嵌入。它应该是一个列表,长度与 IP 适配器数量相同。每个元素都应该是一个形状为 (batch_size, num_images, emb_dim) 的张量。如果 do_classifier_free_guidance 设置为 True,它应该包含负图像嵌入。如果未提供,嵌入将从 ip_adapter_image 输入参数计算。
  • output_type (str | None, 默认为 "pil") — 生成图像的输出格式。选择 PIL.Imagenp.array
  • return_dict (bool, 默认为 True) — 是否返回 ~pipelines.stable_diffusion.StableDiffusionPipelineOutput 而不是普通元组。
  • cross_attention_kwargs (dict[str, Any] | None, 默认为 None) — 如果指定,则作为 kwargs 字典传递给 self.processor 中定义的 AttentionProcessor
  • controlnet_conditioning_scale (float | list[float], 默认为 1.0) — ControlNet 的输出在添加到原始 unet 中的残差之前乘以 controlnet_conditioning_scale。如果在 init 中指定了多个 ControlNet,则可以将相应的比例设置为列表。
  • guess_mode (bool, 默认为 False) — 即使您删除所有提示词,ControlNet 编码器也会尝试识别输入图像的内容。建议 guidance_scale 值在 3.0 到 5.0 之间。
  • control_guidance_start (float | list[float], 默认为 0.0) — ControlNet 开始应用的步数总百分比。
  • control_guidance_end (float | list[float], 默认为 1.0) — ControlNet 停止应用的步数总百分比。
  • original_size (tuple[int, int] | None, 默认为 (1024, 1024)) — 如果 original_sizetarget_size 不相同,则图像将显示为缩小或放大。如果未指定,original_size 默认为 (height, width)。SDXL 微条件的一部分,如 https://huggingface.ac.cn/papers/2307.01952 第 2.2 节所述。
  • crops_coords_top_left (tuple[int, int], 默认为 (0, 0)) — crops_coords_top_left 可用于生成一个看起来像是从 crops_coords_top_left 位置向下“裁剪”的图像。通常通过将 crops_coords_top_left 设置为 (0, 0) 来获得效果良好、居中的图像。SDXL 微条件的一部分,如 https://huggingface.ac.cn/papers/2307.01952 第 2.2 节所述。
  • target_size (tuple[int, int] | None, 默认为 None) — 在大多数情况下,target_size 应设置为生成图像所需的宽度和高度。如果未指定,它将默认为 (height, width)。SDXL 微条件的一部分,如 https://huggingface.ac.cn/papers/2307.01952 第 2.2 节所述。
  • negative_original_size (tuple[int, int] | None, 默认为 None) — 用于根据特定图像分辨率对生成过程进行负面条件化。SDXL 微条件的一部分,如 https://huggingface.ac.cn/papers/2307.01952 第 2.2 节所述。有关更多信息,请参阅此问题讨论串:https://github.com/huggingface/diffusers/issues/4208
  • negative_crops_coords_top_left (tuple[int, int], 默认为 (0, 0)) — 用于根据特定裁剪坐标对生成过程进行负面条件化。SDXL 微条件的一部分,如 https://huggingface.ac.cn/papers/2307.01952 第 2.2 节所述。有关更多信息,请参阅此问题讨论串:https://github.com/huggingface/diffusers/issues/4208
  • negative_target_size (tuple[int, int] | None, 默认为 None) — 用于根据目标图像分辨率对生成过程进行负面条件化。在大多数情况下,它应该与 target_size 相同。SDXL 微条件的一部分,如 https://huggingface.ac.cn/papers/2307.01952 第 2.2 节所述。有关更多信息,请参阅此问题讨论串:https://github.com/huggingface/diffusers/issues/4208
  • clip_skip (int | None, 默认为 None) — 在计算提示词嵌入时,从 CLIP 跳过的层数。值为 1 表示将使用倒数第二层的输出计算提示词嵌入。
  • callback_on_step_end (Callable[[int, int, dict], None] | PipelineCallback | MultiPipelineCallbacks | None, 默认为 None) — 在推理期间,每个去噪步骤结束时调用的函数或 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[str], 默认为 ["latents"]) — 用于 callback_on_step_end 函数的张量输入列表。列表中指定的张量将作为 callback_kwargs 参数传递。您只能包含管道类的 ._callback_tensor_inputs 属性中列出的变量。

返回

diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutputtuple

如果 return_dictTrue,则返回 diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput,否则返回包含输出图像的 tuple

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

示例

还有其他扩散功能是您希望我们在 🤗Optimum-neuron 中支持的吗?请在 Optimum-neuron Github repo 上提交问题或在 HuggingFace 社区论坛上与我们讨论,祝好 🤗!