無事に 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 の顔に似ているキャラクターが生成されました。