Akimitsujiro's picture
Update app.py
0094274 verified
import spaces
import gradio as gr
import numpy as np
import PIL.Image
from PIL import Image
import random
from diffusers import ControlNetModel, StableDiffusionXLPipeline, AutoencoderKL
import cv2
import torch
import os
import time
import glob
from diffusers import (
DDIMScheduler,
DPMSolverMultistepScheduler,
EulerDiscreteScheduler,
EulerAncestralDiscreteScheduler,
HeunDiscreteScheduler,
KDPM2DiscreteScheduler,
KDPM2AncestralDiscreteScheduler,
LMSDiscreteScheduler,
UniPCMultistepScheduler,
)
TEMP_DIR = "temp_images"
FILE_RETENTION_PERIOD = 3600
os.makedirs(TEMP_DIR, exist_ok=True)
def cleanup_old_files():
"""Delete old temporary files"""
current_time = time.time()
pattern = os.path.join(TEMP_DIR, "output_*.png")
for file_path in glob.glob(pattern):
try:
file_modified_time = os.path.getmtime(file_path)
if current_time - file_modified_time > FILE_RETENTION_PERIOD:
os.remove(file_path)
except Exception as e:
print(f"Error while cleaning up file {file_path}: {e}")
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
pipe = StableDiffusionXLPipeline.from_single_file(
"https://huggingface.co/SeaArtLab/SeaArt-Furry-XL-1.0/blob/main/furry-xl-4.0.safetensors",
use_safetensors=True,
torch_dtype=torch.float16,
)
pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config)
pipe.to(device)
MAX_SEED = np.iinfo(np.int32).max
MAX_IMAGE_SIZE = 1216
@spaces.GPU
def infer(prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps, sampler_name):
cleanup_old_files()
if sampler_name == "DDIM":
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config)
elif sampler_name == "DPMSolverMultistep":
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
elif sampler_name == "Euler":
pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config)
elif sampler_name == "EulerAncestral":
pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config)
elif sampler_name == "Heun":
pipe.scheduler = HeunDiscreteScheduler.from_config(pipe.scheduler.config)
elif sampler_name == "KDPM2":
pipe.scheduler = KDPM2DiscreteScheduler.from_config(pipe.scheduler.config)
elif sampler_name == "KDPM2Ancestral":
pipe.scheduler = KDPM2AncestralDiscreteScheduler.from_config(pipe.scheduler.config)
elif sampler_name == "LMS":
pipe.scheduler = LMSDiscreteScheduler.from_config(pipe.scheduler.config)
elif sampler_name == "UniPC":
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
else:
pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config)
if randomize_seed:
seed = random.randint(0, MAX_SEED)
generator = torch.Generator().manual_seed(seed)
output_image = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
guidance_scale=guidance_scale,
num_inference_steps=num_inference_steps,
width=width,
height=height,
generator=generator
).images[0]
if output_image.mode != 'RGB':
output_image = output_image.convert('RGB')
timestamp = int(time.time())
temp_filename = os.path.join(TEMP_DIR, f"output_{timestamp}.png")
output_image.save(temp_filename)
return temp_filename
css = """
#col-container {
margin: 0 auto;
max-width: 520px;
}
"""
with gr.Blocks(css=css) as demo:
with gr.Column(elem_id="col-container"):
gr.Markdown("""
T2I FurryStyle BetaVer""")
with gr.Row():
prompt = gr.Text(
label="Prompt",
show_label=False,
max_lines=1,
placeholder="Enter your prompt",
container=False,
)
run_button = gr.Button("Run", scale=0)
result = gr.Image(
label="Result",
show_label=False,
type="filepath",
elem_id="output_image"
)
with gr.Accordion("Advanced Settings", open=False):
negative_prompt = gr.Text(
label="Negative prompt",
max_lines=1,
placeholder="Enter a negative prompt",
value="nsfw, (low quality, worst quality:1.2), very displeasing, 3d, watermark, signature, ugly, poorly drawn"
)
seed = gr.Slider(
label="Seed",
minimum=0,
maximum=MAX_SEED,
step=1,
value=0,
)
sampler_name = gr.Dropdown(
label="Sampler",
choices=["DDIM", "DPMSolverMultistep", "Euler", "EulerAncestral", "Heun", "KDPM2", "KDPM2Ancestral", "LMS", "UniPC"],
value="EulerAncestral",
)
randomize_seed = gr.Checkbox(label="Randomize seed", value=True)
with gr.Row():
width = gr.Slider(
label="Width",
minimum=256,
maximum=MAX_IMAGE_SIZE,
step=32,
value=1024,
)
height = gr.Slider(
label="Height",
minimum=256,
maximum=MAX_IMAGE_SIZE,
step=32,
value=1024,
)
with gr.Row():
guidance_scale = gr.Slider(
label="Guidance scale",
minimum=0.0,
maximum=20.0,
step=0.1,
value=4,
)
num_inference_steps = gr.Slider(
label="Number of inference steps",
minimum=1,
maximum=28,
step=1,
value=28,
)
run_button.click(
fn=infer,
inputs=[prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps, sampler_name],
outputs=[result]
)
cleanup_old_files()
demo.queue().launch()