ジャコ Lab

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

IP-Adapter の GitHub リポジトリから ip_adapter-full-face_demo の生成を試してみる (2)

早速前回の続きをやっていきます。

前回の記事

今回は、IP-Adapter に利用する画像は同じものを使用し、
プロンプトの変更モデルの変更 のみで、顔の雰囲気を維持したまま異なる絵を生成します。

デモケース2

このケースでは、プロンプトのみを変更して顔の雰囲気を維持した別人を生成します。
※ IP-Adapter のスケール値も多少変更します

インプットに使用する女性の顔画像
インプットに使用する女性の顔画像

生成物の期待値
生成物の期待値

モデル等をロードする

import torch
from diffusers import AutoencoderKL, StableDiffusionPipeline, DDIMScheduler

# VAE をロードする
vae = AutoencoderKL.from_pretrained(
    "stabilityai/sd-vae-ft-mse"
).to(dtype=torch.float16)

# SD1.5系モデルをロードする
pipe = StableDiffusionPipeline.from_pretrained(
    "SG161222/Realistic_Vision_V4.0_noVAE",
    torch_dtype=torch.float16,
    vae=vae
).to("cuda")

# スケジューラを設定する
pipe.scheduler = DDIMScheduler.from_config(
    pipe.scheduler.config,
)

# IP-Adapter をロードする
pipe.load_ip_adapter(
    "h94/IP-Adapter",
    subfolder="models",
    weight_name="ip-adapter-full-face_sd15.bin"
)
pipe.set_ip_adapter_scale(0.4) # ここの数値だけ前回と異なります

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

from diffusers.utils import load_image

# IP-Adapter 用の画像をロードする
ip_adapter_image_url = "https://raw.githubusercontent.com/tencent-ailab/IP-Adapter/main/assets/images/ai_face2.png"
ip_adapter_image = load_image(ip_adapter_image_url)
ip_adapter_image = ip_adapter_image.resize((256, 256))
ここは全く一緒

プロンプトを実行する

# シードを設定する
generator = torch.Generator(device="cuda")
generator.manual_seed(42)

# パイプラインを実行する
prompt = "A photo of Einstein wearing colorful casual shirt in a garden" # ここだけ前回と異なります
images = pipe(
    prompt,
    ip_adapter_image=ip_adapter_image,
    num_images_per_prompt=4,
    num_inference_steps=50,
    width=512,
    height=704,
    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")

庭でカラフルなカジュアルシャツを着たアインシュタインの写真1庭でカラフルなカジュアルシャツを着たアインシュタインの写真2庭でカラフルなカジュアルシャツを着たアインシュタインの写真3庭でカラフルなカジュアルシャツを着たアインシュタインの写真4
庭でカラフルなカジュアルシャツを着たアインシュタインの写真

インプットした女性の雰囲気を維持したアインシュタイン

期待値と同じような画像ができました

デモケース3

このケースでは、モデルをアニメキャラ系のモデルに変更します。 ※プロンプトは最初の女性に戻します

インプットに使用する女性の顔画像
インプットに使用する女性の顔画像

生成物の期待値
生成物の期待値

モデル等のロード

import torch
from diffusers import AutoencoderKL, StableDiffusionPipeline, DDIMScheduler

# VAE をロードする
vae = AutoencoderKL.from_pretrained(
    "stabilityai/sd-vae-ft-mse"
).to(dtype=torch.float16)

# SD1.5系モデルをロードする
pipe = StableDiffusionPipeline.from_pretrained(
    "dreamlike-art/dreamlike-anime-1.0",  # 今回はここが異なります
    torch_dtype=torch.float16,
    vae=vae,
).to("cuda")

# スケジューラを設定する
pipe.scheduler = DDIMScheduler.from_config(
    pipe.scheduler.config,
)

# IP-Adapter をロードする
pipe.load_ip_adapter(
    "h94/IP-Adapter",
    subfolder="models",
    weight_name="ip-adapter-full-face_sd15.bin"
)
pipe.set_ip_adapter_scale(0.6)  # ここもちょっと違う

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

from diffusers.utils import load_image

# IP-Adapter 用の画像をロードする
ip_adapter_image_url = "https://raw.githubusercontent.com/tencent-ailab/IP-Adapter/main/assets/images/ai_face2.png"
ip_adapter_image = load_image(ip_adapter_image_url)
ip_adapter_image = ip_adapter_image.resize((256, 256))
ここは全く一緒

パイプラインを実行する

# シードを設定する
generator = torch.Generator(device="cuda")
generator.manual_seed(42)

# パイプラインを実行する
prompt = "A photo of a girl wearing a black dress, holding red roses in hand, upper body, behind is the Eiffel Tower"
images = pipe(
    prompt,
    ip_adapter_image=ip_adapter_image,
    num_images_per_prompt=4,
    num_inference_steps=50,
    width=512,
    height=704,
    generator=generator,
).images
ここは前回のデモケース1と全く同じ

実行結果

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

アニメキャラバージョン:黒いドレスを着て、赤いバラを手に持った女の子の上半身、後ろにエッフェル塔がある写真1アニメキャラバージョン:黒いドレスを着て、赤いバラを手に持った女の子の上半身、後ろにエッフェル塔がある写真2アニメキャラバージョン:黒いドレスを着て、赤いバラを手に持った女の子の上半身、後ろにエッフェル塔がある写真3アニメキャラバージョン:黒いドレスを着て、赤いバラを手に持った女の子の上半身、後ろにエッフェル塔がある写真4
アニメキャラバージョン:黒いドレスを着て、赤いバラを手に持った女の子の上半身、後ろにエッフェル塔がある写真

おお~、顔の雰囲気が維持されてます!

まとめ

IP-Adapter の Face Model の旨味が強く出た感じがします!