t2i_demo / app.py
el-el-san's picture
Update app.py
9f5c507 verified
raw
history blame
5.84 kB
import gradio as gr
import numpy as np
import PIL.Image
from PIL import Image
import random
from diffusers import ControlNetModel, StableDiffusionXLControlNetPipeline, StableDiffusionXLPipeline, AutoencoderKL
from diffusers import DDIMScheduler, EulerAncestralDiscreteScheduler
#from diffusers.utils import load_image
import cv2
import torch
import spaces
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
controlnet = ControlNetModel.from_pretrained(
#"2vXpSwA7/test_controlnet2/CN-anytest_v4-marged_am_dim256.safetensors",
"xinsir/controlnet-scribble-sdxl-1.0",
torch_dtype=torch.float16
#from_tf=False,
#variant="safetensors"
)
vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16)
#pipe = StableDiffusionXLControlNetPipeline.from_pretrained(
# "yodayo-ai/holodayo-xl-2.1",
# controlnet=controlnet,
# vae=vae,
# torch_dtype=torch.float16,
#)
pipe = StableDiffusionXLPipeline.from_pretrained(
"yodayo-ai/holodayo-xl-2.1",
vae=vae,
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(use_image, prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps, image: PIL.Image.Image = None) -> PIL.Image.Image:
def infer(prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps):
# Check if the input image is a valid PIL Image and is not empty
use_image = False
#image = None
#if use_image :# and image is not None :
# width, height = image['composite'].size
# ratio = np.sqrt(1024. * 1024. / (width * height))
# new_width, new_height = int(width * ratio), int(height * ratio)
# image = image['composite'].resize((new_width, new_height))
# print(image)
if randomize_seed:
seed = random.randint(0, MAX_SEED)
generator = torch.Generator().manual_seed(seed)
if use_image:
#output_image = pipe(
# prompt=prompt + ", masterpiece, best quality, very aesthetic, absurdres",
# negative_prompt=negative_prompt,
# image=image,
# controlnet_conditioning_scale=1.0,
# guidance_scale=guidance_scale,
# num_inference_steps=num_inference_steps,
# width=new_width,
# height=new_height,
# generator=generator
#).images[0]
else:
# If no valid image is provided, generate an image based only on the text prompt
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]
return output_image
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("""
# Text-to-Image Demo
using [Holodayo XL 2.1](https://huggingface.co/yodayo-ai/holodayo-xl-2.1)
""")
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)
#image = gr.ImageEditor(type="pil", image_mode="L", crop_size=(512, 512))
result = gr.Image(label="Result", show_label=False)
#use_image = gr.Checkbox(label="Use image", value=True)
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,
)
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,#832,
)
height = gr.Slider(
label="Height",
minimum=256,
maximum=MAX_IMAGE_SIZE,
step=32,
value=1024,#1216,
)
with gr.Row():
guidance_scale = gr.Slider(
label="Guidance scale",
minimum=0.0,
maximum=20.0,
step=0.1,
value=7,
)
num_inference_steps = gr.Slider(
label="Number of inference steps",
minimum=1,
maximum=28,
step=1,
value=28,
)
run_button.click(#lambda x: None, inputs=None, outputs=result).then(
fn=infer,
#inputs=[use_image, prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps,image],
inputs=[prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps],
outputs=[result]
)
demo.queue().launch(show_error=True)