Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import torch | |
| from diffusers import StableDiffusionInpaintPipeline | |
| from PIL import Image | |
| # ------------------------------------------------------------------------------ | |
| # 1) PIPELINE LADEN | |
| # ------------------------------------------------------------------------------ | |
| MODEL_ID = "runwayml/stable-diffusion-inpainting" | |
| print("Lade Inpainting-Pipeline... (kann einen Moment dauern)") | |
| pipe = StableDiffusionInpaintPipeline.from_pretrained( | |
| MODEL_ID, | |
| torch_dtype=torch.float32 | |
| ) | |
| # CPU-Modus (gratis, aber langsam); wenn GPU verfügbar, pipe.to("cuda") für schnellere Ergebnisse | |
| pipe.to("cpu") | |
| # Wir reduzieren z. B. die Inference-Steps, damit es schneller geht | |
| DEFAULT_STEPS = 20 | |
| GUIDANCE_SCALE = 7.5 | |
| IMG_SIZE = 512 # Wir verkleinern Bilder auf 512x512, um CPU-Zeit zu sparen | |
| # ------------------------------------------------------------------------------ | |
| # 2) INPAINT-FUNKTION mit manuellem Masking | |
| # ------------------------------------------------------------------------------ | |
| def inpaint_masked(img, mask, prompt): | |
| """ | |
| Nimmt ein Originalbild (img) + eine vom User gezeichnete Maske (mask). | |
| Nur in maskierten Bereichen wird etwas verändert, z. B. Möbel eingefügt. | |
| Der Rest bleibt unverändert. | |
| """ | |
| if img is None or mask is None: | |
| return None | |
| # 1) Auf 512x512 verkleinern (Bild & Maske gleich groß halten!) | |
| img = img.resize((IMG_SIZE, IMG_SIZE), resample=Image.LANCZOS) | |
| mask = mask.resize((IMG_SIZE, IMG_SIZE), resample=Image.LANCZOS) | |
| # 2) Pipeline-Aufruf | |
| result = pipe( | |
| prompt=prompt, | |
| image=img, | |
| mask_image=mask, | |
| num_inference_steps=DEFAULT_STEPS, | |
| guidance_scale=GUIDANCE_SCALE | |
| ).images[0] | |
| return result | |
| # ------------------------------------------------------------------------------ | |
| # 3) GRADIO INTERFACE | |
| # ------------------------------------------------------------------------------ | |
| def build_app(): | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# 🏠 Virtuelles Home Staging mit manueller Maske") | |
| gr.Markdown( | |
| "1. Lade dein Zimmerfoto hoch.\n" | |
| "2. **Male in der Maske** die Bereiche aus, wo Möbel erscheinen sollen.\n" | |
| " - Weiß = Hier darf die KI etwas ändern.\n" | |
| " - Schwarz = Bleibt unverändert.\n" | |
| "3. Prompt eingeben, auf **Inpaint** klicken." | |
| ) | |
| with gr.Row(): | |
| with gr.Column(): | |
| input_image = gr.Image( | |
| label="(1) Zimmerfoto hochladen", | |
| type="pil" | |
| ) | |
| mask_image = gr.Image( | |
| label="(2) Maske hier zeichnen (weiß = veränderbar)", | |
| tool="sketch", # erlaubt freies Zeichnen | |
| type="pil" | |
| ) | |
| prompt_text = gr.Textbox( | |
| label="(3) Prompt: Was soll eingefügt werden?", | |
| value="Add modern furniture, keep walls the same", | |
| lines=2 | |
| ) | |
| run_button = gr.Button("Inpaint") | |
| with gr.Column(): | |
| result_image = gr.Image(label="Ergebnis") | |
| # Button-Event: Klick -> inpaint_masked() | |
| run_button.click( | |
| fn=inpaint_masked, | |
| inputs=[input_image, mask_image, prompt_text], | |
| outputs=[result_image] | |
| ) | |
| gr.Markdown( | |
| "**Tipps:**\n" | |
| "- Standard-Inpainting erfordert weiße Stellen für Bereiche, die verändert werden dürfen.\n" | |
| "- Du kannst z. B. nur den Fußboden weiß maskieren, damit dort Möbel entstehen.\n" | |
| "- Für bessere Qualität könntest du `DEFAULT_STEPS` oder `IMG_SIZE` anpassen." | |
| ) | |
| return demo | |
| # ------------------------------------------------------------------------------ | |
| # 4) START | |
| # ------------------------------------------------------------------------------ | |
| demo = build_app() | |
| if __name__ == "__main__": | |
| demo.launch() | |