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()