ジャコ Lab

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

IP-Adapter FaceID が無事実行できたので Multi IP-Adapter を試してみる

無事に IP-Adapter FaceID が実行できたところで、

今回は Multi IP-Adapter を試してみます。

huggingface.co

Multi IP-Adapter を試す

各種モデルをロードする

・ベースモデル:SDXL 1.0
・スケジューラ:DDIMScheduler
・IP-Adapter:ip-adapter-plus_sdxl_vit-hip-adapter-plus-face_sdxl_vit-h

IP-Adapter Plus なので ImageEncoder も別途ロードします。

import torch
from diffusers import AutoPipelineForText2Image, DDIMScheduler
from transformers import CLIPVisionModelWithProjection

# ImageEncoderをロードする
image_encoder = CLIPVisionModelWithProjection.from_pretrained(
    "h94/IP-Adapter",
    subfolder="models/image_encoder",
    torch_dtype=torch.float16,
)

# ベースモデルをロードする
pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    image_encoder=image_encoder,
)

# スケジューラーをロードする
pipeline.scheduler = DDIMScheduler.from_config(
    pipeline.scheduler.config
)

# IP-Adapter をロードする
pipeline.load_ip_adapter(
    "h94/IP-Adapter",
    subfolder="sdxl_models",
    weight_name=["ip-adapter-plus_sdxl_vit-h.safetensors", "ip-adapter-plus-face_sdxl_vit-h.safetensors"]
)
pipeline.set_ip_adapter_scale([0.7, 0.3])

# Enable memory savings
pipeline.enable_model_cpu_offload()

IP-Adapter 用の画像をロードする

from diffusers.utils import load_image

# IP-Adapter 用の顔画像をロードする
face_image = load_image("https://huggingface.co/datasets/YiYiXu/testing-images/resolve/main/women_input.png")

# IP-Adapter 用のスタイル画像を複数枚ロードする
style_folder = "https://huggingface.co/datasets/YiYiXu/testing-images/resolve/main/style_ziggy"
style_images = [load_image(f"{style_folder}/img{i}.png") for i in range(10)]

パイプラインを実行する

import torch

# シードの設定
generator = torch.Generator(device="cpu").manual_seed(0)

# パイプラインを実行する
prompt = "wonderwoman"
negative_prompt = "monochrome, lowres, bad anatomy, worst quality, low quality"
images = pipeline(
    prompt,
    negative_prompt=negative_prompt,
    ip_adapter_image=[style_images, face_image],
    num_inference_steps=50,
    num_images_per_prompt=4,
    generator=generator,
).images

実行結果

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")
◆style_images の中身

ロードした style_images 一覧
ロードした style_images

◆face_image の中身

IP-Adapter 用の女性画像
IP-Adapter 用の女性画像

◆生成された画像

生成された女性の画像1生成された女性の画像2生成された女性の画像3生成された女性の画像4
生成された女性の画像

まとめ

ふむふむ

よくわからないけど style_images にスタイルが似ていて、
face_image の顔に似ているキャラクターが生成されました。