ford442's picture
Update app.py
96802ce verified
raw
history blame
26.9 kB
#!/usr/bin/env python
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
import spaces
import os
import random
import uuid
import gradio as gr
import numpy as np
from PIL import Image
import torch
from diffusers import AutoencoderKL, StableDiffusionXLPipeline, UNet2DConditionModel
from diffusers import EulerAncestralDiscreteScheduler
from diffusers import DPMSolverMultistepScheduler
from typing import Tuple
import paramiko
import gc
import time
import datetime
#from diffusers.schedulers import AysSchedules
from gradio import themes
from hidiffusion import apply_hidiffusion, remove_hidiffusion
import gc
torch.backends.cuda.matmul.allow_tf32 = False
torch.backends.cuda.matmul.allow_bf16_reduced_precision_reduction = False
torch.backends.cuda.matmul.allow_fp16_reduced_precision_reduction = False
torch.backends.cudnn.allow_tf32 = False
torch.backends.cudnn.deterministic = False
#torch.backends.cudnn.benchmark = False
torch.backends.cuda.preferred_blas_library="cublas"
# torch.backends.cuda.preferred_linalg_library="cusolver"
torch.set_float32_matmul_precision("highest")
FTP_HOST = "1ink.us"
FTP_USER = "ford442"
FTP_PASS = "GoogleBez12!"
FTP_DIR = "1ink.us/stable_diff/" # Remote directory on FTP server
DESCRIPTIONXX = """
## ⚡⚡⚡⚡ REALVISXL V5.0 BF16 (Tester A) ⚡⚡⚡⚡
"""
examples = [
"Many apples splashed with drops of water within a fancy bowl 4k, hdr --v 6.0 --style raw",
"A profile photo of a dog, brown background, shot on Leica M6 --ar 128:85 --v 6.0 --style raw",
]
MODEL_OPTIONS = {
"REALVISXL V5.0 BF16": "ford442/RealVisXL_V5.0_BF16",
}
MAX_IMAGE_SIZE = int(os.getenv("MAX_IMAGE_SIZE", "4096"))
USE_TORCH_COMPILE = os.getenv("USE_TORCH_COMPILE", "0") == "1"
ENABLE_CPU_OFFLOAD = 0
BATCH_SIZE = int(os.getenv("BATCH_SIZE", "1"))
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
style_list = [
{
"name": "3840 x 2160",
"prompt": "hyper-realistic 8K image of {prompt}. ultra-detailed, lifelike, high-resolution, sharp, vibrant colors, photorealistic",
"negative_prompt": "cartoonish, low resolution, blurry, simplistic, abstract, deformed, ugly",
},
{
"name": "2560 x 1440",
"prompt": "hyper-realistic 4K image of {prompt}. ultra-detailed, lifelike, high-resolution, sharp, vibrant colors, photorealistic",
"negative_prompt": "cartoonish, low resolution, blurry, simplistic, abstract, deformed, ugly",
},
{
"name": "HD+",
"prompt": "hyper-realistic 2K image of {prompt}. ultra-detailed, lifelike, high-resolution, sharp, vibrant colors, photorealistic",
"negative_prompt": "cartoonish, low resolution, blurry, simplistic, abstract, deformed, ugly",
},
{
"name": "Style Zero",
"prompt": "{prompt}",
"negative_prompt": "",
},
]
styles = {k["name"]: (k["prompt"], k["negative_prompt"]) for k in style_list}
DEFAULT_STYLE_NAME = "Style Zero"
STYLE_NAMES = list(styles.keys())
HF_TOKEN = os.getenv("HF_TOKEN")
#sampling_schedule = AysSchedules["StableDiffusionXLTimesteps"]
def apply_style(style_name: str, positive: str, negative: str = "") -> Tuple[str, str]:
if style_name in styles:
p, n = styles.get(style_name, styles[DEFAULT_STYLE_NAME])
else:
p, n = styles[DEFAULT_STYLE_NAME]
if not negative:
negative = ""
return p.replace("{prompt}", positive), n + negative
def load_and_prepare_model(model_id):
model_dtypes = {"ford442/RealVisXL_V5.0_BF16": torch.bfloat16,}
dtype = model_dtypes.get(model_id, torch.bfloat16) # Default to float32 if not found
#vae = AutoencoderKL.from_pretrained("ford442/sdxl-vae-bf16", safety_checker=None)
vaeX = AutoencoderKL.from_pretrained("stabilityai/sdxl-vae", safety_checker=None,use_safetensors=False)
#vae = AutoencoderKL.from_pretrained('cross-attention/asymmetric-autoencoder-kl-x-2',use_safetensors=False)
#vae = AutoencoderKL.from_single_file('https://huggingface.co/ford442/sdxl-vae-bf16/mySLR/myslrVAE_v10.safetensors')
#vaeX = AutoencoderKL.from_pretrained("stabilityai/sd-vae-ft-mse",use_safetensors=True)
#vaeX = AutoencoderKL.from_pretrained('ford442/Juggernaut-XI-v11-fp32',subfolder='vae') # ,use_safetensors=True FAILS
#vaeX = AutoencoderKL.from_pretrained('ford442/RealVisXL_V5.0_FP64',subfolder='vae').to(torch.bfloat16) # ,use_safetensors=True FAILS
#unetX = UNet2DConditionModel.from_pretrained('ford442/RealVisXL_V5.0_BF16',subfolder='unet').to(torch.bfloat16) # ,use_safetensors=True FAILS
# vae = AutoencoderKL.from_pretrained("BeastHF/MyBack_SDXL_Juggernaut_XL_VAE/MyBack_SDXL_Juggernaut_XL_VAE_V10(version_X).safetensors",safety_checker=None).to(torch.bfloat16)
#sched = EulerAncestralDiscreteScheduler.from_pretrained("SG161222/RealVisXL_V5.0", subfolder='scheduler',beta_schedule="scaled_linear", steps_offset=1,timestep_spacing="trailing"))
#sched = EulerAncestralDiscreteScheduler.from_pretrained("SG161222/RealVisXL_V5.0", subfolder='scheduler', steps_offset=1,timestep_spacing="trailing")
sched = EulerAncestralDiscreteScheduler.from_pretrained('ford442/RealVisXL_V5.0_BF16', subfolder='scheduler',beta_schedule="scaled_linear", beta_start=0.00085, beta_end=0.012, steps_offset=1,use_karras_sigmas=True)
#sched = EulerAncestralDiscreteScheduler.from_pretrained('ford442/RealVisXL_V5.0_BF16', subfolder='scheduler',beta_schedule="scaled_linear")
#pipeX = StableDiffusionXLPipeline.from_pretrained("SG161222/RealVisXL_V5.0").to(torch.bfloat16)
#pipeX = StableDiffusionXLPipeline.from_pretrained("ford442/Juggernaut-XI-v11-fp32",use_safetensors=True)
pipe = StableDiffusionXLPipeline.from_pretrained(
'ford442/RealVisXL_V5.0_BF16',
#'ford442/Juggernaut-XI-v11-fp32',
# 'SG161222/RealVisXL_V5.0',
#torch_dtype=torch.bfloat16,
add_watermarker=False,
# custom_pipeline="lpw_stable_diffusion_xl",
#use_safetensors=True,
# use_auth_token=HF_TOKEN,
# vae=AutoencoderKL.from_pretrained("BeastHF/MyBack_SDXL_Juggernaut_XL_VAE/MyBack_SDXL_Juggernaut_XL_VAE_V10(version_X).safetensors",repo_type='model',safety_checker=None),
# vae=AutoencoderKL.from_pretrained("stabilityai/sdxl-vae",repo_type='model',safety_checker=None, torch_dtype=torch.float32),
# vae=AutoencoderKL.from_pretrained("ford442/sdxl-vae-bf16",repo_type='model',safety_checker=None),
#vae=vae,
#unet=pipeX.unet,
#scheduler = sched,
# scheduler = EulerAncestralDiscreteScheduler.from_config(pipeX.scheduler.config, beta_schedule="scaled_linear", beta_start=0.00085, beta_end=0.012, steps_offset=1)
#scheduler=EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config, beta_schedule="scaled_linear", beta_start=0.00085, beta_end=0.012, steps_offset =1)
)
#pipe.vae = AsymmetricAutoencoderKL.from_pretrained('cross-attention/asymmetric-autoencoder-kl-x-2').to(torch.bfloat16) # ,use_safetensors=True FAILS
#pipe.vae = AutoencoderKL.from_pretrained('ford442/Juggernaut-XI-v11-fp32',subfolder='vae') # ,use_safetensors=True FAILS
#pipe.vae = AutoencoderKL.from_pretrained('stabilityai/sdxl-vae-bf16',subfolder='vae')
#pipe.vae = AutoencoderKL.from_pretrained('stabilityai/sdxl-vae',subfolder='vae',force_upcast=False,scaling_factor= 0.182158767676)
#pipe.vae.to(torch.bfloat16)
'''
scaling_factor (`float`, *optional*, defaults to 0.18215):
The component-wise standard deviation of the trained latent space computed using the first batch of the
training set. This is used to scale the latent space to have unit variance when training the diffusion
model. The latents are scaled with the formula `z = z * scaling_factor` before being passed to the
diffusion model. When decoding, the latents are scaled back to the original scale with the formula: `z = 1
/ scaling_factor * z`. For more details, refer to sections 4.3.2 and D.1 of the [High-Resolution Image
Synthesis with Latent Diffusion Models](https://arxiv.org/abs/2112.10752) paper.
force_upcast (`bool`, *optional*, default to `True`):
If enabled it will force the VAE to run in float32 for high image resolution pipelines, such as SD-XL. VAE
can be fine-tuned / trained to a lower range without loosing too much precision in which case
`force_upcast` can be set to `False` - see: https://huggingface.co/madebyollin/sdxl-vae-fp16-fix
'''
#sched = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config, beta_schedule="scaled_linear",use_karras_sigmas=True, algorithm_type="dpmsolver++")
#pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config, beta_schedule="scaled_linear", beta_start=0.00085, beta_end=0.012, steps_offset=1)
#pipe.scheduler = DPMSolverMultistepScheduler.from_pretrained('SG161222/RealVisXL_V5.0', subfolder='scheduler', algorithm_type='sde-dpmsolver++')
pipe.vae = vaeX.to(torch.bfloat16)
#pipe.unet = unetX
#pipe.vae.do_resize=False
#pipe.vae.do_rescale=False
#pipe.vae.do_convert_rgb=True
pipe.vae.vae_scale_factor=8
pipe.scheduler = sched
#pipe.vae=vae.to(torch.bfloat16)
#pipe.unet=pipeX.unet
#pipe.scheduler=EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config, beta_schedule="scaled_linear", beta_start=0.00085, beta_end=0.012, steps_offset=1)
#pipe.scheduler=EulerAncestralDiscreteScheduler.from_pretrained('ford442/RealVisXL_V5.0_BF16', subfolder='scheduler',beta_schedule="scaled_linear")
pipe.to(device=device, dtype=torch.bfloat16)
#pipe.to(torch.bfloat16)
#apply_hidiffusion(pipe)
#pipe.unet.set_default_attn_processor()
pipe.vae.set_default_attn_processor()
print(f'Pipeline: ')
#print(f'_optional_components: {pipe._optional_components}')
#print(f'watermark: {pipe.watermark}')
print(f'image_processor: {pipe.image_processor}')
#print(f'feature_extractor: {pipe.feature_extractor}')
print(f'init noise scale: {pipe.scheduler.init_noise_sigma}')
#print(f'UNET: {pipe.unet}')
pipe.watermark=None
pipe.safety_checker=None
#pipe.to(torch.device("cuda:0"))
#pipe.vae.to(torch.bfloat16)
#pipe.to(device, torch.bfloat16)
#del pipeX
#sched = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config, beta_schedule="scaled_linear", algorithm_type="dpmsolver++")
#sched = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config, beta_schedule="linear", algorithm_type="dpmsolver++")
#sched = DDIMScheduler.from_config(pipe.scheduler.config)
return pipe
# Preload and compile both models
models = {key: load_and_prepare_model(value) for key, value in MODEL_OPTIONS.items()}
MAX_SEED = np.iinfo(np.int32).max
neg_prompt_2 = " 'non-photorealistic':1.5, 'unrealistic skin','unattractive face':1.3, 'low quality':1.1, ('dull color scheme', 'dull colors', 'digital noise':1.2),'amateurish', 'poorly drawn face':1.3, 'poorly drawn', 'distorted face', 'low resolution', 'simplistic' "
def upload_to_ftp(filename):
try:
transport = paramiko.Transport((FTP_HOST, 22))
destination_path=FTP_DIR+filename
transport.connect(username = FTP_USER, password = FTP_PASS)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(filename, destination_path)
sftp.close()
transport.close()
print(f"Uploaded {filename} to FTP server")
except Exception as e:
print(f"FTP upload error: {e}")
def save_image(img):
unique_name = str(uuid.uuid4()) + ".png"
img.save(unique_name,optimize=False,compress_level=0)
return unique_name
def randomize_seed_fn(seed: int, randomize_seed: bool) -> int:
if randomize_seed:
seed = random.randint(0, MAX_SEED)
return seed
def uploadNote():
# write note txt
filename= f'tst_A_{seed}.txt'
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
with open(filename, "w") as f:
f.write(f"Realvis 5.0 (Tester A): {seed} png\n")
f.write(f"Date/time: {timestamp} \n")
f.write(f"Prompt: {prompt} \n")
f.write(f"Steps: {num_inference_steps} \n")
f.write(f"Guidance Scale: {guidance_scale} \n")
f.write(f"SPACE SETUP: \n")
f.write(f"Use Model Dtype: no \n")
f.write(f"Model Scheduler: Euler_a all_custom before cuda \n")
f.write(f"Model VAE: sdxl-vae to bfloat safetensor=false before cuda then attn_proc / scale factor 8 \n")
f.write(f"Model UNET: default ford442/RealVisXL_V5.0_BF16 \n")
f.write(f"Model HiDiffusion OFF \n")
f.write(f"Model do_resize ON \n")
f.write(f"added torch to prereq and changed accellerate \n")
upload_to_ftp(filename)
@spaces.GPU(duration=30)
def generate_30(
model_choice: str,
prompt: str,
negative_prompt: str = "",
use_negative_prompt: bool = False,
style_selection: str = "",
seed: int = 1,
width: int = 768,
height: int = 768,
guidance_scale: float = 4,
num_inference_steps: int = 125,
randomize_seed: bool = False,
use_resolution_binning: bool = True,
num_images: int = 1,
progress=gr.Progress(track_tqdm=True) # Add progress as a keyword argument
):
torch.cuda.empty_cache()
gc.collect()
global models
pipe = models[model_choice]
seed = int(randomize_seed_fn(seed, randomize_seed))
generator = torch.Generator(device='cuda').manual_seed(seed)
#prompt, negative_prompt = apply_style(style_selection, prompt, negative_prompt)
options = {
"prompt": [prompt] * num_images,
"negative_prompt": [negative_prompt],
"negative_prompt_2": [neg_prompt_2],
"width": width,
"height": height,
"guidance_scale": guidance_scale,
"num_inference_steps": num_inference_steps,
"generator": generator,
# "timesteps": sampling_schedule,
"output_type": "pil",
}
if use_resolution_binning:
options["use_resolution_binning"] = True
images = []
pipe.scheduler.set_timesteps(num_inference_steps,device)
uploadNote()
for i in range(0, num_images, BATCH_SIZE):
batch_options = options.copy()
batch_options["prompt"] = options["prompt"][i:i+BATCH_SIZE]
if "negative_prompt" in batch_options:
batch_options["negative_prompt"] = options["negative_prompt"][i:i+BATCH_SIZE]
images.extend(pipe(**batch_options).images)
sd_image_path = f"rv50_A_{seed}.png"
images[0].save(sd_image_path,optimize=False,compress_level=0)
upload_to_ftp(sd_image_path)
image_paths = [save_image(img) for img in images]
torch.cuda.empty_cache()
gc.collect()
return image_paths, seed
@spaces.GPU(duration=60)
def generate_60(
model_choice: str,
prompt: str,
negative_prompt: str = "",
use_negative_prompt: bool = False,
style_selection: str = "",
seed: int = 1,
width: int = 768,
height: int = 768,
guidance_scale: float = 4,
num_inference_steps: int = 250,
randomize_seed: bool = False,
use_resolution_binning: bool = True,
num_images: int = 1,
progress=gr.Progress(track_tqdm=True) # Add progress as a keyword argument
):
torch.cuda.empty_cache()
gc.collect()
global models
pipe = models[model_choice]
seed = int(randomize_seed_fn(seed, randomize_seed))
generator = torch.Generator(device='cuda').manual_seed(seed)
#prompt, negative_prompt = apply_style(style_selection, prompt, negative_prompt)
options = {
"prompt": [prompt] * num_images,
"negative_prompt": [negative_prompt],
"negative_prompt_2": [neg_prompt_2],
"width": width,
"height": height,
"guidance_scale": guidance_scale,
"num_inference_steps": num_inference_steps,
"generator": generator,
# "timesteps": sampling_schedule,
"output_type": "pil",
}
if use_resolution_binning:
options["use_resolution_binning"] = True
images = []
pipe.scheduler.set_timesteps(num_inference_steps,device)
uploadNote()
for i in range(0, num_images, BATCH_SIZE):
batch_options = options.copy()
batch_options["prompt"] = options["prompt"][i:i+BATCH_SIZE]
if "negative_prompt" in batch_options:
batch_options["negative_prompt"] = options["negative_prompt"][i:i+BATCH_SIZE]
images.extend(pipe(**batch_options).images)
sd_image_path = f"rv50_A_{seed}.png"
images[0].save(sd_image_path,optimize=False,compress_level=0)
upload_to_ftp(sd_image_path)
image_paths = [save_image(img) for img in images]
torch.cuda.empty_cache()
gc.collect()
return image_paths, seed
@spaces.GPU(duration=90)
def generate_90(
model_choice: str,
prompt: str,
negative_prompt: str = "",
use_negative_prompt: bool = False,
style_selection: str = "",
seed: int = 1,
width: int = 768,
height: int = 768,
guidance_scale: float = 4,
num_inference_steps: int = 250,
randomize_seed: bool = False,
use_resolution_binning: bool = True,
num_images: int = 1,
progress=gr.Progress(track_tqdm=True) # Add progress as a keyword argument
):
torch.cuda.empty_cache()
gc.collect()
global models
pipe = models[model_choice]
seed = int(randomize_seed_fn(seed, randomize_seed))
generator = torch.Generator(device='cuda').manual_seed(seed)
#prompt, negative_prompt = apply_style(style_selection, prompt, negative_prompt)
options = {
"prompt": [prompt] * num_images,
"negative_prompt": [negative_prompt],
"negative_prompt_2": [neg_prompt_2],
"width": width,
"height": height,
"guidance_scale": guidance_scale,
"num_inference_steps": num_inference_steps,
"generator": generator,
# "timesteps": sampling_schedule,
"output_type": "pil",
}
if use_resolution_binning:
options["use_resolution_binning"] = True
images = []
pipe.scheduler.set_timesteps(num_inference_steps,device)
uploadNote()
for i in range(0, num_images, BATCH_SIZE):
batch_options = options.copy()
batch_options["prompt"] = options["prompt"][i:i+BATCH_SIZE]
if "negative_prompt" in batch_options:
batch_options["negative_prompt"] = options["negative_prompt"][i:i+BATCH_SIZE]
images.extend(pipe(**batch_options).images)
sd_image_path = f"rv50_A_{seed}.png"
images[0].save(sd_image_path,optimize=False,compress_level=0)
upload_to_ftp(sd_image_path)
image_paths = [save_image(img) for img in images]
torch.cuda.empty_cache()
gc.collect()
return image_paths, seed
def load_predefined_images1():
predefined_images1 = [
"assets/7.png",
"assets/8.png",
"assets/9.png",
"assets/1.png",
"assets/2.png",
"assets/3.png",
"assets/4.png",
"assets/5.png",
"assets/6.png",
]
return predefined_images1
css = '''
#col-container {
margin: 0 auto;
max-width: 640px;
}
h1{text-align:center}
footer {
visibility: hidden
}
body {
background-color: green;
}
'''
with gr.Blocks(theme=gr.themes.Origin(),css=css) as demo:
gr.Markdown(DESCRIPTIONXX)
with gr.Row():
prompt = gr.Text(
label="Prompt",
show_label=False,
max_lines=1,
placeholder="Enter your prompt",
container=False,
)
run_button_30 = gr.Button("Run 30 Seconds", scale=0)
run_button_60 = gr.Button("Run 60 Seconds", scale=0)
run_button_90 = gr.Button("Run 90 Seconds", scale=0)
result = gr.Gallery(label="Result", columns=1, show_label=False)
with gr.Row():
model_choice = gr.Dropdown(
label="Model Selection🔻",
choices=list(MODEL_OPTIONS.keys()),
value="REALVISXL V5.0 BF16"
)
style_selection = gr.Radio(
show_label=True,
container=True,
interactive=True,
choices=STYLE_NAMES,
value=DEFAULT_STYLE_NAME,
label="Quality Style",
)
num_images = gr.Slider(
label="Number of Images",
minimum=1,
maximum=5,
step=1,
value=1,
)
with gr.Row():
with gr.Column(scale=1):
use_negative_prompt = gr.Checkbox(label="Use negative prompt", value=True)
negative_prompt = gr.Text(
label="Negative prompt",
max_lines=5,
lines=4,
placeholder="Enter a negative prompt",
value="('deformed', 'distorted', 'disfigured':1.3),'not photorealistic':1.5, 'poorly drawn', 'bad anatomy', 'wrong anatomy', 'extra limb', 'missing limb', 'floating limbs', 'poorly drawn hands', 'poorly drawn feet', 'poorly drawn face':1.3, 'out of frame', 'extra limbs', 'bad anatomy', 'bad art', 'beginner', 'distorted face','amateur'",
visible=True,
)
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=448,
maximum=MAX_IMAGE_SIZE,
step=64,
value=768,
)
height = gr.Slider(
label="Height",
minimum=448,
maximum=MAX_IMAGE_SIZE,
step=64,
value=768,
)
with gr.Row():
guidance_scale = gr.Slider(
label="Guidance Scale",
minimum=0.1,
maximum=30,
step=0.1,
value=4,
)
num_inference_steps = gr.Slider(
label="Number of inference steps",
minimum=10,
maximum=1000,
step=10,
value=150,
)
gr.Examples(
examples=examples,
inputs=prompt,
cache_examples=False
)
use_negative_prompt.change(
fn=lambda x: gr.update(visible=x),
inputs=use_negative_prompt,
outputs=negative_prompt,
api_name=False,
)
gr.on(
triggers=[
run_button_30.click,
],
# api_name="generate", # Add this line
fn=generate_30,
inputs=[
model_choice,
prompt,
negative_prompt,
use_negative_prompt,
style_selection,
seed,
width,
height,
guidance_scale,
num_inference_steps,
randomize_seed,
num_images,
],
outputs=[result, seed],
)
gr.on(
triggers=[
run_button_60.click,
],
# api_name="generate", # Add this line
fn=generate_60,
inputs=[
model_choice,
prompt,
negative_prompt,
use_negative_prompt,
style_selection,
seed,
width,
height,
guidance_scale,
num_inference_steps,
randomize_seed,
num_images,
],
outputs=[result, seed],
)
gr.on(
triggers=[
run_button_90.click,
],
# api_name="generate", # Add this line
fn=generate_90,
inputs=[
model_choice,
prompt,
negative_prompt,
use_negative_prompt,
style_selection,
seed,
width,
height,
guidance_scale,
num_inference_steps,
randomize_seed,
num_images,
],
outputs=[result, seed],
)
gr.Markdown("### REALVISXL V5.0")
predefined_gallery = gr.Gallery(label="REALVISXL V5.0", columns=3, show_label=False, value=load_predefined_images1())
#gr.Markdown("### LIGHTNING V5.0")
#predefined_gallery = gr.Gallery(label="LIGHTNING V5.0", columns=3, show_label=False, value=load_predefined_images())
gr.Markdown(
"""
<div style="text-align: justify;">
⚡Models used in the playground <a href="https://huggingface.co/SG161222/RealVisXL_V5.0">[REALVISXL V5.0]</a>, <a href="https://huggingface.co/SG161222/RealVisXL_V5.0_Lightning">[REALVISXL V5.0 LIGHTNING]</a> for image generation. Stable Diffusion XL piped (SDXL) model HF. This is the demo space for generating images using the Stable Diffusion XL models, with multiple different variants available.
</div>
""")
gr.Markdown(
"""
<div style="text-align: justify;">
⚡This is the demo space for generating images using Stable Diffusion XL with quality styles, different models, and types. Try the sample prompts to generate higher quality images. Try the sample prompts for generating higher quality images.
<a href='https://huggingface.co/spaces/prithivMLmods/Top-Prompt-Collection' target='_blank'>Try prompts</a>.
</div>
""")
gr.Markdown(
"""
<div style="text-align: justify;">
⚠️ Users are accountable for the content they generate and are responsible for ensuring it meets appropriate ethical standards.
</div>
""")
def text_generation(input_text, seed):
full_prompt = "Text Generator Application by ecarbo"
return full_prompt
title = "Text Generator Demo GPT-Neo"
description = "Text Generator Application by ecarbo"
if __name__ == "__main__":
demo_interface = demo.queue(max_size=50) # Remove .launch() here
text_gen_interface = gr.Interface(
fn=text_generation,
inputs=[
gr.Textbox(lines=1, label="Expand the following prompt to be more detailed and descriptive for image generation: "),
gr.Number(value=10, label="Enter seed number")
],
outputs=gr.Textbox(label="Text Generated"),
title=title,
description=description,
)
combined_interface = gr.TabbedInterface([demo_interface, text_gen_interface], ["Image Generation", "Text Generation"])
combined_interface.launch(show_api=False)