ジャコ Lab

プログラミング関連のメモ帳的ブログです

IP-Adapter の InstantStyle を試してみる

本日は 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-partblock_2 がレイアウト情報の層
up-partblock_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 用のウサギの画像
IP-Adapter 用のウサギの画像
テキストプロンプト
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")

ぬこ
ぬこ

まとめ

慌てず騒がず