ジャコ Lab

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

diffusers で GLIGEN を試してみる (2) - 文字列の代わりに画像でキャプションする

zako-lab929.hatenablog.com

前回の記事では StableDiffusionGLIGENPipeline を用いて diffusers で GLIGEN (Grounded Language-to-Image GENeration) を試しました。GLIGEN は、バウンディングボックスとキャプションを用いて、枠に意味を持たせて Text-to-Image をするものでした。

この記事では StableDiffusionGLIGENTextImagePipeline を用いて、文字列によるキャプションの代わりに画像によるキャプションを試してみます。

はじめに

前回利用したモデルは以下になります。

前回利用したモデル
・masterful/gligen-1-4-generation-text-box
・masterful/gligen-1-4-inpainting-text-box
今回利用するモデル
・anhnct/Gligen_Text_Image
・anhnct/Gligen_Inpainting_Text_Image

huggingface.co

Grounded Inpainting

モデルのロード等 (StableDiffusionGLIGENTextImagePipeline)

import torch
from diffusers import StableDiffusionGLIGENTextImagePipeline

# パイプラインの準備
pipe = StableDiffusionGLIGENTextImagePipeline.from_pretrained(
    "anhnct/Gligen_Inpainting_Text_Image",
    torch_dtype=torch.float16
).to("cuda")

Inpainting 元の画像や枠の準備

from diffusers.utils import load_image

# 元画像
init_image_url = "https://hf.co/datasets/huggingface/documentation-images/resolve/main/diffusers/gligen/livingroom_modern.png"
init_image = load_image(init_image_url)

# 枠の準備と設定
boxes = [[0.2676, 0.4088, 0.4773, 0.7183]]
phrases = None
gligen_image_url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/gligen/backpack.jpeg"
gligen_image = load_image(gligen_image_url)
phrases が見ての通り None になっています

Inpaint 元になる部屋GLIGEN で用いるリュック
(左) Inpaint 元の画像 | (右) GLIGEN 用画像

パイプライン実行

from diffusers.utils import make_image_grid

# パイプラインの実行
prompt = "a backpack"
image = pipe(
    prompt=prompt,
    gligen_phrases=phrases,
    gligen_inpaint_image=init_image,
    gligen_boxes=boxes,
    gligen_images=[gligen_image],
    gligen_scheduled_sampling_beta=1,
).images[0]

# 実行結果
make_image_grid([init_image, gligen_image, image], rows=1, cols=3)
gligen_phrases には None になっている phrases が入り、
gligen_images には「青いリュック」の画像が入りました。

実行結果

置物が青いリュックに置き換わった部屋
GLIGENTextImagePipeline で生成された画像

矩形の確認

キャプション付きの矩形を可視化キャプション付きの矩形を可視化
キャプション付きの矩形を可視化したもの

Grounded Generation (1)

モデルのロード等

import torch
from diffusers import StableDiffusionGLIGENTextImagePipeline

# パイプラインの準備
pipe = StableDiffusionGLIGENTextImagePipeline.from_pretrained(
    "anhnct/Gligen_Text_Image",
    torch_dtype=torch.float16
).to("cuda")

枠の準備と設定

from diffusers.utils import load_image

# 枠の設定
boxes = [[0.0, 0.09, 0.53, 0.76]]
phrases = ["flower"]
gligen_image_url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/gligen/pexels-pixabay-60597.jpg"
gligen_image = load_image(gligen_image_url)
phrases にキーワードが入ったので画像に更に補足できそうな感じ

GLIGEN 用の花
GLIGEN 用の画像

パイプライン実行

from diffusers.utils import make_image_grid

# パイプラインの実行
prompt = "a flower sitting on the beach"
image = pipe(
    prompt=prompt,
    gligen_phrases=phrases,
    gligen_images=[gligen_image],
    gligen_boxes=boxes,
    gligen_scheduled_sampling_beta=1
).images[0]

# 実行結果
make_image_grid([gligen_image, image], rows=1, cols=2)

実行結果

生成されたビーチにある花
GLIGENTextImagePipeline で生成された画像

矩形の確認

キャプション付きの矩形を可視化したもの
キャプション付きの矩形を可視化したもの

まとめ

キャプションは文字列だけでなく、画像も可能ということがわかりました。

もう1つ使用例があったのですが、やや理解が難しかったので次回の記事で再度まとめることにしました!