本日は Style & layout control を試してみます。
こちら diffusers v0.27.2 では実装されておらず、先日の IP-Adapter FaceID と同様エラーになります。diffusers は main ブランチを使用します。
diffusers の main ブランチの話はこちらの記事
今度はエラーになっても、慌てず騒がずだった!
IP-Adapter で Style & Layout control とは?
InstantStyle というものを使うようです。
InstantStyle は IP-Adapter の追加機能のようなもので画像プロンプトのスタイルやレイアウトに従ってテキストプロンプトを実行するようです。
たぶん!
試してみる
モデルのロードをする
import torch from diffusers import AutoPipelineForText2Image # ベースモデルをロードする pipe = AutoPipelineForText2Image.from_pretrained( "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16 ).to("cuda") # IP-Adapter をロードする pipe.load_ip_adapter( "h94/IP-Adapter", subfolder="sdxl_models", weight_name="ip-adapter_sdxl.bin" )
IP-Adapter のスケールを設定する
InstantStyleで重要なのが IP-Adapter のスケール設定!
# IP-Adapter のスケールを設定する scale = { "down": { "block_2": [0.0, 1.0] }, "up": { "block_0": [0.0, 1.0, 0.0] }, } pipe.set_ip_adapter_scale(scale)
This will activate IP-Adapter at the second layer in the model’s down-part block 2 and up-part block 0.
Google 翻訳:これにより、モデルの下位ブロック 2 と上位ブロック 0 の第 2 層で IP アダプターがアクティブになります。The former is the layer where IP-Adapter injects layout information and the latter injects style.
Google 翻訳:前者は IP アダプターがレイアウト情報を注入する層であり、後者はスタイルを注入する層です。
つまり?
down-part の block_2 がレイアウト情報の層
up-part の block_0 がスタイル情報の層
ということでしょうか?
IP-Adapter 用の画像をロードする
from diffusers.utils import load_image # IP-Adapter に使用する画像をロードする ip_adapter_image_url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/0052a70beed5bf71b92610a43a52df6d286cd5f3/diffusers/rabbit.jpg" ip_adapter_image = load_image(ip_adapter_image_url)
パイプラインを実行する
import torch # シードを設定する generator = torch.Generator(device="cpu").manual_seed(26) # パイプラインを実行する # 猫、傑作、最高品質、高品質 prompt = "a cat, masterpiece, best quality, high quality" negative_prompt = "text, watermark, lowres, low quality, worst quality, deformed, glitch, low contrast, noisy, saturation, blurry" images = pipe( prompt, negative_prompt=negative_prompt, ip_adapter_image=ip_adapter_image, guidance_scale=5, num_inference_steps=30, num_images_per_prompt=1, generator=generator, ).images
画像プロンプト
![IP-Adapter 用のウサギの画像](https://cdn-ak.f.st-hatena.com/images/fotolife/z/zako_lab929/20240523/20240523205350.jpg)
テキストプロンプト
a cat, masterpiece, best quality, high quality
生成された画像を出力
from datetime import datetime from zoneinfo import ZoneInfo # Asia/Tokyo タイムゾーンの現在時刻を YYYYMMDDhhmmss 形式で得る formattedNow = datetime.now(tz=ZoneInfo("Asia/Tokyo")).strftime("%Y%m%d%H%M%S") for idx, image in enumerate(images): # 実行結果 image.save(f"image_{formattedNow}_{idx}_{generator.initial_seed()}.png")
まとめ
慌てず騒がず