SDXL 1.0 (Stable Diffusion XL 1.0) の二つのテキストエンコーダーに別々とプロンプトを与える?複雑すぎるでしょ!どれが最適解か全くわかりません。

はじめに

SDXL 1.0 (Stable Diffusion XL 1.0)には二つのテキストエンコーダーがあるようです。

テキストエンコーダーとはざっくり言うとユーザーが与えたプロンプトを処理する部分です。

それが二つ(OpenCLIP と OpenAI CLIP)あるようです。

デフォルトではそれぞれに同じプロンプトが与えられるようですが、ユーザーが指定して別々のプロンプトを与えることも可能と知りました。

試しにやってみたところうまく動作はしました。

しかし、より良い画像を生成するためにどれが最適解かは全くわかりません。

結果

一番左がデフォルトです。
真ん中はスタイルを指定する単語をOpenCLIPに、それ以外をOpenAI CLIPに与えた場合です。
一番右がスタイルを指定する単語をOpenAI CLIPに、それ以外をOpenCLIPに与えた場合です。

全然ちがう画像が作成されることがわかりました。

どれが良いかはユーザー次第です。

自分は「デフォルトでええやん!」と思いました。

Pythonスクリプト

from diffusers import DiffusionPipeline
import torch

pipe = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    variant="fp16",
    use_safetensors=True
    ).to("cuda")

seed = 10000

# default
prompt = "anime style, detailed, 8k, Astronaut in a jungle"
generator = torch.manual_seed(seed)
image = pipe(
    prompt=prompt,
    generator=generator
    ).images[0]
image.save("default.png")

# style is passed to OpenCLIP
prompt = "Astronaut in a jungle"
prompt_2 = "anime style, detailed, 8k"
generator = torch.manual_seed(seed)
image = pipe(
    prompt=prompt,
    prompt_2=prompt_2,
    generator=generator
    ).images[0]
image.save("style_in_openclip.png")

# style is passed to OpenAI CLIP
prompt = "anime style, detailed, 8k"
prompt_2 = "Astronaut in a jungle"

generator = torch.manual_seed(seed)
image = pipe(
    prompt=prompt,
    prompt_2=prompt_2,
    generator=generator
    ).images[0]
image.save("style_in_openai_clip.png")




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