【InstantID】IP-Adapter と ControlNet を使った顔写真のスタイル変換

github.com

目的

一枚の顔写真に対してスタイル変換を行います。

実行

準備

モデルはGitHubリポジトリに記載されている通りにダウンロードしました。

こちらから「pipeline_stable_diffusion_xl_instantid.py」をダウンロードしました。

実行

「run.py」は後述するスクリプトです。

python run.py

結果

用意した画像


結果


用意した画像


結果


用意した画像


結果


Pythonスクリプト

from diffusers.utils import load_image
from diffusers.models import ControlNetModel
import os
import cv2
import torch
import numpy as np
from insightface.app import FaceAnalysis
from pipeline_stable_diffusion_xl_instantid import StableDiffusionXLInstantIDPipeline, draw_kps

app = FaceAnalysis(name="antelopev2", root='.', providers=["CUDAExecutionProvider"])
app.prepare(ctx_id=0, det_size=(640, 640))

face_adapter = "checkpoints/ip-adapter.bin"
controlnet_path = "checkpoints/ControlNetModel"

controlnet = ControlNetModel.from_pretrained(controlnet_path, torch_dtype=torch.float16)

base_model = "pipeline/YamerMIX_v8"
pipe = StableDiffusionXLInstantIDPipeline.from_pretrained(
    base_model,
    controlnet=controlnet,
    torch_dtype=torch.float16
).to("cuda")

pipe.load_ip_adapter_instantid(face_adapter)
pipe.set_ip_adapter_scale(0.8)

image_path = "face.png"
face_image = load_image(image_path)
save_folder = f"{os.path.splitext(os.path.basename(image_path))[0]}_result"
os.makedirs(save_folder, exist_ok=True)

face_info = app.get(cv2.cvtColor(np.array(face_image), cv2.COLOR_RGB2BGR))
face_info = sorted(face_info, key=lambda x:(x['bbox'][2]-x['bbox'][0])*x['bbox'][3]-x['bbox'][1])[-1]
face_emb = face_info['embedding']
face_kps = draw_kps(face_image, face_info['kps'])

seed = 2024
negative_prompt = "lowres, low quality, worst quality, text, watermark, ugly, deformed, noisy, blurry, low contrast"

for style in ["Watercolor", "Film Noir", "Neon", "Jungle", "Mars", "Vibrant Color", "Snow", "Line art"]:

    image = pipe(
        prompt=f"{style} style, woman, high quality, best quality",
        negative_prompt=negative_prompt,
        image_embeds=face_emb,
        image=face_kps,
        controlnet_conditioning_scale=0.8,
        generator=torch.manual_seed(seed),
        width=1024,
        height=1024
    ).images[0]

    image.save(os.path.join(save_folder, f"{style}_result.png"))

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 opencv-python
pip install onnxruntime-gpu insightface





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