alvdansen's picture
Update app.py
974dfa6 verified
raw
history blame
7.44 kB
import json
import random
import requests
import gradio as gr
import numpy as np
import spaces
import torch
from diffusers import DiffusionPipeline, LCMScheduler
from PIL import Image
# Load the JSON data
with open("sdxl_lora.json", "r") as file:
data = json.load(file)
sdxl_loras_raw = sorted(data, key=lambda x: x["likes"], reverse=True)
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
model_id = "stabilityai/stable-diffusion-xl-base-1.0"
pipe = DiffusionPipeline.from_pretrained(model_id, variant="fp16")
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
pipe.to(device=DEVICE, dtype=torch.float16)
MAX_SEED = np.iinfo(np.int32).max
MAX_IMAGE_SIZE = 1024
def update_selection(selected_state: gr.SelectData, gr_sdxl_loras):
lora_id = gr_sdxl_loras[selected_state.index]["repo"]
trigger_word = gr_sdxl_loras[selected_state.index]["trigger_word"]
return lora_id, trigger_word
def load_lora_for_style(style_repo):
pipe.unload_lora_weights()
pipe.load_lora_weights(style_repo, adapter_name="lora")
def get_image(image_data):
if isinstance(image_data, str):
return image_data
if isinstance(image_data, dict):
local_path = image_data.get('local_path')
hf_url = image_data.get('hf_url')
else:
return None # or a default image path
try:
return local_path # Return the local path string
except:
try:
response = requests.get(hf_url)
if response.status_code == 200:
with open(local_path, 'wb') as f:
f.write(response.content)
return local_path # Return the local path string
except Exception as e:
print(f"Failed to load image: {e}")
return None # or a default image path
@spaces.GPU
def infer(
pre_prompt,
prompt,
seed,
randomize_seed,
num_inference_steps,
negative_prompt,
guidance_scale,
user_lora_selector,
user_lora_weight,
progress=gr.Progress(track_tqdm=True),
):
load_lora_for_style(user_lora_selector)
if randomize_seed:
seed = random.randint(0, MAX_SEED)
generator = torch.Generator().manual_seed(seed)
if pre_prompt != "":
prompt = f"{pre_prompt} {prompt}"
image = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
guidance_scale=guidance_scale,
num_inference_steps=num_inference_steps,
generator=generator,
).images[0]
return image
css = """
body {
background-color: #1a1a1a;
color: #ffffff;
}
.container {
max-width: 900px;
margin: auto;
padding: 20px;
}
h1, h2 {
color: #4CAF50;
text-align: center;
}
.gallery {
display: flex;
flex-wrap: wrap;
justify-content: center;
}
.gallery img {
margin: 10px;
border-radius: 10px;
transition: transform 0.3s ease;
}
.gallery img:hover {
transform: scale(1.05);
}
.gradio-slider input[type="range"] {
background-color: #4CAF50;
}
.gradio-button {
background-color: #4CAF50 !important;
}
"""
with gr.Blocks(css=css) as demo:
gr.Markdown(
"""
# ⚑ FlashDiffusion: Araminta K's FlashLoRA Showcase ⚑
This interactive demo showcases [Araminta K's models](https://huggingface.co/alvdansen) using [Flash Diffusion](https://gojasper.github.io/flash-diffusion-project/) technology.
## Acknowledgments
- Original Flash Diffusion technology by the Jasper AI team
- Based on the paper: [Flash Diffusion: Accelerating Any Conditional Diffusion Model for Few Steps Image Generation](http://arxiv.org/abs/2406.02347) by ClΓ©ment Chadebec, Onur Tasar, Eyal Benaroche and Benjamin Aubin
- Models showcased here are created by Araminta K at Alvdansen Labs
Explore the power of FlashLoRA with Araminta K's unique artistic styles!
"""
)
gr_sdxl_loras = gr.State(value=sdxl_loras_raw)
gr_lora_id = gr.State(value="")
with gr.Row():
with gr.Column(scale=2):
gallery = gr.Gallery(
value=[(img, title) for img, title in
((get_image(item["image"]), item["title"]) for item in sdxl_loras_raw)
if img is not None],
label="SDXL LoRA Gallery",
show_label=False,
elem_id="gallery",
columns=3,
height=600,
)
user_lora_selector = gr.Textbox(
label="Current Selected LoRA",
interactive=False,
)
with gr.Column(scale=3):
prompt = gr.Textbox(
label="Prompt",
placeholder="Enter your prompt",
lines=3,
)
with gr.Row():
run_button = gr.Button("Run", variant="primary")
clear_button = gr.Button("Clear")
result = gr.Image(label="Result", height=512)
with gr.Accordion("Advanced Settings", open=False):
pre_prompt = gr.Textbox(
label="Pre-Prompt",
placeholder="Pre Prompt from the LoRA config",
lines=2,
)
with gr.Row():
seed = gr.Slider(
label="Seed",
minimum=0,
maximum=MAX_SEED,
step=1,
value=0,
)
randomize_seed = gr.Checkbox(label="Randomize seed", value=True)
num_inference_steps = gr.Slider(
label="Number of inference steps",
minimum=4,
maximum=8,
step=1,
value=4,
)
guidance_scale = gr.Slider(
label="Guidance Scale",
minimum=1,
maximum=6,
step=0.5,
value=1,
)
negative_prompt = gr.Textbox(
label="Negative Prompt",
placeholder="Enter a negative Prompt",
lines=2,
)
gr.on(
[run_button.click, prompt.submit],
fn=infer,
inputs=[
pre_prompt,
prompt,
seed,
randomize_seed,
num_inference_steps,
negative_prompt,
guidance_scale,
user_lora_selector,
gr.Slider(label="Selected LoRA Weight", minimum=0.5, maximum=3, step=0.1, value=1),
],
outputs=[result],
)
clear_button.click(lambda: "", outputs=[prompt, result])
gallery.select(
fn=update_selection,
inputs=[gr_sdxl_loras],
outputs=[user_lora_selector, pre_prompt],
)
gr.Markdown(
"""
## Unleash Your Creativity!
This showcase brings together the speed of Flash Diffusion and the artistic flair of Araminta K's models.
Craft your prompts, adjust the settings, and watch as AI brings your ideas to life in stunning detail.
Remember to use this tool ethically and respect copyright and individual privacy.
Enjoy exploring these unique artistic styles!
"""
)
demo.queue().launch()