【InstantStyle②】Inpaintモデルを使用して背景を変更する

はじめに

前回の続きです。
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")





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