Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -104,8 +104,8 @@ def load_img2img():
|
|
| 104 |
|
| 105 |
return pipe_img2img
|
| 106 |
|
| 107 |
-
# === CALLBACK-
|
| 108 |
-
class
|
| 109 |
def __init__(self, progress, total_steps):
|
| 110 |
self.progress = progress
|
| 111 |
self.total_steps = total_steps
|
|
@@ -114,10 +114,35 @@ class ProgressCallback:
|
|
| 114 |
def __call__(self, step, timestep, latents):
|
| 115 |
self.current_step = step + 1
|
| 116 |
progress_percent = (step / self.total_steps) * 100
|
| 117 |
-
#self.progress(progress_percent / 100, desc=f"Transformation läuft... {progress_percent:.1f}%")
|
| 118 |
self.progress(progress_percent / 100, desc="Generierung läuft - CPU benötigt bis zu 6 Minuten!")
|
| 119 |
return False
|
| 120 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
# === FUNKTIONEN ===
|
| 122 |
def text_to_image(prompt, steps, guidance_scale, progress=gr.Progress()):
|
| 123 |
try:
|
|
@@ -138,7 +163,7 @@ def text_to_image(prompt, steps, guidance_scale, progress=gr.Progress()):
|
|
| 138 |
print(f"Using seed: {seed}")
|
| 139 |
|
| 140 |
# Progress Callback hinzufügen
|
| 141 |
-
callback =
|
| 142 |
|
| 143 |
image = pipe(
|
| 144 |
prompt=prompt,
|
|
@@ -216,8 +241,20 @@ def img_to_image(image, prompt, neg_prompt, strength, steps, guidance_scale, fac
|
|
| 216 |
print("Keine gültigen Koordinaten - keine Maske angewendet")
|
| 217 |
mask = None
|
| 218 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 219 |
# Progress Callback hinzufügen
|
| 220 |
-
callback =
|
| 221 |
|
| 222 |
# --- PIPELINE-AUFRUF ---
|
| 223 |
result = pipe(
|
|
@@ -232,6 +269,21 @@ def img_to_image(image, prompt, neg_prompt, strength, steps, guidance_scale, fac
|
|
| 232 |
callback=callback,
|
| 233 |
callback_steps=1
|
| 234 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 235 |
|
| 236 |
end_time = time.time()
|
| 237 |
print(f"Bild transformiert in {end_time - start_time:.2f} Sekunden")
|
|
@@ -346,7 +398,7 @@ def main_ui():
|
|
| 346 |
<strong>Empfehlung:</strong><br>
|
| 347 |
Für eine präzise Abstimmung der zentralen Parameter – Prompt, Negativ-Prompt, Veränderungsstärke (Strength), Inferenz-Schritte (Steps) <br>
|
| 348 |
und Prompt-Stärke (Guidance) – liefern leistungsfähige Sprachmodelle wie GPT, Grok oder DeepSeek hochqualitative, kontextbezogene Vorschläge.<br>
|
| 349 |
-
Prompt und Negativ-Prompt sollten auf <strong>Englisch</strong> eingegeben werden, da "Stable Diffusion" mit Bild-Text-
|
| 350 |
wurde und CLIP einen Tokenizer für ein englisches Vokabular nutzt. Deutsche Wörter werden zwar übersetzt, führen aber zu Verzerrungen.
|
| 351 |
</div>
|
| 352 |
"""
|
|
|
|
| 104 |
|
| 105 |
return pipe_img2img
|
| 106 |
|
| 107 |
+
# === CALLBACK-FUNKTIONEN FÜR FORTSCHRITT ===
|
| 108 |
+
class TextToImageProgressCallback:
|
| 109 |
def __init__(self, progress, total_steps):
|
| 110 |
self.progress = progress
|
| 111 |
self.total_steps = total_steps
|
|
|
|
| 114 |
def __call__(self, step, timestep, latents):
|
| 115 |
self.current_step = step + 1
|
| 116 |
progress_percent = (step / self.total_steps) * 100
|
|
|
|
| 117 |
self.progress(progress_percent / 100, desc="Generierung läuft - CPU benötigt bis zu 6 Minuten!")
|
| 118 |
return False
|
| 119 |
|
| 120 |
+
class ImageToImageProgressCallback:
|
| 121 |
+
def __init__(self, progress, total_steps):
|
| 122 |
+
self.progress = progress
|
| 123 |
+
self.total_steps = total_steps
|
| 124 |
+
self.current_step = 0
|
| 125 |
+
self.actual_total_steps = None # Neue Variable für tatsächliche Steps
|
| 126 |
+
|
| 127 |
+
def __call__(self, step, timestep, latents):
|
| 128 |
+
self.current_step = step + 1
|
| 129 |
+
|
| 130 |
+
# ERGÄNZUNG: Tatsächliche Gesamtschritte aus dem Scheduler lesen
|
| 131 |
+
if self.actual_total_steps is None:
|
| 132 |
+
# Versuche, die tatsächliche Schrittanzahl zu ermitteln
|
| 133 |
+
try:
|
| 134 |
+
# Der Scheduler hat normalerweise config.num_train_timesteps oder ähnliches
|
| 135 |
+
self.actual_total_steps = self.total_steps
|
| 136 |
+
print(f"🎯 INTERNE STEP-AUSGABE: Scheduler führt {self.actual_total_steps} Schritte durch")
|
| 137 |
+
except:
|
| 138 |
+
self.actual_total_steps = self.total_steps
|
| 139 |
+
print(f"🎯 INTERNE STEP-AUSGABE: Verwende konfigurierte {self.total_steps} Schritte")
|
| 140 |
+
|
| 141 |
+
progress_percent = (step / self.total_steps) * 100
|
| 142 |
+
# AUSGABE ZEILE - Hier werden die Steps ausgegeben:
|
| 143 |
+
self.progress(progress_percent / 100, desc=f"Schritt {self.current_step}/{self.total_steps} - {progress_percent:.1f}%")
|
| 144 |
+
return False
|
| 145 |
+
|
| 146 |
# === FUNKTIONEN ===
|
| 147 |
def text_to_image(prompt, steps, guidance_scale, progress=gr.Progress()):
|
| 148 |
try:
|
|
|
|
| 163 |
print(f"Using seed: {seed}")
|
| 164 |
|
| 165 |
# Progress Callback hinzufügen
|
| 166 |
+
callback = TextToImageProgressCallback(progress, steps)
|
| 167 |
|
| 168 |
image = pipe(
|
| 169 |
prompt=prompt,
|
|
|
|
| 241 |
print("Keine gültigen Koordinaten - keine Maske angewendet")
|
| 242 |
mask = None
|
| 243 |
|
| 244 |
+
# Detaillierte Debug-Informationen vor dem Pipeline-Aufruf
|
| 245 |
+
print(f"⚙️ PIPELINE-KONFIGURATION:")
|
| 246 |
+
print(f" - Angefordert: {int(steps)} Steps")
|
| 247 |
+
print(f" - Strength: {adj_strength}")
|
| 248 |
+
print(f" - Scheduler: {pipe.scheduler.__class__.__name__}")
|
| 249 |
+
|
| 250 |
+
# Berechne die tatsächlichen Steps basierend auf Strength
|
| 251 |
+
if hasattr(pipe.scheduler, 'config') and hasattr(pipe.scheduler.config, 'num_train_timesteps'):
|
| 252 |
+
total_train_steps = pipe.scheduler.config.num_train_timesteps
|
| 253 |
+
actual_inference_steps = int(adj_strength * total_train_steps)
|
| 254 |
+
print(f"🎯 INTERNE STEP-AUSGABE: Strength {adj_strength} → {actual_inference_steps} tatsächliche Denoising-Schritte")
|
| 255 |
+
|
| 256 |
# Progress Callback hinzufügen
|
| 257 |
+
callback = ImageToImageProgressCallback(progress, int(steps))
|
| 258 |
|
| 259 |
# --- PIPELINE-AUFRUF ---
|
| 260 |
result = pipe(
|
|
|
|
| 269 |
callback=callback,
|
| 270 |
callback_steps=1
|
| 271 |
)
|
| 272 |
+
|
| 273 |
+
# ZUSÄTZLICHE AUSGABE: Tatsächliche Steps vom Scheduler
|
| 274 |
+
try:
|
| 275 |
+
# Der Scheduler hat Informationen über die tatsächliche Schrittanzahl
|
| 276 |
+
scheduler = pipe.scheduler
|
| 277 |
+
print(f"🔧 SCHEDULER-INFO: {scheduler.__class__.__name__}")
|
| 278 |
+
print(f"📊 TATSÄCHLICHE STEP-KONFIGURATION: {int(steps)} Schritte mit Strength {adj_strength}")
|
| 279 |
+
|
| 280 |
+
# Bei einigen Schedulern kann man die Timesteps sehen
|
| 281 |
+
if hasattr(scheduler, 'timesteps'):
|
| 282 |
+
actual_steps = len(scheduler.timesteps)
|
| 283 |
+
print(f"🎯 INTERNE STEP-AUSGABE: Scheduler verwendete {actual_steps} tatsächliche Denoising-Schritte")
|
| 284 |
+
|
| 285 |
+
except Exception as e:
|
| 286 |
+
print(f"⚠️ Konnte Scheduler-Info nicht auslesen: {e}")
|
| 287 |
|
| 288 |
end_time = time.time()
|
| 289 |
print(f"Bild transformiert in {end_time - start_time:.2f} Sekunden")
|
|
|
|
| 398 |
<strong>Empfehlung:</strong><br>
|
| 399 |
Für eine präzise Abstimmung der zentralen Parameter – Prompt, Negativ-Prompt, Veränderungsstärke (Strength), Inferenz-Schritte (Steps) <br>
|
| 400 |
und Prompt-Stärke (Guidance) – liefern leistungsfähige Sprachmodelle wie GPT, Grok oder DeepSeek hochqualitative, kontextbezogene Vorschläge.<br>
|
| 401 |
+
Prompt und Negativ-Prompt sollten auf <strong>Englisch</strong> eingegeben werden, da "Stable Diffusion" mit Bild-Text-Paares auf Englisch trainiert <br>
|
| 402 |
wurde und CLIP einen Tokenizer für ein englisches Vokabular nutzt. Deutsche Wörter werden zwar übersetzt, führen aber zu Verzerrungen.
|
| 403 |
</div>
|
| 404 |
"""
|