CodeKing555 commited on
Commit
2c362fc
·
verified ·
1 Parent(s): bddee0a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +39 -30
app.py CHANGED
@@ -13,36 +13,37 @@ pipe = StableDiffusionInpaintPipeline.from_pretrained(
13
  MODEL_ID,
14
  torch_dtype=torch.float32
15
  )
16
- # CPU-Modus (gratis, aber langsam); wenn GPU verfügbar, kannst du pipe.to("cuda") nutzen
17
  pipe.to("cpu")
18
 
19
- # Reduziere die Anzahl Inference-Schritte (Default wäre ~50)
20
  DEFAULT_STEPS = 20
 
 
21
 
22
  # ------------------------------------------------------------------------------
23
- # 2) INPAINT-FUNKTION
24
  # ------------------------------------------------------------------------------
25
- def inpaint_room(original_image, prompt):
26
  """
27
- Führt ein Inpainting auf dem gesamten Bild durch:
28
- - 'mask_image' = original_image => Alles darf überschrieben werden.
29
- - Wir verkleinern das Bild auf 512x512 und reduzieren num_inference_steps,
30
- um Zeit zu sparen.
31
  """
32
-
33
- if original_image is None:
34
  return None
35
 
36
- # 1) Bild auf 512x512 verkleinern
37
- original_image = original_image.resize((512, 512), resample=Image.LANCZOS)
 
38
 
39
- # 2) Inference-Aufruf mit weniger Schritten
40
  result = pipe(
41
  prompt=prompt,
42
- image=original_image,
43
- mask_image=original_image,
44
  num_inference_steps=DEFAULT_STEPS,
45
- guidance_scale=7.5 # optionaler Wert, typisch ~7.5
46
  ).images[0]
47
 
48
  return result
@@ -52,40 +53,48 @@ def inpaint_room(original_image, prompt):
52
  # ------------------------------------------------------------------------------
53
  def build_app():
54
  with gr.Blocks() as demo:
55
- gr.Markdown("## 🏠 KI-basiertes Virtual Home Staging (Demo, schnellere Variante)")
56
  gr.Markdown(
57
- "Lade ein Foto hoch (leer oder wenige Möbel) "
58
- "und gib einen Stil an (z.B. 'modern furniture, bright lighting').<br>"
59
- "**Achtung:** Auf CPU dauert es evtl. immer noch einige Sekunden."
 
 
60
  )
61
 
62
  with gr.Row():
63
  with gr.Column():
64
  input_image = gr.Image(
65
- label="Schritt 1: Dein Zimmerfoto",
 
 
 
 
 
66
  type="pil"
67
  )
68
  prompt_text = gr.Textbox(
69
- label="Schritt 2: Was soll eingefügt werden?",
70
- value="modern furniture, bright lighting, minimal decor",
71
  lines=2
72
  )
73
- run_button = gr.Button("Starte Staging")
74
 
75
  with gr.Column():
76
  result_image = gr.Image(label="Ergebnis")
77
 
 
78
  run_button.click(
79
- fn=inpaint_room,
80
- inputs=[input_image, prompt_text],
81
  outputs=[result_image]
82
  )
83
 
84
  gr.Markdown(
85
- "**Hinweis:**\n"
86
- "- Dies ist eine schnelle Demo: Das Bild wird verkleinert (512×512) und nur 20 Schritte berechnet.\n"
87
- "- Für bessere Qualität ggf. mehr Inference-Steps und höhere Auflösungen, dann dauert es länger.\n"
88
- "- Wenn eine Community-GPU verfügbar ist, geht es wesentlich schneller."
89
  )
90
 
91
  return demo
 
13
  MODEL_ID,
14
  torch_dtype=torch.float32
15
  )
16
+ # CPU-Modus (gratis, aber langsam); wenn GPU verfügbar, pipe.to("cuda") für schnellere Ergebnisse
17
  pipe.to("cpu")
18
 
19
+ # Wir reduzieren z. B. die Inference-Steps, damit es schneller geht
20
  DEFAULT_STEPS = 20
21
+ GUIDANCE_SCALE = 7.5
22
+ IMG_SIZE = 512 # Wir verkleinern Bilder auf 512x512, um CPU-Zeit zu sparen
23
 
24
  # ------------------------------------------------------------------------------
25
+ # 2) INPAINT-FUNKTION mit manuellem Masking
26
  # ------------------------------------------------------------------------------
27
+ def inpaint_masked(img, mask, prompt):
28
  """
29
+ Nimmt ein Originalbild (img) + eine vom User gezeichnete Maske (mask).
30
+ Nur in maskierten Bereichen wird etwas verändert, z. B. Möbel eingefügt.
31
+ Der Rest bleibt unverändert.
 
32
  """
33
+ if img is None or mask is None:
 
34
  return None
35
 
36
+ # 1) Auf 512x512 verkleinern (Bild & Maske gleich groß halten!)
37
+ img = img.resize((IMG_SIZE, IMG_SIZE), resample=Image.LANCZOS)
38
+ mask = mask.resize((IMG_SIZE, IMG_SIZE), resample=Image.LANCZOS)
39
 
40
+ # 2) Pipeline-Aufruf
41
  result = pipe(
42
  prompt=prompt,
43
+ image=img,
44
+ mask_image=mask,
45
  num_inference_steps=DEFAULT_STEPS,
46
+ guidance_scale=GUIDANCE_SCALE
47
  ).images[0]
48
 
49
  return result
 
53
  # ------------------------------------------------------------------------------
54
  def build_app():
55
  with gr.Blocks() as demo:
56
+ gr.Markdown("# 🏠 Virtuelles Home Staging mit manueller Maske")
57
  gr.Markdown(
58
+ "1. Lade dein Zimmerfoto hoch.\n"
59
+ "2. **Male in der Maske** die Bereiche aus, wo Möbel erscheinen sollen.\n"
60
+ " - Weiß = Hier darf die KI etwas ändern.\n"
61
+ " - Schwarz = Bleibt unverändert.\n"
62
+ "3. Prompt eingeben, auf **Inpaint** klicken."
63
  )
64
 
65
  with gr.Row():
66
  with gr.Column():
67
  input_image = gr.Image(
68
+ label="(1) Zimmerfoto hochladen",
69
+ type="pil"
70
+ )
71
+ mask_image = gr.Image(
72
+ label="(2) Maske hier zeichnen (weiß = veränderbar)",
73
+ tool="sketch", # erlaubt freies Zeichnen
74
  type="pil"
75
  )
76
  prompt_text = gr.Textbox(
77
+ label="(3) Prompt: Was soll eingefügt werden?",
78
+ value="Add modern furniture, keep walls the same",
79
  lines=2
80
  )
81
+ run_button = gr.Button("Inpaint")
82
 
83
  with gr.Column():
84
  result_image = gr.Image(label="Ergebnis")
85
 
86
+ # Button-Event: Klick -> inpaint_masked()
87
  run_button.click(
88
+ fn=inpaint_masked,
89
+ inputs=[input_image, mask_image, prompt_text],
90
  outputs=[result_image]
91
  )
92
 
93
  gr.Markdown(
94
+ "**Tipps:**\n"
95
+ "- Standard-Inpainting erfordert weiße Stellen für Bereiche, die verändert werden dürfen.\n"
96
+ "- Du kannst z. B. nur den Fußboden weiß maskieren, damit dort Möbel entstehen.\n"
97
+ "- Für bessere Qualität könntest du `DEFAULT_STEPS` oder `IMG_SIZE` anpassen."
98
  )
99
 
100
  return demo