Diffusers 文件

擾動注意力引導

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

擾動注意力引導

擾動注意力引導(PAG)是一種新的擴散取樣引導方法,無需進一步訓練或整合外部模組,即可提高無條件和條件設定下的樣本質量。PAG 旨在透過考慮自注意力機制捕獲結構資訊的能力,在去噪過程中逐步增強合成樣本的結構。它涉及透過將擴散 U-Net 中選定的自注意力圖替換為單位矩陣來生成結構退化的中間樣本,並引導去噪過程遠離這些退化的樣本。

本指南將向您展示如何將 PAG 用於各種任務和用例。

通用任務

您可以將 PAG 應用於 StableDiffusionXLPipeline,用於文字到影像、影像到影像和影像修復等任務。要為特定任務啟用 PAG,請使用 AutoPipeline API 載入管道,並設定 enable_pag=True 標誌和 pag_applied_layers 引數。

🤗 Diffusers 目前僅支援將 PAG 與選定的 SDXL 管道和 PixArtSigmaPAGPipeline 一起使用。但如果您想為新的管道新增 PAG 支援,請隨時開啟 功能請求

文字到影像
影像到影像
影像修復
from diffusers import AutoPipelineForText2Image
from diffusers.utils import load_image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    enable_pag=True,
    pag_applied_layers=["mid"],
    torch_dtype=torch.float16
)
pipeline.enable_model_cpu_offload()

pag_applied_layers 引數允許您指定 PAG 應用於哪些層。此外,您可以在建立管道後使用 set_pag_applied_layers 方法更新這些層。請檢視 pag_applied_layers 部分,瞭解更多關於將 PAG 應用於其他層的資訊。

如果您已經建立並載入了管道,可以使用 from_pipe API 並啟用 enable_pag 標誌來啟用 PAG。在內部,將根據您指定的管道和任務建立 PAG 管道。在下面的示例中,由於我們使用了 AutoPipelineForText2Image 並傳入了 StableDiffusionXLPipeline,因此相應地建立了 StableDiffusionXLPAGPipeline。請注意,這不需要額外的記憶體,並且您將同時載入 StableDiffusionXLPipelineStableDiffusionXLPAGPipeline 並準備使用。您可以在 Diffusers 此處閱讀更多關於 from_pipe API 和如何重用管道的資訊。

pipeline_sdxl = AutoPipelineForText2Image.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16)
pipeline = AutoPipelineForText2Image.from_pipe(pipeline_sdxl, enable_pag=True)

要生成影像,您還需要傳入一個 pag_scale。當 pag_scale 增加時,影像會獲得更具語義一致性的結構並表現出更少的偽影。然而,過大的引導比例可能導致影像紋理更平滑和輕微飽和,類似於 CFG。官方演示中使用了 pag_scale=3.0,並且在大多數用例中效果良好,但請隨意嘗試並根據您的需求選擇合適的值!當 pag_scale=0 時,PAG 將被停用。

prompt = "an insect robot preparing a delicious meal, anime style"

for pag_scale in [0.0, 3.0]:
    generator = torch.Generator(device="cpu").manual_seed(0)
    images = pipeline(
        prompt=prompt,
        num_inference_steps=25,
        guidance_scale=7.0,
        generator=generator,
        pag_scale=pag_scale,
    ).images
沒有 PAG 生成的影像
有 PAG 生成的影像

PAG 與 ControlNet 結合使用

要將 PAG 與 ControlNet 一起使用,首先建立一個 controlnet。然後,將 controlnet 和其他 PAG 引數傳遞給指定任務的 AutoPipeline 的 from_pretrained 方法。

from diffusers import AutoPipelineForText2Image, ControlNetModel
import torch

controlnet = ControlNetModel.from_pretrained(
    "diffusers/controlnet-canny-sdxl-1.0", torch_dtype=torch.float16
)

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    controlnet=controlnet,
    enable_pag=True,
    pag_applied_layers="mid",
    torch_dtype=torch.float16
)
pipeline.enable_model_cpu_offload()

如果您已經有一個 controlnet 管道並希望啟用 PAG,可以使用 from_pipe API:AutoPipelineForText2Image.from_pipe(pipeline_controlnet, enable_pag=True)

您可以像平時使用 ControlNet 管道一樣使用該管道,同時增加了指定 pag_scale 引數的選項。請注意,PAG 在無條件生成方面表現良好。在此示例中,我們將生成一張沒有提示的影像。

from diffusers.utils import load_image
canny_image = load_image(
    "https://huggingface.co/datasets/YiYiXu/testing-images/resolve/main/pag_control_input.png"
)

for pag_scale in [0.0, 3.0]:
    generator = torch.Generator(device="cpu").manual_seed(1)
    images = pipeline(
        prompt="",
        controlnet_conditioning_scale=controlnet_conditioning_scale,
        image=canny_image,
        num_inference_steps=50,
        guidance_scale=0,
        generator=generator,
        pag_scale=pag_scale,
    ).images
    images[0]
沒有 PAG 生成的影像
有 PAG 生成的影像

PAG 與 IP-Adapter 結合使用

IP-Adapter 是一種流行的模型,可以插入到擴散模型中,從而無需對底層模型進行任何更改即可實現影像提示。您可以在載入了 IP-Adapter 的管道上啟用 PAG。

from diffusers import AutoPipelineForText2Image
from diffusers.utils import load_image
from transformers import CLIPVisionModelWithProjection
import torch

image_encoder = CLIPVisionModelWithProjection.from_pretrained(
    "h94/IP-Adapter",
    subfolder="models/image_encoder",
    torch_dtype=torch.float16
)

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    image_encoder=image_encoder,
    enable_pag=True,
    torch_dtype=torch.float16
).to("cuda")

pipeline.load_ip_adapter("h94/IP-Adapter", subfolder="sdxl_models", weight_name="ip-adapter-plus_sdxl_vit-h.bin")

pag_scales = 5.0
ip_adapter_scales = 0.8

image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ip_adapter_diner.png")

pipeline.set_ip_adapter_scale(ip_adapter_scale)
generator = torch.Generator(device="cpu").manual_seed(0)
images = pipeline(
    prompt="a polar bear sitting in a chair drinking a milkshake",
    ip_adapter_image=image,
    negative_prompt="deformed, ugly, wrong proportion, low res, bad anatomy, worst quality, low quality",
    num_inference_steps=25,
    guidance_scale=3.0,
    generator=generator,
    pag_scale=pag_scale,
).images
images[0]

PAG 減少了偽影並改善了整體構圖。

沒有 PAG 生成的影像
有 PAG 生成的影像

配置引數

pag_applied_layers

pag_applied_layers 引數允許您指定 PAG 應用於哪些層。預設情況下,它僅應用於中間塊。更改此設定將顯著影響輸出。您可以使用 set_pag_applied_layers 方法在建立管道後調整 PAG 層,幫助您找到模型的最佳層。

例如,以下是使用 pag_layers = ["down.block_2"]pag_layers = ["down.block_2", "up.block_1.attentions_0"] 生成的影像

prompt = "an insect robot preparing a delicious meal, anime style"
pipeline.set_pag_applied_layers(pag_layers)
generator = torch.Generator(device="cpu").manual_seed(0)
images = pipeline(
    prompt=prompt,
    num_inference_steps=25,
    guidance_scale=guidance_scale,
    generator=generator,
    pag_scale=pag_scale,
).images
images[0]
down.block_2 + up.block1.attentions_0
down.block_2
< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.