ジャコ Lab

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

T2I-Adapter を使ってみる

github.com

この記事では diffusers v0.19.0T2I Adapter について試していこうと思います。T2I Adapter は Text-to-Image の アダプター という感じでしょう。

ザックリ言うと ControlNet みたいなもの っぽいです。

SDXLとかAutoPipelineはこのバージョンで登場したのかぁ

T2I Adapter とは

huggingface.co

Text-to-Image Generation with Adapter Conditioning

と記載のある通り、 プロンプト に加えて アダプター を付け替えて条件付けする感じと思います。

T2I-Adapter vs ControlNet

T2I-Adapter vs ControlNet という見出しがある通り、やっぱり ControlNet みたいなものみたいです。

T2I-Adapter is similar to ControlNet. T2I-Adapter uses a smaller auxiliary network which is only run once for the entire diffusion process. However, T2I-Adapter performs slightly worse than ControlNet.

Google 翻訳によると T2I アダプターは ControlNet に似ています。 T2I アダプターは、拡散プロセス全体で 1 回だけ実行される小規模な補助ネットワークを使用します。 ただし、T2I-Adapter のパフォーマンスは ControlNet よりわずかに劣ります。

とのことです。

Model Type Model Parameters Storage (fp16)
ControlNet-SDXL 1251 M 2.5 GB
ControlLoRA (with rank 128) 197.78 M (84.19% reduction) 396 MB (84.53% reduction)
T2I-Adapter-SDXL 79 M (93.69% reduction) 158 MB (94% reduction)

この表は T2I-Adapter SDXL ですが、こんなに軽いよ!ってのがわかります。

ControlNet より軽いけど少し劣るよ!ってことかしら?

利用可能なアダプター

SD 1.4 向け
・TencentARC/t2iadapter_canny_sd14v1
・TencentARC/t2iadapter_color_sd14v1
・TencentARC/t2iadapter_depth_sd14v1
・TencentARC/t2iadapter_keypose_sd14v1
・TencentARC/t2iadapter_openpose_sd14v1
・TencentARC/t2iadapter_seg_sd14v1
・TencentARC/t2iadapter_sketch_sd14v1
SD 1.5 向け
・TencentARC/t2iadapter_canny_sd15v2
・TencentARC/t2iadapter_depth_sd15v2
・TencentARC/t2iadapter_sketch_sd15v2
・TencentARC/t2iadapter_zoedepth_sd15v1
SDXL 1.0 向け
・TencentARC/t2i-adapter-lineart-sdxl-1.0
・TencentARC/t2i-adapter-sketch-sdxl-1.0
・TencentARC/t2i-adapter-canny-sdxl-1.0
・TencentARC/t2i-adapter-depth-zoe-sdxl-1.0
・TencentARC/t2i-adapter-depth-midas-sdxl-1.0
・TencentARC/t2i-adapter-openpose-sdxl-1.0

diffusers 向けではないものは TencentARC/T2I-Adapter こちらにあるようです。

Color Adapter を使ってみる

Color Adapter に必要なものは カラーパレット画像 のようです。このパターンは ControlNet にはありませんでしたね。

投入画像(カラーパレット画像)の準備

from diffusers.utils import load_image
from PIL import Image

# 元画像
init_image_url = "https://huggingface.co/datasets/diffusers/docs-images/resolve/main/t2i-adapter/color_ref.png"
init_image = load_image(init_image_url)

# カラーパレット画像
color_palette = init_image.resize((8, 8))
color_palette = color_palette.resize((512, 512), resample=Image.Resampling.NEAREST)
元画像を 8x8 にギュッとしたものを 512x512 にビヨーンと戻してドット化するようです

アダプターとパイプラインの準備

import torch
from diffusers import StableDiffusionAdapterPipeline, T2IAdapter

# アダプターの準備
adapter = T2IAdapter.from_pretrained(
    "TencentARC/t2iadapter_color_sd14v1",
    torch_dtype=torch.float16
)

# パイプラインの準備
pipe = StableDiffusionAdapterPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4",
    adapter=adapter,
    torch_dtype=torch.float16,
).to("cuda")
ControlNetModel の代わりに T2IAdapter を使用
StableDiffusionControlNetPipeline の代わりに StableDiffusionAdapterPipeline を使用

パイプラインを実行

from diffusers.utils import make_image_grid

# パイプラインの実行
prompt = "At night, glowing cubes in front of the beach"
image = pipe(
    prompt,
    image=color_palette,
    generator=torch.Generator("cuda").manual_seed(7),
).images[0]

# 出力結果
make_image_grid([init_image, color_palette, image], rows=1, cols=3)

実行結果

(左) 元画像 | (中) カラーパレット画像 | (右) 出力結果

無事使えました!

おまけ (SD1.5 でやってみた)

SD1.5 で出力した結果

Adapter は 1.4、Pipeline は 1.5、一応使えるのかな?

まとめ

ControlNet 以外のアプローチでも「制御画像(ここではカラーパレット画像)」を使用して、制御画像に近しい画像を出力できることがわかりました。