Astridkraft commited on
Commit
e7fd276
·
verified ·
1 Parent(s): 606b3d4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +95 -7
app.py CHANGED
@@ -346,18 +346,106 @@ def main_ui():
346
  margin: 15px 0;
347
  border-left: 4px solid #4caf50;
348
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
349
  """
350
  ) as demo:
351
 
352
- # --- Info-Bereich ---
353
- gr.Markdown("# AI Image Generator")
354
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
355
  with gr.Row():
356
- with gr.Column(scale=1):
357
  pass
358
- with gr.Column(scale=1, min_width=300):
359
- start_btn = gr.Button("Weiter zur Anwendung", variant="primary", size="lg")
360
- with gr.Column(scale=1):
 
 
 
 
 
361
  pass
362
 
363
  # --- Hauptanwendungsbereich ---
 
346
  margin: 15px 0;
347
  border-left: 4px solid #4caf50;
348
  }
349
+ .clickable-file {
350
+ color: #8B7355;
351
+ text-decoration: underline;
352
+ font-weight: bold;
353
+ }
354
+ .clickable-file:hover {
355
+ color: #6b5a45;
356
+ }
357
+ #start-button {
358
+ background-color: #8B7355;
359
+ color: white;
360
+ border: none;
361
+ }
362
+ #start-button:hover {
363
+ background-color: #6b5a45;
364
+ }
365
  """
366
  ) as demo:
367
 
