はじめに
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")