【Diffusers】Perturbed-Attention Guidance(PAG)を使ってみる

はじめに

「Perturbed-Attention Guidance」というのが新しく紹介されていたので久しぶりに画像生成をやってみました。

「Perturbed-Attention Guidance」とは?

公式の紹介をDeepLで翻訳したものをのせておきます。

Perturbed-Attention Guidance (PAG)は、新しい拡散サンプリングガイダンスであり、無条件設定と条件設定の両方にわたってサンプルの品質を向上させ、さらなるトレーニングや外部モジュールの統合を必要とせずにこれを達成する。PAGは、自己アテンションメカニズムが構造情報を捕捉する能力を考慮することにより、ノイズ除去プロセス全体を通して、合成されたサンプルの構造を徐々に向上させるように設計されている。これは、拡散U-Netの選択された自己注意マップを同一行列で置換することにより、劣化した構造を持つ中間サンプルを生成し、これらの劣化サンプルからノイズ除去プロセスを誘導することを含む。

Pythonスクリプト

以下のスクリプトで4枚の画像が作成されます。

from diffusers import AutoPipelineForText2Image
import torch

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

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

# no pag
generator = torch.Generator(device="cpu").manual_seed(0)
image = pipeline(
    prompt=prompt,
    num_inference_steps=25,
    guidance_scale=7.0,
    generator=generator,
).images[0]
image.save("no_pag.jpg")

# with pag
pipeline = AutoPipelineForText2Image.from_pipe(pipeline, enable_pag=True)

for i, layer in enumerate([["mid"], ["down.block_2"], ["down.block_2", "up.block_1.attentions_0"]]):
    pipeline.set_pag_applied_layers(layer)
    generator = torch.Generator(device="cpu").manual_seed(0)
    image = pipeline(
        prompt=prompt,
        num_inference_steps=25,
        guidance_scale=7.0,
        generator=generator,
        pag_scale=3.0,
    ).images[0]
    image.save(f"with_pag_{i}.jpg")

結果


左から

  • PAGなし
  • pag_applied_layers=["mid"]
  • pag_applied_layers=["down.block_2"]
  • pag_applied_layers=["down.block_2", "up.block_1.attentions_0"]





このエントリーをはてなブックマークに追加