CodeKing555's picture
Update app.py
2c362fc verified
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()