【Diffusers】Instruct-Pix2Pixを使ってみる(Paint-by-ExampleやInpaintingとの比較)

最終更新日:2023年2月17日

はじめに

最近公開された「Instruct-Pix2Pix」をDiffusersから使ってみました。
huggingface.co

結果

ベンチに座る犬を猫に変換してみました。



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

比較

他の方法と比較したのがこの表になります。

Pythonスクリプト

Instruct-Pix2Pix

from PIL import Image
import torch
from diffusers import StableDiffusionInstructPix2PixPipeline

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

img_fname = opt.image

image = Image.open(img_fname).convert('RGB').resize((512, 512))

pipe = StableDiffusionInstructPix2PixPipeline.from_pretrained(
    'instruct-pix2pix', 
    torch_dtype=torch.float32, 
    safety_checker=None).to("cuda")

prompt = "replace dog with cat"

n_samples = 5

for i in range(n_samples):
    image = pipe(
        prompt=prompt, 
        image=image,
        image_guidance_scale=1).images[0]

    image.save(f'result_{i}.png')

Paint-by-Example

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' )
opt = parser.parse_args()

img_fname = opt.image
mask_fname = opt.mask
example_fname = opt.example

init_image = Image.open(img_fname).convert('RGB').resize((512, 512))
mask_image = Image.open(mask_fname).convert('RGB').resize((512, 512))
example_image = Image.open(example_fname).convert('RGB').resize((512, 512))

pipe = DiffusionPipeline.from_pretrained(
    'Paint-by-Example',
    torch_dtype=torch.float32).to("cuda")

n_samples = 5

for i in range(n_samples):
    image = pipe(
        image=init_image,
        mask_image=mask_image,
        example_image=example_image).images[0]

    image.save(f'result_{i}.png')

Stable-Diffusion-2-Inpainting

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' )
opt = parser.parse_args()

img_fname = opt.image
mask_fname = opt.mask

init_image = Image.open(img_fname).convert('RGB').resize((512, 512))
mask_image = Image.open(mask_fname).convert('RGB').resize((512, 512))

pipe = DiffusionPipeline.from_pretrained(
    'stable-diffusion-2-inpainting', 
    torch_dtype=torch.float32).to("cuda")

prompt = 'cat, sitting on a park bench'

n_samples = 5

for i in range(n_samples):
    image = pipe(
        prompt=prompt,
        image=init_image,
        mask_image=mask_image).images[0]

    image.save(f'result_{i}.png')

追記

SDXLに対応したInstruct-Pix2Pixの記事はこちらになります。
touch-sp.hatenablog.com

関連記事

touch-sp.hatenablog.com
touch-sp.hatenablog.com
touch-sp.hatenablog.com