はじめに
以前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")