早速前回の続きをやっていきます。
前回の記事
今回は、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")
インプットした女性の雰囲気を維持したアインシュタイン
期待値と同じような画像ができました
デモケース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")
おお~、顔の雰囲気が維持されてます!
まとめ
IP-Adapter の Face Model の旨味が強く出た感じがします!