自注意力引导
使用自注意力引导提高扩散模型样本质量 由 Susung Hong 等人撰写。
论文摘要如下
降噪扩散模型 (DDMs) 因其卓越的生成质量和多样性而备受关注。这种成功很大程度上归功于使用类别或文本条件的扩散引导方法,例如分类器引导和无分类器引导。本文从更全面的角度出发,超越了传统的引导方法。从这个广义的角度来看,我们引入了新颖的无条件和无训练策略来提高生成的图像质量。作为一种简单的解决方案,模糊引导提高了中间样本对其精细信息和结构的适用性,使扩散模型能够以适度的引导尺度生成更高质量的样本。在此基础上,自注意力引导 (SAG) 使用扩散模型的中间自注意力图来增强其稳定性和有效性。具体来说,SAG 仅在扩散模型在每次迭代中关注的区域进行对抗性模糊,并相应地引导它们。我们的实验结果表明,我们的 SAG 提高了各种扩散模型的性能,包括 ADM、IDDPM、稳定扩散和 DiT。此外,将 SAG 与传统引导方法相结合可以进一步提高性能。
您可以在 项目页面、原始代码库 上找到有关自注意力引导的更多信息,并尝试在 演示 或 笔记本 中进行尝试。
StableDiffusionSAGPipeline
class diffusers.StableDiffusionSAGPipeline
< source >( vae: AutoencoderKL text_encoder: CLIPTextModel tokenizer: CLIPTokenizer unet: UNet2DConditionModel scheduler: KarrasDiffusionSchedulers 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
的输入。
使用 Stable Diffusion 进行文本到图像生成的管道。
该模型继承自 DiffusionPipeline。查看超类文档以获取为所有管道实现的通用方法(下载、保存、在特定设备上运行等)。
该管道还继承了以下加载方法
- load_textual_inversion() 用于加载文本反转嵌入
- load_ip_adapter() 用于加载 IP 适配器
__call__
< 源代码 >( prompt: Union = None height: Optional = None width: Optional = None num_inference_steps: int = 50 guidance_scale: float = 7.5 sag_scale: float = 0.75 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 callback: Optional = None callback_steps: Optional = 1 cross_attention_kwargs: Optional = None clip_skip: Optional = None ) → StableDiffusionPipelineOutput 或 tuple
参数
- prompt (
str
或List[str]
, 可选) — 指导图像生成的提示或提示。如果未定义,您需要传递prompt_embeds
。 - 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) — 降噪步骤的数量。更多降噪步骤通常会导致更高质量的图像,但会以更慢的推理为代价。 - guidance_scale (
float
, 可选, 默认值为 7.5) — 更高的引导比例值鼓励模型生成与文本prompt
密切相关的图像,但会以降低图像质量为代价。当guidance_scale > 1
时启用引导比例。 - sag_scale (
float
, 可选, 默认为 0.75) — 在 [0, 1.0] 之间选择,以获得更好的质量。 - negative_prompt (
str
或List[str]
, 可选) — 指导图像生成中不包含什么的提示或提示。 如果未定义,则需要改为传递negative_prompt_embeds
。 当不使用引导时(guidance_scale < 1
)忽略。 - num_images_per_prompt (
int
, 可选, 默认为 1) — 每个提示生成的图像数量。 - eta (
float
, 可选, 默认为 0.0) — 对应于来自 DDIM 论文的 η 参数。 仅适用于 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
输入参数生成negative_prompt_embeds
。 ip_adapter_image — (PipelineImageInput
, 可选): 可选的图像输入,用于与 IP 适配器一起使用。 - ip_adapter_image_embeds (
List[torch.Tensor]
, 可选) — 用于 IP 适配器的预生成的图像嵌入。 如果未提供,则从ip_adapter_image
输入参数计算嵌入。 - output_type (
str
, 可选, 默认为"pil"
) — 生成的图像的输出格式。 在PIL.Image
或np.array
之间选择。 - callback_steps (
int
, 可选,默认值为 1) —callback
函数的调用频率。如果未指定,则在每一步都调用回调函数。 - cross_attention_kwargs (
dict
, 可选) — 如果指定,则将作为关键字参数字典传递给self.processor
中定义的AttentionProcessor
. - clip_skip (
int
, 可选) — 从 CLIP 计算提示嵌入时要跳过的层数。值为 1 表示将使用倒数第二层的输出计算提示嵌入。
返回值
StableDiffusionPipelineOutput 或 tuple
如果 return_dict
为 True
,则返回 StableDiffusionPipelineOutput,否则返回 tuple
,其中第一个元素是包含生成图像的列表,第二个元素是包含 bool
值的列表,指示相应的生成图像是否包含“不适合工作”(nsfw)内容。
用于生成管道调用的函数。
示例
>>> import torch
>>> from diffusers import StableDiffusionSAGPipeline
>>> pipe = StableDiffusionSAGPipeline.from_pretrained(
... "runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16
... )
>>> pipe = pipe.to("cuda")
>>> prompt = "a photo of an astronaut riding a horse on mars"
>>> image = pipe(prompt, sag_scale=0.75).images[0]
encode_prompt
< 源代码 > ( 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
,则忽略)。 - lora_scale (
float
, 可选) — 如果加载了 LoRA 层,则将应用于文本编码器所有 LoRA 层的 LoRA 比例。 - clip_skip (
int
, 可选) — 从 CLIP 计算提示嵌入时要跳过的层数。 值为 1 意味着将使用预最终层的输出计算提示嵌入。
将提示编码为文本编码器隐藏状态。
StableDiffusionOutput
class diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput
< 源代码 >( images: Union nsfw_content_detected: Optional )
Stable Diffusion 管道的输出类。