Spaces:
Running
Running
from diffusers import EulerAncestralDiscreteScheduler, StableDiffusionXLPipeline, StableDiffusionXLImg2ImgPipeline | |
from PIL import Image | |
import gradio as gr | |
import random | |
import torch | |
import math | |
import spaces | |
device = "cuda" if torch.cuda.is_available() else "cpu" | |
negative_prompt = "deformed iris, deformed pupils, semi-realistic, cgi, 3d, render, sketch, cartoon, drawing, anime, text, close up, cropped, out of frame, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, mutation, deformed, blurry, dehydrated, bad anatomy, bad proportions, extra limbs, cloned face, disfigured, gross proportions, malformed limbs, missing arms, missing legs, extra arms, extra legs, fused fingers, too many fingers, long neck" | |
css = """ | |
.btn-green { | |
background-image: linear-gradient(to bottom right, #6dd178, #00a613) !important; | |
border-color: #22c55e !important; | |
color: #166534 !important; | |
} | |
.btn-green:hover { | |
background-image: linear-gradient(to bottom right, #6dd178, #6dd178) !important; | |
} | |
""" | |
def generate(prompt, samp_steps, seed, progress=gr.Progress(track_tqdm=True)): | |
print("prompt = ", prompt) | |
turbo_steps=5 # use sweet spot | |
if seed < 0: | |
seed = random.randint(1,999999) | |
image = txt2img( | |
prompt=prompt, | |
negative_prompt=negative_prompt, | |
num_inference_steps=turbo_steps, | |
guidance_scale=2, | |
seed=seed, | |
).images[0] | |
upscaled_image = image.resize((1024,1024), 1) | |
final_image = img2img( | |
prompt=prompt, | |
negative_prompt=negative_prompt, | |
image=upscaled_image, | |
num_inference_steps=max(1,samp_steps-turbo_steps*2), # always discount lightning at 2x efficiency | |
guidance_scale=5, | |
strength=1, | |
seed=seed, | |
).images[0] | |
return [final_image], seed | |
def set_base_models(): | |
txt2img = StableDiffusionXLPipeline.from_pretrained( | |
"SG161222/RealVisXL_V5.0_Lightning", | |
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32, | |
use_safetensors=True, | |
add_watermarker=False, | |
).to(device) | |
txt2img.scheduler = EulerAncestralDiscreteScheduler.from_config(txt2img.scheduler.config) | |
img2img = StableDiffusionXLImg2ImgPipeline.from_pretrained( | |
"SG161222/RealVisXL_V5.0", | |
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32, | |
use_safetensors=True, | |
add_watermarker=False, | |
).to(device) | |
img2img.scheduler = EulerAncestralDiscreteScheduler.from_config(img2img.scheduler.config) | |
return txt2img, img2img | |
with gr.Blocks(css=css) as demo: | |
with gr.Column(): | |
prompt = gr.Textbox(label="Prompt for RealVisXL_V5") | |
submit_btn = gr.Button("Generate", elem_classes="btn-green") | |
with gr.Row(): | |
turbo_steps = gr.Slider(5, 5, value=5, step=1, label="Turbo steps (fixed at 5)") | |
sampling_steps = gr.Slider(15, 50, value=25, step=1, label="Effective steps") | |
seed = gr.Number(label="Seed", value=-1, minimum=-1, precision=0) | |
lastSeed = gr.Number(label="Last Seed", value=-1, interactive=False) | |
gallery = gr.Gallery(show_label=False, preview=True, container=False, height=1100) | |
submit_btn.click(generate, [prompt, sampling_steps, seed], [gallery, lastSeed], queue=True) | |
txt2img, img2img = set_base_models() | |
demo.launch(debug=True, share=True) | |