はじめに
画像生成AIでは「Stable Diffusion」などが有名ですが、他にもいろいろなモデルが存在します。写真に写った犬を猫に変えるといった時には「PaintByExample」というのが有用です。さっそく試してみました。「PaintByExample」の特徴はmask画像とexample画像を用意すればprompt(呪文)を準備する必要がないことです。目的
このように犬を猫に変えてみます。元画像はこちらを使わせて頂きました。
方法1
単純にマスク画像と猫の画像を用意して「PaintByExample」を実行しました。マスク画像の作り方はこちらを見て下さい。
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」を使用しました。猫を消した画像を使ってもう一度「PaintByExample」を実行します。
結果
なんとなくうまくいきました。