368
+ # --- Info-Bereich (Startseite) ---
369
+ gr.Markdown(
370
+ """
371
+ # Demo-Projekt: Stable Diffusion Text-to-Image / Image-to-Image
372
+ <br>
373
+
374
+ <div class="info-box">
375
+ Dieses Projekt ist ein kleines <strong>Demo</strong> um meine Fähigkeiten als <strong>AI-Engineer</strong>
376
+ in technischer Kompetenz und selbstständiger Projektstrukturierung zu zeigen.<br>
377
+ Der Fokus liegt auf <strong>Struktur, Konzept und technischer Umsetzung</strong>
378
+ im Bereich Text-to-Image / Image-to-Image mit dem Diffusionsmodell "Stable Diffusion" <br>
379
+ <strong>nicht</strong> auf einer vollständigen Produktionsversion.
380
+ </div>
381
+ <br>
382
+
383
+ <div class="info-box">
384
+ Zudem führt der Link
385
+ <a class="clickable-file" href="https://huggingface.co/spaces/Astridkraft/Dokumentation" target="_blank">Roadmap</a>
386
+ zu einer <strong>durchdachten, skalierbaren, professionellen Code-Architektur</strong> für Text-to-Image- und Image-to-Image-Entwicklung <br>
387
+ die die <strong>gesamte Komplexität einer professionellen Umsetzung</strong> verdeutlicht.<br><br>
388
+ Die damit gezeigten Fähigkeiten meinerseits sind <strong>sicherlich auf andere Projekte übertragbar</strong>.
389
+ </div>
390
+ <br><br>
391
+
392
+ <div class="info-box">
393
+ <strong>Hinweis:</strong><br>
394
+ Die Anwendung läuft derzeit auf <strong>CPU</strong> ist jedoch <strong>vollständig GPU-fähig </strong>.
395
+ Deshalb muss bei jeder Generierung eine <strong>längere Wartezeit</strong> eingeplant werden.<br>
396
+ Bei <strong>Verbindungsabbrüchen</strong> -insbesondere bei CPU-Nutzung- wird die aktuelle Generierung zunächst serverseitig vollständig abgeschlossen, <br>
397
+ bevor neue Anfragen bearbeitet werden. Das generierte Bild wird in diesem Fall <strong>nicht angezeigt</strong>.
398
+ Die Meldung <strong>Connection re-established</strong> signalisiert, dass <br>
399
+ die Verbindung wiederhergestellt wurde, die laufende Verarbeitung jedoch priorisiert wird. In der Konsequenz werden neue <br>
400
+ Generierungsanfragen in eine Warteschlange gestellt und erst nach vollständigem Abschluss der aktuellen serverseitigen Berechnung verarbeitet.
401
+ </div>
402
+ <br>
403
+
404
+ <div class="info-box">
405
+ <strong>Technischer Hintergrund:</strong> <br>
406
+ Es handelt sich um einen bekannten <strong>Gradio-Bug</strong> - das Framework bietet keine Möglichkeit, generierte Bilder zwischenzuspeichern <br>
407
+ um sie bei UI-Neuladung aus dem Zwischenspeicher zurückzugeben. Dies macht sich <strong>besonders bei CPU-Nutzung bemerkbar</strong>, <br>
408
+ da die Transformationszeiten hier deutlich länger sind und es dadurch vermehrt zu Timeouts und daraus resultierenden UI-Abbrüchen kommen kann.<br>
409
+ Aus diesem Grund kann das Ergebnis nicht an die neu geladene Benutzeroberfläche übermittelt werden obwohl die Bildgenerierung serverseitig <br>
410
+ vollständig abgeschlossen wird.
411
+ </div>
412
+ <br>
413
+
414
+ <div class="info-box">
415
+ <strong>Anwendungsbereich:</strong><br>
416
+ Die <strong>Bild-zu-Bild-Funktion</strong> ermöglicht eine gezielte Bearbeitung eines <strong>beliebigen Objektes oder Bereiches</strong> in einem Bild.<br>
417
+ Sie unterstützt zwei Modi:<br>
418
+ &nbsp;&nbsp;• <strong>Beibehaltung eines ausgewählten Bildbereiches innerhalb eines Rechtecks</strong> (z. B. Gesicht, Objekt, Tier, Gegenstand) bei Veränderung des Rests,<br>
419
+ &nbsp;&nbsp;• oder <strong>Veränderung des rechteckigen Bildbereiches</strong> bei Erhaltung der Umgebung.<br>
420
+ <br>
421
+ <strong>Wichtig:</strong> Das Objekt das beibehalten oder verändert werden soll - je nach gewähltem Modus - muss <strong>im Prompt</strong> klar beschrieben werden.<br>
422
+ Die Verwendung eines <strong>Negativ-Promptes</strong> ist sinnvoll, um unerwünschte Veränderungen zu vermeiden.
423
+ </div>
424
+ <br>
425
+
426
+ <div class="info-box">
427
+ <strong>Empfehlung:</strong><br>
428
+ Für eine präzise Abstimmung der zentralen Parameter – Prompt, Negativ-Prompt, Veränderungsstärke (Strength), Inferenz-Schritte (Steps) <br>
429
+ und Prompt-Stärke (Guidance) – liefern leistungsfähige Sprachmodelle wie GPT, Grok oder DeepSeek hochqualitative, kontextbezogene Vorschläge.<br>
430
+ Prompt und Negativ-Prompt sollten auf <strong>Englisch</strong> eingegeben werden, da "Stable Diffusion" mit Bild-Text-Paaren auf Englisch trainiert <br>
431
+ wurde und CLIP einen Tokenizer für ein englisches Vokabular nutzt. Der CLIP-Tokenizer hat außerdem ein <strong>Limit von 77 Token</strong>, wodurch längere <br>
432
+ Prompteingaben automatisch abgeschnitten werden. Deutsche Wörter werden zwar übersetzt, führen aber zu Verzerrungen.
433
+ </div>
434
+ """
435
+ )
436
+
437
+ # --- Button zentriert im unteren Drittel, Taupe-Farbe ---
438
  with gr.Row():
439
+ with gr.Column(scale=1): # Linker Leerraum
440
  pass
441
+ with gr.Column(scale=1, min_width=300): # Mittig, feste Mindestbreite
442
+ start_btn = gr.Button(
443
+ "Weiter zur Anwendung",
444
+ variant="primary",
445
+ size="lg",
446
+ elem_id="start-button"
447
+ )
448
+ with gr.Column(scale=1): # Rechter Leerraum
449
  pass
450
 
451
  # --- Hauptanwendungsbereich ---