はじめに
タイトルにある通りです。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")