【SDXL 1.0 (Stable Diffusion XL 1.0)】生成画像の画質が良くない時はどうすれば良いか?いろいろ試してみました。

はじめに

SDXL 1.0 (Stable Diffusion XL 1.0) の派生モデルである「DreamShaper XL1.0 Alpha2」というのを使ってみました。

CIVITAIから「dreamshaperXL10_alpha2Xl10.safetensors」というファイルをダウンロードさせて頂きました。

普通にText2Imageを行うとプロンプトが不十分なのか画質が良くありませんでした。

今回は画質の向上に取り組みました。

最初は普通にText2Image

from diffusers import StableDiffusionXLPipeline, DPMSolverMultistepScheduler
import torch

pipe = StableDiffusionXLPipeline.from_single_file(
    "model/dreamshaperXL10_alpha2Xl10.safetensors",
    load_safety_checker=False,
    extract_ema=True,
    torch_dtype=torch.float16 
    )
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config, use_karras_sigmas=True)
pipe.to("cuda")

prompt = "portrait of young japanese girl, 20 years old, 8k, detailed, standing on street, smiling, plain white t-shirt, eye level angle"
negative_prompt = "worst quality, low quality"

seed = 30000
generator = torch.manual_seed(seed)
image = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    generator=generator
    ).images[0]
image.save("original.png")


あまり画質が良くありません。

画質向上

SDXLのリファイナーを使う方法

SDXL 1.0 (Stable Diffusion XL 1.0) のリファイナーを使って画質向上してみます。

3つの方法で試してみます。
それぞれの方法についての詳細はこちらこちらを参照して下さい。

方法1

from diffusers import DiffusionPipeline, StableDiffusionXLPipeline, DPMSolverMultistepScheduler
import torch

pipe = StableDiffusionXLPipeline.from_single_file(
    "model/dreamshaperXL10_alpha2Xl10.safetensors",
    load_safety_checker=False,
    extract_ema=True,
    torch_dtype=torch.float16 
    )
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config, use_karras_sigmas=True)
pipe.to("cuda")

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

n_steps = 40
high_noise_frac = 0.8

prompt = "portrait of young japanese girl, 20 years old, 8k, detailed, standing on street, smiling, plain white t-shirt, eye level angle"
negative_prompt = "worst quality, low quality"

seed = 30000
generator = torch.manual_seed(seed)
image = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=n_steps,
    denoising_end=high_noise_frac,
    output_type="latent",
    generator=generator
    ).images[0]
image = refiner(
    prompt=prompt,
    negative_prompt=negative_prompt,
    num_inference_steps=n_steps,
    denoising_start=high_noise_frac,
    image=image).images[0]
image.save("refiner_method1.png")


方法2

from diffusers import DiffusionPipeline, StableDiffusionXLPipeline, DPMSolverMultistepScheduler
import torch

pipe = StableDiffusionXLPipeline.from_single_file(
    "model/dreamshaperXL10_alpha2Xl10.safetensors",
    load_safety_checker=False,
    extract_ema=True,
    torch_dtype=torch.float16 
    )
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config, use_karras_sigmas=True)
pipe.to("cuda")

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

prompt = "portrait of young japanese girl, 20 years old, 8k, detailed, standing on street, smiling, plain white t-shirt, eye level angle"
negative_prompt = "worst quality, low quality"

seed = 30000
generator = torch.manual_seed(seed)
image = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    guidance_scale=5.0,
    generator=generator,
    output_type="latent"
    ).images[0]

image = refiner(
    prompt=prompt,
    negative_prompt=negative_prompt,
    image=image[None, :]).images[0]
image.save("refiner_method2.png")


方法3(Image2Image)

from diffusers import AutoPipelineForImage2Image, StableDiffusionXLPipeline, DPMSolverMultistepScheduler
import torch

pipe = StableDiffusionXLPipeline.from_single_file(
    "model/dreamshaperXL10_alpha2Xl10.safetensors",
    load_safety_checker=False,
    extract_ema=True,
    torch_dtype=torch.float16 
    )
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config, use_karras_sigmas=True)
pipe.to("cuda")

prompt = "portrait of young japanese girl, 20 years old, 8k, detailed, standing on street, smiling, plain white t-shirt, eye level angle"
negative_prompt = "worst quality, low quality"

seed = 30000
generator = torch.manual_seed(seed)
image = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    guidance_scale=5.0,
    generator=generator
    ).images[0]

del pipe

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

init_image = image.resize((1024, 1024))
image = refiner(
    prompt=prompt,
    negative_prompt=negative_prompt,
    image=init_image,
    strength=0.2).images[0]
image.save("refiner_img2img.png")


GFPGANを使う方法




GFPGANの使い方はこちらを見て下さい。
touch-sp.hatenablog.com

結果の比較

上が元画像です。
下が左から順に方法1、方法2、方法3、GFPGANです。




今回の例ではGFPGAN(一番右の画像)が元画像に忠実でかつきれいな印象です。

SDXL 1.0 (Stable Diffusion XL 1.0) のリファイナーは画質を向上させますが必ずしも元画像に忠実ではないようです。


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