Diffusers 文件
擾動注意力引導
並獲得增強的文件體驗
開始使用
擾動注意力引導
擾動注意力引導(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
。請注意,這不需要額外的記憶體,並且您將同時載入 StableDiffusionXLPipeline
和 StableDiffusionXLPAGPipeline
並準備使用。您可以在 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 與 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 與 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_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]

