【PaintByExample】写真に写った犬を猫に変えてみる

はじめに

画像生成AIでは「Stable Diffusion」などが有名ですが、他にもいろいろなモデルが存在します。

写真に写った犬を猫に変えるといった時には「PaintByExample」というのが有用です。

さっそく試してみました。

「PaintByExample」の特徴はmask画像とexample画像を用意すればprompt(呪文)を準備する必要がないことです。

目的

このように犬を猫に変えてみます。


元画像はこちらを使わせて頂きました。

方法1

単純にマスク画像と猫の画像を用意して「PaintByExample」を実行しました。
マスク画像の作り方はこちらを見て下さい。

mask画像
example画像

Pythonスクリプト

from PIL import Image
import torch
from diffusers import DiffusionPipeline

from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument('--image', type=str, help='original image' )
parser.add_argument('--mask', type=str, help='mask image' )
parser.add_argument('--example', type=str, help='example image' )
args = parser.parse_args()

original_image = args.image
mask_image = args.mask
example_image = args.example

init_image = Image.open(original_image).convert('RGB').resize((512, 512))
mask_image = Image.open(mask_image).convert('RGB').resize((512, 512))
example_image = Image.open(example_image).convert('RGB').resize((512, 512))

pipe = DiffusionPipeline.from_pretrained(
    "./Paint-by-Example",
    torch_dtype=torch.float16,
)
pipe = pipe.to("cuda")
pipe.enable_attention_slicing()

images = pipe(
    image = init_image,
    mask_image = mask_image,
    example_image = example_image,
    num_images_per_prompt = 5).images

for i, image in enumerate(images):
    image.save(f'result_{i}.jpg')

結果


大きさがバグってます(笑)。

方法2

猫が大きくなり過ぎないように少し工夫を加えました。

単純に犬を消してから猫を加えただけです。そこにも「PaintByExample」を使用しました。

mask画像
example画像
猫を消した画像

猫を消した画像を使ってもう一度「PaintByExample」を実行します。

mask画像
example画像

結果


なんとなくうまくいきました。