ジャコ Lab

プログラミング関連のメモ帳的ブログです

Paint-by-Example で写っているものを差し替えてみる

さて、この前 TripoSR で Image-to-3dModel をやりましたが、また過去のキャッチアップに戻ってきました。

ControlNet も色々使い Inpaint も含め色々触ってきたので、
コントロール画像やマスク画像がどういったものかわかりました。

この記事では diffusers v0.10.0 でリリースされた Pipeline の Paint-by-Example を使ってみます。

Paint-by-Example は、 ソース画像 , マスク画像 , リファレンス画像 の3つを使って画像を生成するようです。

Paint-by-Example とは

Inpaint に似ていて、Prompt の変わりにリファレンス画像を使う感じですかね?

やってみる

画像の準備

from diffusers.utils import load_image

init_image_url = "https://raw.githubusercontent.com/Fantasy-Studio/Paint-by-Example/main/examples/image/example_1.png"
mask_image_url = "https://raw.githubusercontent.com/Fantasy-Studio/Paint-by-Example/main/examples/mask/example_1.png"
example_image_url = "https://raw.githubusercontent.com/Fantasy-Studio/Paint-by-Example/main/examples/reference/example_1.jpg"

init_image = load_image(init_image_url).resize((512, 512))
mask_image = load_image(mask_image_url).resize((512, 512))
example_image = load_image(example_image_url).resize((512, 512))

(左) ソース画像 | (中) マスク画像 | (右) リファレンス画像

Pipeline の準備

import torch
from diffusers import DiffusionPipeline

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

モデルは Fantasy-Studio/Paint-by-Example を使用します。

最近ずっと ControlNet 使ってましたが、今回は不要です!

パイプライン実行

image = pipe(
    image=init_image,
    mask_image=mask_image,
    example_image=example_image
).images[0]
image

あとは実行するだけです。

Prompt 不要でimage, mask_image, example_imageの3つのみ必要です

Paint-by-Example で生成した画像

パンダがバケツに入りましたね。

おまけ

(左) ソース画像 | (中) マスク画像 | (右) リファレンス画像

出来上がったもの

出来上がった画像

バニラソフトを持たせてやりました!

まとめ

モデルの得意不得意に影響するのか、マスク画像はソフトクリームの形にしないと良いものが出来ませんでした。