【PhotoMaker】人物写真をカスタマイズできる PhotoMaker を使ってみました。

github.com

はじめに

「PhotoMaker」をつかえば色々人物写真をカスタマイズできるようですが、今回は1枚の写真から同一人物の写真を作成してみます。

以前「IP-Adapter」を使って同様のことをしています。
touch-sp.hatenablog.com
touch-sp.hatenablog.com

用意した画像

用意した画像は1枚だけです。

「fudukiMix_v2.0」を使って作成したものです。

結果

ベストと思われるのがこちらです。

prompt: A photo of a woman img, frontal face, purple sunset, best quality

似ているでしょうか?
似ていると言えば似ていますし、微妙といえば微妙です。

方法

以下のPythonスクリプトを実行すれば画像が作成されます。

import torch
import os
from diffusers.utils import load_image
from diffusers import DPMSolverMultistepScheduler
from photomaker.pipeline import PhotoMakerStableDiffusionXLPipeline

pipe = PhotoMakerStableDiffusionXLPipeline.from_pretrained(
    "model/fudukiMix_v20",
    torch_dtype=torch.bfloat16, 
    use_safetensors=True, 
    variant="fp16"
).to("cuda")

pipe.load_photomaker_adapter(
    "weights",
    subfolder="",
    weight_name="photomaker-v1.bin",
    trigger_word="img"
)     

pipe.scheduler = DPMSolverMultistepScheduler.from_config(
    pipe.scheduler.config,
    algorithm_type="sde-dpmsolver++",
    use_karras_sigmas=True
)

'''
pipe.load_lora_weights("lora/xl_more_art-full_v1.safetensors", adapter_name="xl_more_art-full")
pipe.set_adapters(["photomaker", "xl_more_art-full"], adapter_weights=[1.0, 0.5])
pipe.fuse_lora()
'''

input_folder_name = "./examples/girl_image"
image_basename_list = os.listdir(input_folder_name)
image_path_list = sorted([os.path.join(input_folder_name, basename) for basename in image_basename_list])

input_id_images = []
for image_path in image_path_list:
    input_id_images.append(load_image(image_path))

prompt = "A photo of a woman img, frontal face, purple sunset, best quality"
negative_prompt = "worst quality, low quality, illustration, 3d, 2d, painting, cartoons, sketch, grayscale"
generator = torch.manual_seed(2024)
gen_image = pipe(
    prompt=prompt,
    input_id_images=input_id_images,
    negative_prompt=negative_prompt,
    num_images_per_prompt=1,
    num_inference_steps=35,
    start_merge_step=10,
    generator=generator,
).images[0]
gen_image.save('out_photomaker.png')

画像の指定はフォルダで行います。
複数の画像を入力できるということです。

まずは普通に実行

用意した1枚の画像のみを使って実行した時の結果がこちらです。

まずまず?

StyleGAN3を使って画像を拡張

複数の画像を入力に使えるので、StyleGAN3を使って画像を拡張してみました。

拡張の時点で元画像から遠ざかっているかもしれません。

結果はこちらです。

完全に失敗です。

StyleGAN3の使い方はこちら

SadTalkerを使って画像を拡張

SadTalkerでも画像を拡張してみました。



結果はこちらです。

いちばん良いような気がします。

SadTalkerの使い方はこちら

SadTalkerでの画像拡張を使って「start_merge_step」というパラメーターを変化させてみました。

左から 5→10→15→20 です。

「start_merge_step=5」をベストとして冒頭に載せています。

Python環境構築

pip install torch==2.1.2+cu118 torchvision==0.16.2+cu118 --index-url https://download.pytorch.org/whl/cu118
pip install git+https://github.com/huggingface/diffusers
pip install transformers spaces numpy accelerate omegaconf peft
pip install git+https://github.com/TencentARC/PhotoMaker

さいごに

「PhotoMaker」でできることはほかにも色々あります。

今後ためしてみようと思います。


このエントリーをはてなブックマークに追加