ジャコ Lab

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

IP-Adapter の基本形(General Tasks)を SD1.5 版でやってみる

前回、チャレンジして Text-to-Image , Image-to-Image , Inpaint 全てにおいてメモリ不足によるクラッシュが発生しました。

原因としては、サンプルコードが SDXL 系の IP-Adapter となっており、パイプラインを実行する以前に IP-Adapter のロードを突破することができませんでした。

そこで、SDXL 系ではなく SD1.5 系に置き換えて実行してみようと思います。

Text-to-Image

stabilityai/stable-diffusion-xl-base-1.0ip-adapter_sdxl.bin の2つをロードすることが叶いませんでした。

runwayml/stable-diffusion-v1-5ip-adapter_sd15.bin に置き換えます。

モデル等をロード (SD1.5, IP-Adapter)

import torch
from diffusers import AutoPipelineForText2Image

# SD1.5系のモデルをロードする
pipe = AutoPipelineForText2Image.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    torch_dtype=torch.float16
).to("cuda")

# IP-Adapter をロードする
pipe.load_ip_adapter(
    "h94/IP-Adapter",
    subfolder="models",
    weight_name="ip-adapter_sd15.bin"
)
pipe.set_ip_adapter_scale(0.6)

IP-Adapter に使用する画像をロード

from diffusers.utils import load_image

# IP-Adapter に使用する画像をロードする
ip_adapter_image_url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ip_adapter_diner.png"
ip_adapter_image = load_image(ip_adapter_image_url)

パイプラインを実行

import torch

# シードの設定
generator = torch.Generator(device="cpu").manual_seed(0)

# プロンプト実行
prompt="a polar bear sitting in a chair drinking a milkshake"
negative_prompt="deformed, ugly, wrong proportion, low res, bad anatomy, worst quality, low quality"
image = pipe(
    prompt,
    negative_prompt=negative_prompt,
    ip_adapter_image=ip_adapter_image,
    generator=generator,
).images[0]

実行結果

from datetime import datetime
from zoneinfo import ZoneInfo

# Asia/Tokyo タイムゾーンの現在時刻を YYYYMMDDhhmmss 形式で得る
formattedNow = datetime.now(tz=ZoneInfo("Asia/Tokyo")).strftime("%Y%m%d%H%M%S")

# 実行結果
image.save(f"image_{formattedNow}_{generator.initial_seed()}.png") 

IP-Adapter に利用する画像生成された画像
(左) IP-Adapter 用画像 | (右) 出力画像

うーん。。。しろくま居ませんね。

期待値(SDXL版)

期待していた出力画像
期待していた出力結果

こういう感じの出力結果を期待していたんですけどね。

シードガチャをやってみる

10枚ほどやってみましたがしろくま現れずでした

Image-to-Image

モデル等をロード (SD1.5, IP-Adapter)

ここは Text-to-Image と変わらず
import torch
from diffusers import AutoPipelineForText2Image

# SD1.5系のモデルをロードする
pipe = AutoPipelineForText2Image.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    torch_dtype=torch.float16
).to("cuda")

# IP-Adapter をロードする
pipe.load_ip_adapter(
    "h94/IP-Adapter",
    subfolder="models",
    weight_name="ip-adapter_sd15.bin"
)
pipe.set_ip_adapter_scale(0.6)

IP-Adapter に使用する画像をロード

from diffusers.utils import load_image

# インプット画像のロード
input_image_url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ip_adapter_bear_1.png"
input_image = load_image(input_image_url)

# IP-Adapter に使用する画像をロードする
ip_adapter_image_url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ip_adapter_bear_2.png"
ip_adapter_image = load_image(ip_adapter_image_url)

パイプラインを実行

import torch

# シードの設定
generator = torch.Generator(device="cpu").manual_seed(4)

# パイプライン実行
prompt = "best quality, high quality"
image = pipe(
    prompt,
    image=input_image,
    ip_adapter_image=ip_adapter_image,
    generator=generator,
    strength=0.6,
).images[0]

実行結果

from datetime import datetime
from zoneinfo import ZoneInfo

# Asia/Tokyo タイムゾーンの現在時刻を YYYYMMDDhhmmss 形式で得る
formattedNow = datetime.now(tz=ZoneInfo("Asia/Tokyo")).strftime("%Y%m%d%H%M%S")

# 実行結果
image.save(f"image_{formattedNow}_{generator.initial_seed()}.png")

入力に使用する画像IP-Adapter に利用する画像生成された画像
(左) 入力画像 | (中) IP-Adapter 用画像 | (右) 生成画像

しろくまの面影無し!

期待値(SDXL版)

期待していた出力画像
期待していた出力結果

しろくまの輪郭がある...

一応シードガチャ

Text-to-Image に同じくしろくま現れず

Inpainting

もう期待値が低い...

モデル等をロード (SD1.5, IP-Adapter)

from diffusers import AutoPipelineForInpainting
import torch

# SD1.5系のモデルをロードする
pipe = AutoPipelineForInpainting.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    torch_dtype=torch.float16
).to("cuda")

# IP-Adapter をロードする
pipe.load_ip_adapter(
    "h94/IP-Adapter",
    subfolder="models",
    weight_name="ip-adapter_sd15.bin"
)
pipe.set_ip_adapter_scale(0.6)

IP-Adapter に使用する画像をロード

from diffusers.utils import load_image

# インプット画像をロードする
input_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ip_adapter_bear_1.png")

# マスク画像をロードする
mask_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ip_adapter_mask.png")

# IP-Adapter に使用する画像をロードする
ip_adapter_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ip_adapter_gummy.png")
Inpaint は数が多いなぁ

パイプラインを実行

import torch

# シードの設定
generator = torch.Generator(device="cpu").manual_seed(4)

# パイプラインの実行
prompt = "a cute gummy bear waving"
image = pipe(
    prompt,
    image=input_image,
    mask_image=mask_image,
    ip_adapter_image=ip_adapter_image,
    generator=generator,
    num_inference_steps=100,
).images[0]

実行結果

from datetime import datetime
from zoneinfo import ZoneInfo

# Asia/Tokyo タイムゾーンの現在時刻を YYYYMMDDhhmmss 形式で得る
formattedNow = datetime.now(tz=ZoneInfo("Asia/Tokyo")).strftime("%Y%m%d%H%M%S")

# 実行結果
image.save(f"image_{formattedNow}_{generator.initial_seed()}.png")

入力に利用する画像マスクに利用する画像IP-Adapter に利用する画像生成された画像
左から、入力画像、マスク画像、IP-Adapter用画像、生成画像

居たーーー!!品質悪いけどいたーーー!!

期待値(SDXL版)

期待していた出力結果
期待していた出力結果

流石、SDXL。。。綺麗すぎる

まとめ

IP-Adapter は SD1.5系でも十分な品質を期待できるのか不安になった
IP-Adapter では SDXL 系はロードでクラッシュしてしまうので、自分では使えることはないのではないか?と不安になった