Final-One / app.py
aanchal77's picture
Update app.py
15b9c89 verified
Raw
History Blame Contribute Delete
3.66 kB
import gradio as gr
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler
import torch
# --- Configuration ---
HF_REPO_ID = "aanchal77/Final-One"
BASE_MODEL_ID = "runwayml/stable-diffusion-v1-5"
# --- Define Available LoRAs ---
AVAILABLE_LORAS = {
"None (Base Model)": None,
# --- Artists ---
"Artist: Vincent van Gogh": "artists/Vincent_van_Gogh",
"Artist: Claude Monet": "artists/Claude_Monet",
"Artist: Rembrandt": "artists/Rembrandt",
"Artist: Pablo Picasso": "artists/Pablo_Picasso",
# --- Styles ---
"Style: Impressionism": "styles/Impressionism",
"Style: Baroque": "styles/Baroque",
"Style: Cubism": "styles/Cubism",
"Style: Abstract Expressionism": "styles/Abstract_Expressionism",
"Style: Romanticism": "styles/Romanticism",
"Style: Realism": "styles/Realism",
"Style: Post Impressionism": "styles/Post_Impressionism",
}
print("βœ… LoRA models from your Hugging Face repo are configured.")
# --- Setup ---
device = "cuda" if torch.cuda.is_available() else "cpu"
dtype = torch.float16 if device == "cuda" else torch.float32
print(f"Using device: {device}")
print(f"🎨 Loading base model: {BASE_MODEL_ID}")
pipe = StableDiffusionPipeline.from_pretrained(BASE_MODEL_ID, torch_dtype=dtype)
# πŸ”§ Replace the fragile PNDM scheduler with a robust one to avoid index/NoneType errors
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
pipe = pipe.to(device)
if device == "cpu":
pipe.enable_attention_slicing()
# --- The Core Generation Function ---
def generate(prompt, quality, lora_choice):
# Reset to base weights
pipe.unload_lora_weights()
lora_subfolder = AVAILABLE_LORAS.get(lora_choice)
if lora_subfolder:
print(f"✨ Downloading and applying LoRA: {lora_choice}")
try:
pipe.load_lora_weights(
HF_REPO_ID,
subfolder=lora_subfolder,
weight_name="adapter_model.safetensors" # ensure exact file
)
except Exception as e:
print(f"❌ Failed to load LoRA from Hub '{HF_REPO_ID}/{lora_subfolder}': {e}")
else:
print("🎨 Using base model (no LoRA selected)")
steps = 25 if quality == "Fast" else 40
guidance_scale = 7.5
print(f"πŸš€ Generating with prompt: '{prompt}'")
with torch.no_grad():
image = pipe(
prompt,
num_inference_steps=steps,
guidance_scale=guidance_scale
).images[0]
return image
# --- Build the Gradio UI ---
title = f"🎨 Stable Diffusion Gallery from {HF_REPO_ID}"
description = (
"Select a trained LoRA model from your Hugging Face repository to apply its style. "
"The first time you select a LoRA, it may take a moment to download."
)
demo = gr.Interface(
fn=generate,
inputs=[
gr.Textbox(label="Enter your prompt", placeholder="A beautiful painting of a fantasy landscape..."),
gr.Dropdown(["Fast", "High Quality"], value="Fast", label="Generation Quality"),
gr.Dropdown(
choices=list(AVAILABLE_LORAS.keys()),
value="None (Base Model)",
label="Select a Trained LoRA Model"
)
],
outputs=gr.Image(label="Generated Image"),
title=title,
description=description,
examples=[
["A portrait of an astronaut, cinematic lighting, by vincent van gogh", "Fast", "Artist: Vincent van Gogh"],
["A peaceful village in the mountains, impressionism style", "High Quality", "Style: Impressionism"],
],
cache_examples=False, # πŸ”’ prevent startup 500s if an example errors
)
demo.launch()