【Diffusers】Diffusers から IP-Adapter FaceID が使えるようになりました。

はじめに

タイトルにある通りです。

Diffusersから直接使う場合、環境構築が非常に楽になります。

「FaceID-Plus」と「FaceID-PlusV2」については別記事にしています。
touch-sp.hatenablog.com

PC環境

Windows 11
CUDA 11.8
Python 3.11

Python環境構築

pip install torch==2.1.2+cu118 --index-url https://download.pytorch.org/whl/cu118
pip install git+https://github.com/huggingface/diffusers
pip install accelerate transformers
pip install onnxruntime-gpu insightface

結果

用意した画像

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

今回作成した画像


用意した画像

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

今回作成した画像


Pythonスクリプト

import diffusers
diffusers.utils.USE_PEFT_BACKEND = False
import torch
from diffusers.utils import load_image
import cv2
import numpy as np
from diffusers import DiffusionPipeline, AutoencoderKL, DDIMScheduler
from insightface.app import FaceAnalysis

noise_scheduler = DDIMScheduler(
    num_train_timesteps=1000,
    beta_start=0.00085,
    beta_end=0.012,
    beta_schedule="scaled_linear",
    clip_sample=False,
    set_alpha_to_one=False,
    steps_offset=1,
)
vae = AutoencoderKL.from_single_file(
    "vae/vae-ft-mse-840000-ema-pruned.safetensors",
    torch_dtype=torch.float16
)
pipeline = DiffusionPipeline.from_pretrained(
    "model/Realistic_Vision_V4.0_noVAE",
    torch_dtype=torch.float16,
    scheduler=noise_scheduler,
    vae=vae,
    custom_pipeline="ip_adapter_face_id"
)
pipeline.load_ip_adapter_face_id("IP-Adapter-FaceID", "ip-adapter-faceid_sd15.bin")
pipeline.to("cuda")

image = load_image("https://cdn-ak.f.st-hatena.com/images/fotolife/t/touch-sp/20231111/20231111140233.png")
app = FaceAnalysis(name="buffalo_l", providers=['CUDAExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))
image = cv2.cvtColor(np.asarray(image), cv2.COLOR_BGR2RGB)
faces = app.get(image)
image_embeds = torch.from_numpy(faces[0].normed_embedding).unsqueeze(0)

generator = torch.manual_seed(42)
num_images=2

images = pipeline(
    prompt="A photo of a girl wearing a black dress, upper body, behind is the Eiffel Tower",
    image_embeds=image_embeds,
    negative_prompt="monochrome, lowres, bad anatomy, worst quality, low quality", 
    num_inference_steps=30,
    num_images_per_prompt=num_images,
    width=512,
    height=704, 
    generator=generator
).images

for i in range(num_images):
    images[i].save(f"result{i}.png")




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