はじめに
前回の続きです。touch-sp.hatenablog.com
InstantStyleというモデルを使っています。
github.com
できることが色々あるようですが今回はInpaintモデルを使用して背景を変更してみます。
用意した画像
サンプルにある画像をそのまま使わせてもらいました。以下の2枚を使っています。目的
犬の画像の背景をスタイル画像に近づくように変更します。マスク画像
犬の画像からマスク画像を作成する必要があります。今回は「Matte-Anything」を使ってマスク画像を作成しました。(最終的に白黒反転させています)しっぽの部分は含めていません。「Matte-Anything」の使い方はこちらを見て下さい。
結果
方法が3つ紹介されているのですべて実行してみました。target_blocks=["block"](for original IP-Adapter)
target_blocks=["up_blocks.0.attentions.1"](for style blocks only)
target_blocks=["up_blocks.0.attentions.1", "down_blocks.2.attentions.1"](for style+layout blocks)
Pythonスクリプト
import torch from diffusers import StableDiffusionXLInpaintPipeline from PIL import Image from ip_adapter import IPAdapterXL base_model_path = "diffusers/stable-diffusion-xl-1.0-inpainting-0.1" image_encoder_path = "sdxl_models/image_encoder" ip_ckpt = "sdxl_models/ip-adapter_sdxl.bin" device = "cuda" # load SDXL pipeline pipe = StableDiffusionXLInpaintPipeline.from_pretrained( base_model_path, torch_dtype=torch.float16, variant="fp16", use_safetensors=True, ) pipe.enable_vae_tiling() target_blocks_list = [ ["block"], # for original IP-Adapter ["up_blocks.0.attentions.1"], #for style blocks only ["up_blocks.0.attentions.1", "down_blocks.2.attentions.1"] # for style+layout blocks ] image = "./assets/4.jpg" image = Image.open(image) image.resize((512, 512)) init_image = Image.open("./assets/overture-creations-5sI6fQgYIuo.png").convert("RGB") mask_image = Image.open("./assets/matt_inverse.png").convert("RGB") for i in range(3): ip_model = IPAdapterXL( pipe, image_encoder_path, ip_ckpt, device, target_blocks=target_blocks_list[i] ) images = ip_model.generate( pil_image=image, prompt="a dog sitting on, masterpiece, best quality, high quality", negative_prompt= "text, watermark, lowres, low quality, worst quality, deformed, glitch, low contrast, noisy, saturation, blurry", scale=2.0, guidance_scale=8, num_samples=1, num_inference_steps=30, image=init_image, mask_image=mask_image, strength=0.99 ) images[0].save(f"matt_result_{i}.png")