MultiDiffusion
MultiDiffusion: 用于受控图像生成的融合扩散路径 是 Omer Bar-Tal、Lior Yariv、Yaron Lipman 和 Tali Dekel 的作品。
论文摘要如下
基于扩散模型的文本到图像生成技术的最新进展在图像质量方面展现出变革性的能力。然而,生成图像的用户可控性和快速适应新任务仍然是一个开放的挑战,目前主要通过昂贵且耗时的重新训练和微调或针对特定图像生成任务的临时调整来解决。在这项工作中,我们提出了MultiDiffusion,一个统一的框架,它允许使用预训练的文本到图像扩散模型进行多功能且可控的图像生成,而无需任何额外的训练或微调。我们方法的核心是一个新的生成过程,它基于一个优化任务,将多个扩散生成过程与一组共享的参数或约束捆绑在一起。我们证明了MultiDiffusion可以很容易地应用于生成符合用户提供控制的高质量和多样化图像,例如所需的纵横比(例如,全景)和空间引导信号,从精确的分割掩码到边界框。
您可以在项目页面、原始代码库中找到有关MultiDiffusion的更多信息,并可以在演示中试用它。
提示
在调用StableDiffusionPanoramaPipeline时,可以指定view_batch_size
参数大于1。对于一些高性能的GPU,这可以加快生成过程并增加VRAM使用率。
要生成类似全景的图像,请确保相应地传递宽度参数。我们建议使用默认值2048的宽度值。
应用圆形填充以确保在处理全景时不会出现拼接伪影,从而确保从最右端到最左端平滑过渡。通过启用圆形填充(设置circular_padding=True
),操作会在图像最右端点后应用额外的裁剪,使模型能够“看到”从最右端到最左端的过渡。这有助于在360度意义上保持视觉一致性,并创建可以使用360度全景查看器观看的正确“全景”。在Stable Diffusion中解码潜在向量时,会应用圆形填充以确保解码后的潜在向量在RGB空间中匹配。
例如,在没有圆形填充的情况下,会出现拼接伪影(默认):
但使用圆形填充后,右侧和左侧部分会匹配(circular_padding=True
):
StableDiffusionPanoramaPipeline
class diffusers.StableDiffusionPanoramaPipeline
< 源代码 >( vae: AutoencoderKL text_encoder: CLIPTextModel tokenizer: CLIPTokenizer unet: UNet2DConditionModel scheduler: DDIMScheduler safety_checker: StableDiffusionSafetyChecker feature_extractor: CLIPImageProcessor image_encoder: Optional = None requires_safety_checker: bool = True )
参数
- vae (AutoencoderKL) — 变分自编码器(VAE)模型,用于将图像编码和解码到潜在表示形式,并从潜在表示形式解码到图像。
- text_encoder (CLIPTextModel) — 冻结的文本编码器 (clip-vit-large-patch14)。
- tokenizer (CLIPTokenizer) — 用于对文本进行标记的
CLIPTokenizer
。 - unet (UNet2DConditionModel) — 用于对编码的图像潜在向量进行降噪的
UNet2DConditionModel
。 - scheduler (SchedulerMixin) — 用于与
unet
结合对编码图像潜在变量进行降噪的调度器。可以是 DDIMScheduler、LMSDiscreteScheduler 或 PNDMScheduler 之一。 - safety_checker (
StableDiffusionSafetyChecker
) — 用于估计生成的图像是否可能被认为具有攻击性或有害的分类模块。请参阅 模型卡,以了解有关模型潜在危害的更多详细信息。 - feature_extractor (CLIPImageProcessor) — 用于从生成的图像中提取特征的
CLIPImageProcessor
;用作safety_checker
的输入。
使用 MultiDiffusion 进行文本到图像生成的管道。
此模型继承自 DiffusionPipeline。查看超类文档以了解为所有管道实现的通用方法(下载、保存、在特定设备上运行等)。
该管道还继承了以下加载方法
- load_textual_inversion() 用于加载文本反转嵌入
- load_lora_weights() 用于加载 LoRA 权重
- save_lora_weights() 用于保存 LoRA 权重
- load_ip_adapter() 用于加载 IP 适配器
__call__
< source >( prompt: Union = None height: Optional = 512 width: Optional = 2048 num_inference_steps: int = 50 timesteps: List = None guidance_scale: float = 7.5 view_batch_size: int = 1 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 guidance_rescale: float = 0.0 circular_padding: bool = False clip_skip: Optional = None callback_on_step_end: Optional = None callback_on_step_end_tensor_inputs: List = ['latents'] **kwargs: Any ) → StableDiffusionPipelineOutput 或 tuple
参数
- prompt (
str
或List[str]
,可选) — 指导图像生成的提示或提示。如果未定义,您需要传递prompt_embeds
。 - height (
int
,可选,默认为 512) — 生成的图像的像素高度。 - width (
int
,可选,默认为 2048) — 生成的图像的像素宽度。宽度保持较高,因为管道应该生成全景式图像。 - num_inference_steps (
int
, 可选, 默认值:50) — 降噪步骤数。更多的降噪步骤通常会导致更高质量的图像,但会降低推理速度。 - timesteps (
List[int]
, 可选) — 生成图像的时步。如果没有指定,则使用调度器的默认时步间隔策略。 - guidance_scale (
float
, 可选, 默认值:7.5) — 更高的指导尺度值会鼓励模型生成与文本prompt
密切相关的图像,但会降低图像质量。当guidance_scale > 1
时,启用指导尺度。 - view_batch_size (
int
, 可选, 默认值:1) — 用于降噪拆分视图的批次大小。对于某些具有高性能的 GPU,较高的视图批次大小可以加快生成速度并增加 VRAM 使用量。 - 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
输入参数生成文本嵌入。 - output_type (
str
, 可选,默认为"pil"
) — 生成的图像的输出格式。在PIL.Image
或np.array
之间选择。 - return_dict (
bool
, 可选,默认为True
) — 是否返回 StableDiffusionPipelineOutput 而不是普通元组。 - cross_attention_kwargs (
dict
, 可选) — 如果指定,则传递给AttentionProcessor
的关键字参数字典,如 diffusers.models.attention_processor 中的self.processor
下所定义。 - guidance_rescale (
float
, 可选,默认为 0.0) — 指导嵌入的重新缩放因子。值为 0.0 表示不应用重新缩放。 - circular_padding (
bool
, 可选,默认为False
) — 如果设置为True
,则应用圆形填充以确保没有缝合伪影。圆形填充允许模型无缝地从图像的最右侧生成过渡到最左侧,在 360 度范围内保持一致性。 - clip_skip (
int
, 可选) — 从 CLIP 计算提示嵌入时要跳过的层数。值为 1 表示将使用倒数第二层的输出计算提示嵌入。 - callback_on_step_end (
Callable
, 可选) — 在推理过程中每次去噪步骤结束时调用的函数。该函数使用以下参数调用: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]
, 可选) —callback_on_step_end
函数的张量输入列表。列表中指定的张量将作为callback_kwargs
参数传递。您只能包含管道类._callback_tensor_inputs
属性中列出的变量。
返回值
StableDiffusionPipelineOutput 或 tuple
如果 return_dict
为 True
,则返回 StableDiffusionPipelineOutput,否则返回一个 tuple
,其中第一个元素是一个包含生成图像的列表,第二个元素是一个包含 bool
的列表,指示相应的生成图像是否包含“不适合工作”(nsfw)内容。
用于生成管道的调用函数。
示例
>>> import torch
>>> from diffusers import StableDiffusionPanoramaPipeline, DDIMScheduler
>>> model_ckpt = "stabilityai/stable-diffusion-2-base"
>>> scheduler = DDIMScheduler.from_pretrained(model_ckpt, subfolder="scheduler")
>>> pipe = StableDiffusionPanoramaPipeline.from_pretrained(
... model_ckpt, scheduler=scheduler, torch_dtype=torch.float16
... )
>>> pipe = pipe.to("cuda")
>>> prompt = "a photo of the dolomites"
>>> image = pipe(prompt).images[0]
decode_latents_with_padding
< source > ( latents: Tensor padding: int = 8 ) → torch.Tensor
使用填充解码给定的潜码,用于圆形推断。
注意
- 填充被添加以移除边界伪影,并提高输出质量。
- 这将略微增加内存使用量。
- 然后从解码图像中移除填充像素。
encode_prompt
< source > ( prompt device num_images_per_prompt do_classifier_free_guidance negative_prompt = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None lora_scale: Optional = None clip_skip: Optional = None )
参数
- prompt (
str
或List[str]
, 可选) — 要编码的提示 device — (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_embeds
将从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
get_views
< 源代码 > ( panorama_height: int panorama_width: int window_size: int = 64 stride: int = 8 circular_padding: bool = False ) → List[Tuple[int, int, int, int]]
根据给定的参数生成视图列表。在这里,我们定义了映射 F_i(参见 MultiDiffusion 论文 https://arxiv.org/abs/2302.08113 中的等式 7)。如果全景图的高度/宽度 < window_size,则高度/宽度的 num_blocks 应返回 1。
StableDiffusionPipelineOutput
class diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput
< 源代码 >( images: Union nsfw_content_detected: Optional )
Stable Diffusion 管道的输出类。