【Diffusers】【StableDiffusionXLAdapterPipeline】SDXL 1.0 (Stable Diffusion XL 1.0) の T2I-Adapter が使えるようになりました

huggingface.co

はじめに

Diffusersを使わない場合の記事を以前書きました。
touch-sp.hatenablog.com
今回、DiffusersからT2I-Adapterが使えるようになったので使い方を紹介します。

方法

Canny画像から画像生成

もともとCanny画像が用意できているものとします。

ControlNetの時と違いCanny画像のモードは「L」である必要があります。

「RGB」だったりすると、読み込んだ後に「.convert("L")」を入れる必要があります。

Pythonスクリプト

import torch
from diffusers import T2IAdapter, StableDiffusionXLAdapterPipeline
from diffusers.utils import load_image

canny_image = load_image("couple.png").convert("L")

adapter = T2IAdapter.from_pretrained(
    "./t2iadapter",
    subfolder="canny_sdxl_1.0",
    torch_dtype=torch.float16,
    adapter_type="full_adapter_xl",
)

pipe = StableDiffusionXLAdapterPipeline.from_pretrained(
    "model/stable-diffusion-xl-base-1.0",
    adapter=adapter,
    torch_dtype=torch.float16,
    variant="fp16"
    ).to("cuda")

seed = 30000
generator = torch.manual_seed(seed)

image = pipe(
    prompt="a couple watching a romantic sunset, 4k photo",
    negative_prompt="worst quality, low quality",
    image=canny_image,
    generator=generator,
    adapter_conditioning_scale=1.0 # default: 1.0
    ).images[0]

image.save("t2i_result.png")

結果


Sketch画像を作成してから画像生成

線の太さによって結果がどう変わるか比較してみました。

Sketch画像はこのように作成しました。
「threshold」の値を変更するとスケッチの線の太さが変わります。

from PIL import Image
import numpy as np
from controlnet_aux import PidiNetDetector

image = Image.open("man.png")

Pidi = PidiNetDetector.from_pretrained("lllyasviel/Annotators")

threshold = 0.6
pidi_array = np.array(Pidi(image).convert("L"))
bool_array = pidi_array > (255 * threshold)
result_array = np.where(bool_array == False, 0, 255).astype(np.uint8)
result_pillow = Image.fromarray(result_array)        
result_pillow.save(f"sketch{threshold}.png")

Pythonスクリプト

import torch
from diffusers import T2IAdapter, StableDiffusionXLAdapterPipeline
from diffusers.utils import load_image

sketch_image = load_image("sketch0.6.png").convert("L")

adapter = T2IAdapter.from_pretrained(
    "t2iadapter/sketch_sdxl_1.0",
    torch_dtype=torch.float16,
    adapter_type="full_adapter_xl",
    )

pipe = StableDiffusionXLAdapterPipeline.from_pretrained(
    "model/fudukiMix_v10_ema",
    adapter=adapter,
    torch_dtype=torch.float16,
    variant="fp16"
    ).to("cuda")

seed = 20000
generator = torch.manual_seed(seed)

image = pipe(
    prompt="pretty woman watching a romantic sunset, 4k photo",
    negative_prompt="worst quality, low quality",
    image=sketch_image,
    generator=generator,
    ).images[0]

image.save("t2i_result.png")

結果




Openpose画像から画像生成

もともとOpenpose画像が用意できているものとします。

Pythonスクリプト

import torch
from diffusers import T2IAdapter, StableDiffusionXLAdapterPipeline
from diffusers.utils import load_image

pose_image = load_image("openpose.png")

adapter = T2IAdapter.from_pretrained(
    "t2iadapter/openpose_sdxl_1.0",
    torch_dtype=torch.float16,
    adapter_type="full_adapter_xl",
    )

pipe = StableDiffusionXLAdapterPipeline.from_pretrained(
    "model/fudukiMix_v10_ema",
    adapter=adapter,
    torch_dtype=torch.float16,
    variant="fp16"
    ).to("cuda")

seed = 20000
generator = torch.manual_seed(seed)

image = pipe(
    prompt="a couple watching a romantic sunset, 4k photo",
    negative_prompt="worst quality, low quality",
    image=pose_image,
    generator=generator,
    ).images[0]

image.save("t2i_result.png")

結果





このエントリーをはてなブックマークに追加