無事に IP-Adapter FaceID が実行できたところで、
今回は Multi IP-Adapter を試してみます。
Multi IP-Adapter を試す
各種モデルをロードする
・ベースモデル:SDXL 1.0
・スケジューラ:DDIMScheduler
・IP-Adapter:ip-adapter-plus_sdxl_vit-hとip-adapter-plus-face_sdxl_vit-h
・スケジューラ:DDIMScheduler
・IP-Adapter:ip-adapter-plus_sdxl_vit-hとip-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 の中身

◆face_image の中身

◆生成された画像




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