Spaces:
Running
on
Zero
Running
on
Zero
File size: 6,747 Bytes
aa7f465 b5164a5 aa7f465 b5164a5 aa7f465 b5164a5 aa7f465 b5164a5 89c448c 1580c57 10fd453 aa7f465 b5164a5 aa7f465 00d867b b5164a5 aa7f465 b5164a5 aa7f465 b5164a5 aa7f465 b5164a5 aa7f465 b5164a5 aa7f465 b5164a5 aa7f465 b5164a5 aa7f465 b5164a5 aa7f465 b5164a5 00d867b b5164a5 aa7f465 b5164a5 aa7f465 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
import gradio as gr
from diffusers import StableDiffusionPipeline, DDIMScheduler
import torch
from PIL import ImageEnhance, Image
import numpy as np
import spaces # For using ZeroGPU decorator
# Load Stable Diffusion pipeline with efficient defaults
model_id = "CompVis/stable-diffusion-v1-4"
default_scheduler = DDIMScheduler.from_pretrained(model_id, subfolder="scheduler")
device = "cuda" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if device == "cuda" else torch.float32
pipe = StableDiffusionPipeline.from_pretrained(model_id, scheduler=default_scheduler, torch_dtype=torch_dtype).to(device)
# Scheduler options (setting DDIM as the default for speed)
schedulers = {
"High-Definition & Fast (DDIM) - Good quality with fastest speed": DDIMScheduler,
"Photo-Realistic (PNDM) - Best for realistic details, moderate speed": PNDMScheduler,
"Artistic & Imaginative (Euler Ancestral) - Good for creative scenes, moderate speed": EulerAncestralDiscreteScheduler,
}
# Main image generation function with 60-second GPU duration limit
@spaces.GPU(duration=60)
def generate_image(prompt, use_categories, genre, style, theme, lighting, scheduler_choice, quality, size):
# Check if additional categories should be added to the prompt
if use_categories:
prompt_text = (
f"{prompt.strip()} in a {genre.lower()} wallpaper style, "
f"with {style.lower()} visuals, focusing on a {theme.lower()} theme "
f"and {lighting.lower()} lighting."
)
else:
prompt_text = prompt.strip()
# Set the scheduler based on user choice
scheduler = schedulers[scheduler_choice].from_pretrained(model_id, subfolder="scheduler")
pipe.scheduler = scheduler
# Set output size based on selection
image_size = (512, 512) if size == "Profile Picture" else (512, 512) # Using smaller size for faster generation
# Generate image with specified quality and size
with torch.no_grad():
image = pipe(prompt_text, num_inference_steps=quality, guidance_scale=7.5).images[0]
image = image.resize(image_size) # Resize image to fit selected dimensions
return np.array(image) # Return as NumPy array for Gradio
# Post-processing function for brightness and contrast
def adjust_brightness_contrast(image, brightness, contrast):
image = Image.fromarray(image.astype('uint8'), 'RGB')
image = ImageEnhance.Brightness(image).enhance(brightness)
image = ImageEnhance.Contrast(image).enhance(contrast)
return np.array(image)
# Warning function for high-quality settings
def show_warning(quality):
if quality > 40: # Lower threshold for warning
return "⚠️ High Quality: This may slow down generation. Consider using values below 40 for faster results."
return ""
# Build Gradio Interface with adjusted defaults
with gr.Blocks() as demo:
gr.Markdown("# ✨ AI-Powered Wallpaper/Profile Picture Generator\n🖼️ A tool to generate and fine-tune AI-created wallpapers and profile pictures with adjustable styles and effects.")
# Image Generation Section
with gr.Tab("Image Generator"):
gr.Markdown("## Generate an Image")
with gr.Row():
with gr.Column():
custom_prompt = gr.Textbox(label="Custom Prompt", placeholder="Describe your image (e.g., 'A forest at sunset')")
# Toggle for using additional categories
use_categories = gr.Checkbox(label="Enable Advanced Settings (Genre, Style, Theme, Lighting)", value=False)
# Additional categories, hidden by default and shown only if use_categories is checked
with gr.Accordion("Advanced Settings", open=False):
genre = gr.Dropdown(["Futuristic", "Nature", "Abstract", "Fantasy", "Sci-Fi", "Cyberpunk"], label="Genre")
style = gr.Dropdown(["Realistic", "Surreal", "Digital Art", "Cartoon", "Photorealistic"], label="Style")
theme = gr.Dropdown(["Landscape", "Portrait", "Abstract Patterns", "Architecture"], label="Theme")
lighting = gr.Dropdown(["Warm", "Cool", "Cinematic", "Soft", "Neon"], label="Lighting")
# Reduced quality for faster generation
quality = gr.Slider(20, 80, value=30, step=10, label="Image Quality", info="Lower values for faster generation.")
warning_message = gr.Markdown("")
# Scheduler selection with default option as DDIM for speed
scheduler_choice = gr.Dropdown(
[
"High-Definition & Fast (DDIM) - Good quality with fastest speed",
"Photo-Realistic (PNDM) - Best for realistic details, moderate speed",
"Artistic & Imaginative (Euler Ancestral) - Good for creative scenes, moderate speed"
],
label="Artistic Style & Speed",
value="High-Definition & Fast (DDIM) - Good quality with fastest speed"
)
size = gr.Dropdown(["Profile Picture", "Wallpaper"], label="Image Size", value="Profile Picture")
generate_button = gr.Button("Generate Image")
with gr.Column():
generated_image = gr.Image(label="Generated Image", interactive=False)
# Display warning message for high-quality settings
quality.change(show_warning, inputs=[quality], outputs=warning_message)
# Bind the generate function to the generate button
generate_button.click(
fn=generate_image,
inputs=[custom_prompt, use_categories, genre, style, theme, lighting, scheduler_choice, quality, size],
outputs=generated_image
)
# Post-Processing Section
with gr.Tab("Edit Generated Image"):
gr.Markdown("## Adjust Brightness & Contrast")
with gr.Row():
with gr.Column():
brightness_slider = gr.Slider(0.5, 2.0, value=1.0, label="Brightness")
contrast_slider = gr.Slider(0.5, 2.0, value=1.0, label="Contrast")
apply_adjustments = gr.Button("Apply Adjustments")
with gr.Column():
output_image = gr.Image(label="Adjusted Image", interactive=False)
# Bind the brightness and contrast adjustment function to the Apply Adjustments button
apply_adjustments.click(
fn=adjust_brightness_contrast,
inputs=[generated_image, brightness_slider, contrast_slider],
outputs=output_image
)
# Launch with a public shareable link
demo.launch(share=True) |