SDXL 1.0 (Stable Diffusion XL 1.0) で Image2Image をやってみました

最終更新日:2023年8月2日

はじめに

SDXL 1.0はベースとリファイナーの2つのモデルからできています。

今回はベースモデルとリファイナーモデルでそれぞれImage2Imageをやってみました。

Text2ImageはSDXL 1.0のベースモデルを使わずに「BracingEvoMix_v1」を使っています。

SDXL 1.0の基本的な使い方はこちらを参照して下さい。
touch-sp.hatenablog.com

方法

Text2Image

from diffusers import StableDiffusionPipeline, EulerAncestralDiscreteScheduler
import torch
from compel import Compel, DiffusersTextualInversionManager

model_id = "model/BracingEvoMix_v1.safetensors"
pipe = StableDiffusionPipeline.from_single_file(
    model_id,
    load_safety_checker=False,
    extract_ema=True,
    torch_dtype=torch.float16)
pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config)
pipe.load_textual_inversion("embeddings", weight_name="EasyNegative.safetensors", token="EasyNegative")
pipe.to("cuda")

prompt = "(high resolution)++, 8k+, photorealistic+, attractive, highly detailed, photo of pretty Japanese woman, short hair"
negative_prompt = "EasyNegative, (Worst Quality)++, (low quality)+"

textual_inversion_manager = DiffusersTextualInversionManager(pipe)
compel_proc = Compel(
    tokenizer=pipe.tokenizer,
    text_encoder=pipe.text_encoder,
    textual_inversion_manager=textual_inversion_manager,
    truncate_long_prompts=False)

prompt_embeds = compel_proc([prompt])
negative_prompt_embeds = compel_proc([negative_prompt])

generator = torch.Generator(device="cuda").manual_seed(20700)
image = pipe(
    prompt_embeds=prompt_embeds,
    negative_prompt_embeds = negative_prompt_embeds,
    generator=generator,
    num_inference_steps=25,
    guidance_scale=7.0,
    width=768,
    height=768
    ).images[0]
image.save("evo.png")


この画像を使ってImage2Imageを行います。

Image2Image

strengthを0.2→0.3→0.4→0.5→0.6と変更しながら画像を作成しています。

ベースモデルを使う場合

import torch
from diffusers import AutoPipelineForImage2Image
from diffusers.utils import load_image

pipe = AutoPipelineForImage2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    variant="fp16",
    use_safetensors=True
).to("cuda")

init_image = load_image("evo.png").resize((1024, 1024))

prompt = "masterpiece, best quality, high quality, 8k, kawaii princess"
negative_prompt = "worst quality, low quality, medium quality"

strength_list = [0.2, 0.3, 0.4, 0.5, 0.6]
for strength in strength_list:
    image = pipe(
        prompt=prompt, 
        negative_prompt=negative_prompt,
        image=init_image,
        strength=strength).images[0]

    image.save(f"img2img_base_strength{strength}.png")

リファイナーモデルを使う場合

import torch
from diffusers import AutoPipelineForImage2Image
from diffusers.utils import load_image

pipe = AutoPipelineForImage2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-refiner-1.0",
    torch_dtype=torch.float16,
    variant="fp16",
    use_safetensors=True
).to("cuda")

init_image = load_image("evo.png").resize((1024, 1024))

prompt = "masterpiece, best quality, high quality, 8k, kawaii princess"
negative_prompt = "worst quality, low quality, medium quality"

strength_list = [0.2, 0.3, 0.4, 0.5, 0.6]
for strength in strength_list:
    image = pipe(
        prompt=prompt, 
        negative_prompt=negative_prompt,
        image=init_image,
        strength=strength).images[0]

    image.save(f"img2img_refiner_strength{strength}.png")

結果

上の画像がベースモデル、下の画像がリファイナーモデルを使った結果です。
左からstrengthを0.2→0.3→0.4→0.5→0.6と変更しています。


リファイナーを使った場合、strengthは0.5あたりから画像が乱れてきました。


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