Astridkraft commited on
Commit
04b9bad
·
verified ·
1 Parent(s): d8f343b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +36 -35
app.py CHANGED
@@ -28,11 +28,11 @@ def create_face_mask(image, bbox_coords, face_preserve):
28
  # GESICHTSERHALTUNG: Maske um das Gesicht herum zeichnen
29
  draw.rectangle([0, 0, image.size[0], image.size[1]], fill=255) # Alles weiß = verändern
30
  draw.rectangle([x1, y1, x2, y2], fill=0) # Gesicht schwarz = geschützt (rechteckig)
31
- print("Gesicht wird GESCHÜTZT - Umgebung wird verändert (rechteckige Maske)")
32
  else:
33
  # NUR GESICHT VERÄNDERN: Nur das Gesicht wird weiß (verändert)
34
  draw.rectangle([x1, y1, x2, y2], fill=255) # Gesicht weiß = verändern (rechteckig)
35
- print("Nur Gesicht wird verändert - Umgebung bleibt erhalten (rechteckige Maske)")
36
 
37
  return mask
38
 
@@ -49,7 +49,7 @@ def auto_detect_face_area(image):
49
  # Stelle sicher, dass Koordinaten innerhalb des Bildes liegen
50
  x1, y1 = max(0, int(x1)), max(0, int(y1))
51
  x2, y2 = min(width, int(x2)), min(height, int(y2))
52
- print(f"Geschätzte Gesichtskoordinaten: [{x1}, {y1}, {x2}, {y2}]")
53
  return [x1, y1, x2, y2]
54
 
55
  # === PIPELINES ===
@@ -86,7 +86,7 @@ def load_img2img():
86
  safety_checker=None
87
  ).to(device)
88
  except Exception as e:
89
- print(f"Fehler beim Laden des Modells: {e}")
90
  raise
91
 
92
 
@@ -104,6 +104,20 @@ def load_img2img():
104
 
105
  return pipe_img2img
106
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
  # === FUNKTIONEN ===
108
  def text_to_image(prompt, steps, guidance_scale):
109
  try:
@@ -118,7 +132,7 @@ def text_to_image(prompt, steps, guidance_scale):
118
  # ZUFÄLLIGER SEED für Variation
119
  seed = random.randint(0, 2**32 - 1)
120
  generator = torch.Generator(device=device).manual_seed(seed)
121
- print(f"🎲 Using seed: {seed}")
122
 
123
  image = pipe(
124
  prompt=prompt,
@@ -130,12 +144,13 @@ def text_to_image(prompt, steps, guidance_scale):
130
  ).images[0]
131
 
132
  end_time = time.time()
133
- print(f"Bild generiert in {end_time - start_time:.2f} Sekunden")
134
 
135
- return image
 
136
 
137
  except Exception as e:
138
- print(f"Fehler: {e}")
139
  import traceback
140
  traceback.print_exc()
141
  return None
