はじめに
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) のリファイナーは画質を向上させますが必ずしも元画像に忠実ではないようです。