import spaces import torch from diffusers import StableDiffusionPipeline import gradio as gr import random from PIL import Image import os # Initialisiere die Pipeline als None - wird erst bei Bedarf geladen pipe = None def load_model(): global pipe if pipe is None: print("Loading SeaCreatures model...") try: pipe = StableDiffusionPipeline.from_pretrained( "arnomatic/seacreatures", torch_dtype=torch.float16, safety_checker=None, requires_safety_checker=False, use_safetensors=True ) print("Model loaded successfully!") except Exception as e: print(f"Error loading model: {e}") # Fallback zu Standard Stable Diffusion falls dein Modell nicht lädt pipe = StableDiffusionPipeline.from_pretrained( "runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, safety_checker=None, requires_safety_checker=False ) print("Loaded fallback model instead") return pipe # Beispiel-Prompts für Inspiration example_prompts = [ "a majestic jellyfish with glowing tentacles", "an ethereal sea dragon with translucent fins", "a mysterious deep sea creature with bioluminescent spots", "an elegant manta ray with glowing patterns", "a fantastical seahorse with luminous spines", "a graceful octopus with shimmering skin", "a mystical anglerfish with bright lure", "an otherworldly nautilus with glowing shell patterns" ] @spaces.GPU(duration=120) # 2 Minuten sollten reichen def generate_seacreature(prompt, negative_prompt, num_inference_steps, guidance_scale, width, height, seed): # Lade das Modell falls noch nicht geschehen current_pipe = load_model() # Setze das Modell auf GPU current_pipe.to("cuda") # Füge den Concept-Trigger hinzu - das ist wichtig für dein DreamBooth Modell! full_prompt = f"underwater bioluminescence creature, {prompt}" # Seed handling if seed == -1: seed = random.randint(0, 2**32 - 1) generator = torch.Generator(device="cuda").manual_seed(seed) try: # Generiere das Bild with torch.no_grad(): result = current_pipe( prompt=full_prompt, negative_prompt=negative_prompt, num_inference_steps=int(num_inference_steps), guidance_scale=guidance_scale, width=int(width), height=int(height), generator=generator ) image = result.images[0] return image, seed except Exception as e: print(f"Error during generation: {e}") # Fallback: Erstelle ein einfaches Bild mit Fehlermeldung error_img = Image.new('RGB', (int(width), int(height)), color='navy') return error_img, seed finally: # GPU wieder freigeben current_pipe.to("cpu") torch.cuda.empty_cache() def get_random_prompt(): return random.choice(example_prompts) # CSS für schönere Optik css = """ .gradio-container { font-family: 'Helvetica Neue', Arial, sans-serif; } .title { text-align: center; color: #0077be; margin-bottom: 20px; } .description { text-align: center; margin-bottom: 20px; color: #666; } """ # Gradio Interface with gr.Blocks(css=css, theme=gr.themes.Soft()) as demo: gr.HTML("
Generate mystical underwater creatures with bioluminescent features using a fine-tuned Stable Diffusion model.
") with gr.Row(): with gr.Column(scale=1): prompt = gr.Textbox( label="Prompt", placeholder="Describe your underwater creature...", lines=3, value="a majestic jellyfish with glowing tentacles" ) negative_prompt = gr.Textbox( label="Negative Prompt (Optional)", placeholder="What you don't want to see...", lines=2, value="blurry, low quality, distorted, ugly, bad anatomy" ) with gr.Row(): random_prompt_btn = gr.Button("🎲 Random Prompt", size="sm") generate_btn = gr.Button("🎨 Generate SeaCreature", variant="primary", size="lg") with gr.Accordion("Advanced Settings", open=False): num_inference_steps = gr.Slider( label="Inference Steps", minimum=10, maximum=50, step=5, value=25, info="More steps = better quality but slower" ) guidance_scale = gr.Slider( label="Guidance Scale", minimum=1.0, maximum=20.0, step=0.5, value=7.5, info="Higher values follow prompt more closely" ) with gr.Row(): width = gr.Slider( label="Width", minimum=256, maximum=768, step=64, value=512 ) height = gr.Slider( label="Height", minimum=256, maximum=768, step=64, value=512 ) seed = gr.Number( label="Seed (-1 for random)", value=-1, precision=0 ) with gr.Column(scale=1): output_image = gr.Image( label="Generated SeaCreature", type="pil", height=512 ) used_seed = gr.Number( label="Used Seed", interactive=False ) # Example Gallery gr.HTML("💡 Tips:
• The model automatically adds "underwater bioluminescence creature" to your prompt
• Try describing colors, shapes, and lighting effects for best results
• Use negative prompts to avoid unwanted elements
• Model created by @arnomatic