Astridkraft commited on
Commit
0841cb6
·
verified ·
1 Parent(s): 89703b4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +58 -6
app.py CHANGED
@@ -104,8 +104,8 @@ def load_img2img():
104
 
105
  return pipe_img2img
106
 
107
- # === CALLBACK-FUNKTION FÜR FORTSCHRITT ===
108
- class ProgressCallback:
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 = ProgressCallback(progress, steps)
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 = ProgressCallback(progress, int(steps))
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-Paaren auf Englisch trainiert <br>
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
  """