【悪用厳禁】IP-Adapter と ControlNet と Inpaint を組み合わせて顔を入れ替える

はじめに

以前ControlNet と Inpaintを組み合わせて使用したことがあります。
touch-sp.hatenablog.com
今回はさらにIP-AdapterのFaceモデルを組み合わせて写真の顔を入れ替えてみます。

SD1.5を使って同じようなことをこちらでやっています。
touch-sp.hatenablog.com
今回はSDXLを使用します。ControlNetを使っているのも前回との違いです。

元画像


元画像はぱくたそから使わせて頂きました。
こちらの画像です。

左から元画像、zoe-depth画像、マスク画像です。

目的

写真に写る人物をこちらの人物に変えてみます。

結果


なんとなく合成感が残ってしまいました。

Pythonスクリプト

import torch 
from diffusers.utils import load_image
from diffusers import ControlNetModel, StableDiffusionXLControlNetInpaintPipeline    
from transformers import CLIPVisionModelWithProjection, CLIPImageProcessor

image_encoder = CLIPVisionModelWithProjection.from_pretrained(
    "IP-Adapter", 
    subfolder="models/image_encoder",
    torch_dtype=torch.float16,
).to("cuda")

controlnet = ControlNetModel.from_pretrained(
    "controlnet/controlnet-zoe-depth-sdxl-1.0",
    torch_dtype=torch.float16
).to("cuda")

pipe = StableDiffusionXLControlNetInpaintPipeline.from_pretrained(
    "model/fudukiMix_v20", 
    controlnet=controlnet,
    image_encoder=image_encoder,
    torch_dtype=torch.float16,
    variant="fp16"
).to("cuda")

pipe.load_ip_adapter(
  "IP-Adapter", 
  subfolder="sdxl_models", 
  weight_name="ip-adapter-plus-face_sdxl_vit-h.safetensors"
)
pipe.set_ip_adapter_scale(0.7)

init_image = load_image("girl.jpg")
controlnet_image = load_image("depth_zoe.png").resize((1024, 1024))

mask_image = load_image("girl_mask.png")
blurred_mask = pipe.image_processor.blur(mask_image, blur_factor=48)

ipadapter_image = load_image("face.png")
feature_extractor = CLIPImageProcessor.from_pretrained("laion/CLIP-ViT-H-14-laion2B-s32B-b79K")
ipadapter_image = feature_extractor(ipadapter_image, return_tensors="pt").pixel_values
ipadapter_image.to(device="cuda", dtype=torch.float16)

prompt = "beautiful japanese woman with smile"
negative_prompt = "worst quality, low quality"

strength=0.95
controlnet_conditioning_scale = 0.45

seed = 0
generator = torch.manual_seed(seed)
image = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    image=init_image,
    mask_image=blurred_mask,
    control_image=controlnet_image,
    ip_adapter_image=ipadapter_image,
    controlnet_conditioning_scale=controlnet_conditioning_scale,
    strength=strength,
    generator=generator
).images[0]

image.save(f"result_{seed}.png")





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