ジャコ Lab

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

IP-Adapter の InstantStyle を試してみる (3) - レイアウトレイヤーだけ IP-Adapter を適用してみる

前回の記事

前回は スタイルレイヤー と思われる up プロパティを残して出力してみました。
今回は レイアウトレイヤー と思われる down プロパティを残して出力してみたいと思います。

まずは結果から

スクリプトは前回とほぼ一緒なので、後述に省略します。

レイアウトレイヤー?のみ IP-Adapter を適用した様子
レイアウトレイヤー?のみ IP-Adapter を適用した様子

両方適用したときとほぼ一緒!洋服の色とか目の色が違うくらい

スクリプト全体

(折りたたみ)

各種インストール

!pip install pip install git+https://github.com/huggingface/diffusers
!pip install -U transformers accelerate peft
diffusers v0.27.2 には実装されていない機能を使うので main branch をインストールします!間違えないように!

各種モデルをロードする

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 のスケールを設定する

# IP-Adapter のスケールを設定する
scale = {
    "down": {
        "block_2": [0.0, 1.0]
    },
}
pipe.set_ip_adapter_scale(scale)
ここがポイントです。今回はdownのみを定義します。

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")

まとめ

画像プロンプトのウサギの格好が維持されたように思います。

果たして、レイアウトだけ IP-Adapter が適用される。。。とは?

相変わらず、スッと理解できない状態です。