@@ -145,7 +160,7 @@ def img_to_image(image, prompt, neg_prompt, strength, steps, guidance_scale, fac
145
  if image is None:
146
  return None
147
 
148
- print(f"🧩 Img2Img Start → Strength: {strength}, Steps: {steps}, Guidance: {guidance_scale}")
149
  print(f"Prompt: {prompt}")
150
  print(f"Gesicht beibehalten: {face_preserve}")
151
  start_time = time.time()
@@ -160,7 +175,7 @@ def img_to_image(image, prompt, neg_prompt, strength, steps, guidance_scale, fac
160
  # ZUFÄLLIGER SEED für Variation
161
  seed = random.randint(0, 2**32 - 1)
162
  generator = torch.Generator(device=device).manual_seed(seed)
163
- print(f"🎲 Using seed: {seed}")
164
 
165
  # --- GESICHTSMASKE ---
166
  mask = None
@@ -179,15 +194,15 @@ def img_to_image(image, prompt, neg_prompt, strength, steps, guidance_scale, fac
179
  int(bbox_y2 * scale_y)
180
  ]
181
  bbox_coords = scaled_coords
182
- print(f"📐 Skalierte Koordinaten: {scaled_coords}")
183
 
184
  # Maskenlogik basierend auf face_preserve
185
  if bbox_coords:
186
  mask = create_face_mask(img_resized, bbox_coords, face_preserve)
187
  if mask:
188
- print("Maske erfolgreich erstellt")
189
  else:
190
- print("⚠️ Keine gültigen Koordinaten - keine Maske angewendet")
191
  mask = None
192
 
193
  # --- PIPELINE-AUFRUF ---
@@ -203,25 +218,15 @@ def img_to_image(image, prompt, neg_prompt, strength, steps, guidance_scale, fac
203
  )
204
 
205
  end_time = time.time()
206
- print(f"Bild transformiert in {end_time - start_time:.2f} Sekunden")
207
 
208
  generated_image = result.images[0]
209
 
210
- # Temp-Speicherung
211
- try:
212
- temp_dir = "/tmp/gradio_fallback"
213
- os.makedirs(temp_dir, exist_ok=True)
214
- temp_path = os.path.join(temp_dir, f"generated_{int(time.time())}.png")
215
- generated_image.save(temp_path, "PNG")
216
- saved_image = Image.open(temp_path)
217
- except Exception as temp_error:
218
- print(f"⚠️ Temp-Speicherung fehlgeschlagen: {temp_error}")
219
- saved_image = generated_image
220
-
221
- return saved_image
222
 
223
  except Exception as e:
224
- print(f"Fehler: {e}")
225
  import traceback
226
  traceback.print_exc()
227
  return None
@@ -270,7 +275,6 @@ def main_ui():
270
  gr.Markdown(
271
  """
272
  # Demo-Projekt: Stable Diffusion Text-to-Image / Image-to-Image
273
-
274
  <br>
275
 
276
  <div class="info-box">
@@ -287,7 +291,6 @@ def main_ui():
287
  die die <br><strong>gesamte Komplexität einer professionellen Umsetzung</strong> verdeutlicht.<br><br>
288
  Die damit gezeigten Fähigkeiten meinerseits sind <strong>sicherlich auf andere Projekte übertragbar</strong>.
289
  </div>
290
-
291
  <br><br>
292
 
293
  <div class="info-box">
@@ -299,7 +302,6 @@ def main_ui():
299
  generierte Bild wird in diesem Fall <strong>nicht angezeigt</strong>. Dies gewährleistet die Stabilität des Systems und verhindert Ressourcenkonflikte. <br>
300
  Die Meldung "Connection re-established" zeigt an, dass die Verbindung wiederhergestellt wurde, die laufende Verarbeitung jedoch priorisiert wird.
301
  </div>
302
-
303
  <br>
304
 
305
  <div class="info-box">
@@ -308,7 +310,6 @@ def main_ui():
308
  &nbsp;&nbsp;• die gezielte <strong>Veränderung des Gesichts</strong> bei erhaltener Umgebung, oder<br>
309
  &nbsp;&nbsp;• den <strong>Schutz des Motivs</strong>, während nur der <strong>Hintergrund angepasst</strong> wird.
310
  </div>
311
-
312
  <br><br>
313
 
314
  <div class="info-box">
@@ -360,7 +361,7 @@ def main_ui():
360
  info="Wie stark der Prompt befolgt wird (7-12 für gute Balance)"
361
  )
362
 
363
- generate_btn = gr.Button("🎨 Bild generieren", variant="primary")
364
  txt_output = gr.Image(
365
  label="Generiertes Bild",
366
  show_download_button=True
@@ -422,13 +423,13 @@ def main_ui():
422
  # GESICHTSOPTIONEN
423
  with gr.Row():
424
  face_preserve = gr.Checkbox(
425
- label="👤 Gesicht beibehalten",
426
  value=True,
427
  info="Aktiviert: Gesicht bleibt erhalten, Hintergrund wird verändert | Deaktiviert: Nur Gesicht wird verändert"
428
  )
429
 
430
  with gr.Row():
431
- gr.Markdown("**🔍 Gesichtsbereich anpassen**")
432
 
433
  with gr.Row():
434
  bbox_x1 = gr.Number(
@@ -467,7 +468,7 @@ def main_ui():
467
  )
468
 
469
 
470
- transform_btn = gr.Button("🔄 Bild transformieren", variant="primary")
471
 
472
  with gr.Row():
473
  img_output = gr.Image(
 
28
  # GESICHTSERHALTUNG: Maske um das Gesicht herum zeichnen
29
  draw.rectangle([0, 0, image.size[0], image.size[1]], fill=255) # Alles weiß = verändern
30
  draw.rectangle([x1, y1, x2, y2], fill=0) # Gesicht schwarz = geschützt (rechteckig)
31
+ print("Gesicht wird GESCHÜTZT - Umgebung wird verändert (rechteckige Maske)")
32
  else:
33
  # NUR GESICHT VERÄNDERN: Nur das Gesicht wird weiß (verändert)
34
  draw.rectangle([x1, y1, x2, y2], fill=255) # Gesicht weiß = verändern (rechteckig)
35
+ print("Nur Gesicht wird verändert - Umgebung bleibt erhalten (rechteckige Maske)")
36
 
37
  return mask
38
 
 
49
  # Stelle sicher, dass Koordinaten innerhalb des Bildes liegen
50
  x1, y1 = max(0, int(x1)), max(0, int(y1))
51
  x2, y2 = min(width, int(x2)), min(height, int(y2))
52
+ print(f"Geschätzte Gesichtskoordinaten: [{x1}, {y1}, {x2}, {y2}]")
53
  return [x1, y1, x2, y2]
54
 
55
  # === PIPELINES ===
 
86
  safety_checker=None
87
  ).to(device)
88
  except Exception as e:
89
+ print(f"Fehler beim Laden des Modells: {e}")
90
  raise
91
 
92
 
 
104
 
105
  return pipe_img2img
106
 
107
+ # === HILFSFUNKTION FÜR ROBUSTE ZWISCHENSPEICHERUNG ===
108
+ def save_with_fallback(image):
109
+ """Speichert Bild temporär und gibt geladenes Image zurück (für Gradio-Stabilität)"""
110
+ try:
111
+ temp_dir = "/tmp/gradio_fallback"
112
+ os.makedirs(temp_dir, exist_ok=True)
113
+ fd, path = tempfile.mkstemp(suffix=".png", dir=temp_dir)
114
+ os.close(fd)
115
+ image.save(path, "PNG")
116
+ return Image.open(path)
117
+ except Exception as e:
118
+ print(f"Temp-Speicherung fehlgeschlagen: {e}")
119
+ return image
120
+
121
  # === FUNKTIONEN ===
122
  def text_to_image(prompt, steps, guidance_scale):
123
  try:
 
132
  # ZUFÄLLIGER SEED für Variation
133
  seed = random.randint(0, 2**32 - 1)
134
  generator = torch.Generator(device=device).manual_seed(seed)
135
+ print(f"Using seed: {seed}")
136
 
137
  image = pipe(
138
  prompt=prompt,
 
144
  ).images[0]
145
 
146
  end_time = time.time()
147
+ print(f"Bild generiert in {end_time - start_time:.2f} Sekunden")
148
 
149
+ # Robuste Zwischenspeicherung
150
+ return save_with_fallback(image)
151
 
152
  except Exception as e:
153
+ print(f"Fehler: {e}")
154
  import traceback
155
  traceback.print_exc()
156
  return None
 
160
  if image is None:
161
  return None
162
 
163
+ print(f"Img2Img Start → Strength: {strength}, Steps: {steps}, Guidance: {guidance_scale}")
164
  print(f"Prompt: {prompt}")
165
  print(f"Gesicht beibehalten: {face_preserve}")
166
  start_time = time.time()
 
175
  # ZUFÄLLIGER SEED für Variation
176
  seed = random.randint(0, 2**32 - 1)
177
  generator = torch.Generator(device=device).manual_seed(seed)
178
+ print(f"Using seed: {seed}")
179
 
180
  # --- GESICHTSMASKE ---
181
  mask = None
 
194
  int(bbox_y2 * scale_y)
195
  ]
196
  bbox_coords = scaled_coords
197
+ print(f"Skalierte Koordinaten: {scaled_coords}")
198
 
199
  # Maskenlogik basierend auf face_preserve
200
  if bbox_coords:
201
  mask = create_face_mask(img_resized, bbox_coords, face_preserve)
202
  if mask:
203
+ print("Maske erfolgreich erstellt")
204
  else:
205
+ print("Keine gültigen Koordinaten - keine Maske angewendet")
206
  mask = None
207
 
208
  # --- PIPELINE-AUFRUF ---
 
218
  )
219
 
220
  end_time = time.time()
221
+ print(f"Bild transformiert in {end_time - start_time:.2f} Sekunden")
222
 
223
  generated_image = result.images[0]
224
 
225
+ # Robuste Zwischenspeicherung
226
+ return save_with_fallback(generated_image)
 
 
 
 
 
 
 
 
 
 
227
 
228
  except Exception as e:
229
+ print(f"Fehler: {e}")
230
  import traceback
231
  traceback.print_exc()
232
  return None
 
275
  gr.Markdown(
276
  """
277
  # Demo-Projekt: Stable Diffusion Text-to-Image / Image-to-Image
 
278
  <br>
279
 
280
  <div class="info-box">
 
291
  die die <br><strong>gesamte Komplexität einer professionellen Umsetzung</strong> verdeutlicht.<br><br>
292
  Die damit gezeigten Fähigkeiten meinerseits sind <strong>sicherlich auf andere Projekte übertragbar</strong>.
293
  </div>
 
294
  <br><br>
295
 
296
  <div class="info-box">
 
302
  generierte Bild wird in diesem Fall <strong>nicht angezeigt</strong>. Dies gewährleistet die Stabilität des Systems und verhindert Ressourcenkonflikte. <br>
303
  Die Meldung "Connection re-established" zeigt an, dass die Verbindung wiederhergestellt wurde, die laufende Verarbeitung jedoch priorisiert wird.
304
  </div>
 
305
  <br>
306
 
307
  <div class="info-box">
 
310
  &nbsp;&nbsp;• die gezielte <strong>Veränderung des Gesichts</strong> bei erhaltener Umgebung, oder<br>
311
  &nbsp;&nbsp;• den <strong>Schutz des Motivs</strong>, während nur der <strong>Hintergrund angepasst</strong> wird.
312
  </div>
 
313
  <br><br>
314
 
315
  <div class="info-box">
 
361
  info="Wie stark der Prompt befolgt wird (7-12 für gute Balance)"
362
  )
363
 
364
+ generate_btn = gr.Button("Bild generieren", variant="primary")
365
  txt_output = gr.Image(
366
  label="Generiertes Bild",
367
  show_download_button=True
 
423
  # GESICHTSOPTIONEN
424
  with gr.Row():
425
  face_preserve = gr.Checkbox(
426
+ label="Gesicht beibehalten",
427
  value=True,
428
  info="Aktiviert: Gesicht bleibt erhalten, Hintergrund wird verändert | Deaktiviert: Nur Gesicht wird verändert"
429
  )
430
 
431
  with gr.Row():
432
+ gr.Markdown("**Gesichtsbereich anpassen**")
433
 
434
  with gr.Row():
435
  bbox_x1 = gr.Number(
 
468
  )
469
 
470
 
471
+ transform_btn = gr.Button("Bild transformieren", variant="primary")
472
 
473
  with gr.Row():
474
  img_output = gr.Image(