この記事では diffusers v0.19.0 の T2I Adapter について試していこうと思います。T2I Adapter は Text-to-Image の アダプター という感じでしょう。
ザックリ言うと ControlNet みたいなもの っぽいです。
T2I Adapter とは
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 ですが、こんなに軽いよ!ってのがわかります。
利用可能なアダプター
・TencentARC/t2iadapter_color_sd14v1
・TencentARC/t2iadapter_depth_sd14v1
・TencentARC/t2iadapter_keypose_sd14v1
・TencentARC/t2iadapter_openpose_sd14v1
・TencentARC/t2iadapter_seg_sd14v1
・TencentARC/t2iadapter_sketch_sd14v1
・TencentARC/t2iadapter_depth_sd15v2
・TencentARC/t2iadapter_sketch_sd15v2
・TencentARC/t2iadapter_zoedepth_sd15v1
・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)
アダプターとパイプラインの準備
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")
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 でやってみた)
まとめ
ControlNet 以外のアプローチでも「制御画像(ここではカラーパレット画像)」を使用して、制御画像に近しい画像を出力できることがわかりました。