SDXL で IP-Adapter を試してみる


github.com

はじめに

IP-Adapter を Stable Diffusion Web UI の拡張機能としてではなく公式のGitHub通りに動かしてみました。

IP-Adapterは画像をプロンプトのように扱うモデルです。画像をモデルに与えることで生成画像を制御します。

冒頭の画像は左の人物に対してサングラスをかけるように指示を出して作成した画像(右側)です。

環境

Windows 11
CUDA 11.7
Python 3.11.5

Python環境構築

pip install torch==2.0.1+cu117 --index-url https://download.pytorch.org/whl/cu117
pip install diffusers[torch]
pip install transformers

リポジトリのクローンとモデルのダウンロード

git clone https://github.com/tencent-ailab/IP-Adapter



こちらから「sdxl_models」フォルダ以下をダウンロードして「IP-Adapter」フォルダ内に保存します。

実行

イメージのみ(プロンプトなし)

Pythonスクリプト

import os
import torch
from diffusers import StableDiffusionXLPipeline
from diffusers.utils import load_image

from ip_adapter import IPAdapterXL

base_model_path = "model/firsttunnerxl_v10_ema"

pipe = StableDiffusionXLPipeline.from_pretrained(
    base_model_path,
    torch_dtype=torch.float16
    )

ip_model = IPAdapterXL(
    pipe,
    image_encoder_path="sdxl_models/image_encoder",
    ip_ckpt="sdxl_models/ip-adapter_sdxl.bin",
    device="cuda"
    )

ref_image = load_image("image/woman.png").resize((512, 512))

os.makedirs("results", exist_ok=True)
scale = 0.6
image = ip_model.generate(
    pil_image=ref_image, 
    num_samples=1,  #default: 4
    scale=scale,    #default: 1.0
    num_inference_steps=30,
    seed=420
    )[0]

image.save(f"results/scale{scale}.png")

結果

一番左が元画像です。右3枚が今回作成した画像です。
左からscaleを0.6→0.8→1.0と変更しています。

一応同一人物が描かれるはずですが結果は微妙かもしれません。

イメージ+プロンプト

Pythonスクリプト

import os
import torch
from diffusers import StableDiffusionXLPipeline
from diffusers.utils import load_image

from ip_adapter import IPAdapterXL

base_model_path = "model/firsttunnerxl_v10_ema"

pipe = StableDiffusionXLPipeline.from_pretrained(
    base_model_path,
    torch_dtype=torch.float16
    )

ip_model = IPAdapterXL(
    pipe,
    image_encoder_path="sdxl_models/image_encoder",
    ip_ckpt="sdxl_models/ip-adapter_sdxl.bin",
    device="cuda"
    )

ref_image = load_image("image/woman.png").resize((512, 512))

os.makedirs("results", exist_ok=True)
scale = 0.6
image = ip_model.generate(
    pil_image=ref_image, 
    num_samples=1,  #default: 4
    scale=scale,    #default: 1.0
    num_inference_steps=30,
    seed=420,
    prompt="best quality, high quality, wearing sunglasses"
    )[0]

image.save(f"results/scale{scale}.png")

結果

元画像の女性にサングラスをかけさせてみました。

scaleは0.6にしています。それ以上だとうまくいきませんでした。

TODO

ControlNetあるいはT2I-Adapterと組み合わせて同一人物の異なる姿勢を作成する時に威力を発揮しそうです。

それに関してはまた今度試してみようと思います。


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