はじめに
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")