Upload app.py
Browse files
app.py
CHANGED
|
@@ -284,6 +284,37 @@ Hinweis: Du musst eingeloggt sein und die Terms akzeptieren!"""
|
|
| 284 |
if dataset_size > 0:
|
| 285 |
img_files = img_files[:dataset_size]
|
| 286 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 287 |
for i, img_file in enumerate(img_files):
|
| 288 |
if i % 100 == 0:
|
| 289 |
progress(0.25 + (i / len(img_files)) * 0.1, desc=f"Kopiere Bilder: {i}/{len(img_files)}")
|
|
@@ -293,7 +324,12 @@ Hinweis: Du musst eingeloggt sein und die Terms akzeptieren!"""
|
|
| 293 |
if labels_dir:
|
| 294 |
label_file = labels_dir / img_file.name.replace(".jpg", ".txt")
|
| 295 |
if label_file.exists():
|
| 296 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 297 |
|
| 298 |
# Kopiere zugehörige PKL-Datei (optional)
|
| 299 |
if pkl_dir and pkl_dir.exists():
|
|
@@ -465,6 +501,46 @@ Hinweis: Du musst eingeloggt sein und die Terms akzeptieren!"""
|
|
| 465 |
3. Versuche Training erneut (Repository wird beim nächsten Versuch geklont)"""
|
| 466 |
|
| 467 |
progress(0.47, desc="✅ Netlistify geklont")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 468 |
|
| 469 |
# Prüfe ob main_config.py existiert
|
| 470 |
if not main_config_file.exists():
|
|
|
|
| 284 |
if dataset_size > 0:
|
| 285 |
img_files = img_files[:dataset_size]
|
| 286 |
|
| 287 |
+
# Funktion zum Filtern ungültiger Klassen aus Label-Dateien
|
| 288 |
+
def filter_invalid_labels(label_path: Path, max_class: int = 11) -> bool:
|
| 289 |
+
"""Filtert ungültige Klassen aus Label-Datei und speichert bereinigte Version."""
|
| 290 |
+
try:
|
| 291 |
+
with open(label_path, 'r') as f:
|
| 292 |
+
lines = f.readlines()
|
| 293 |
+
|
| 294 |
+
filtered_lines = []
|
| 295 |
+
invalid_count = 0
|
| 296 |
+
for line in lines:
|
| 297 |
+
line = line.strip()
|
| 298 |
+
if not line:
|
| 299 |
+
continue
|
| 300 |
+
parts = line.split()
|
| 301 |
+
if len(parts) >= 5:
|
| 302 |
+
cls = int(parts[0])
|
| 303 |
+
if 0 <= cls <= max_class:
|
| 304 |
+
filtered_lines.append(line + '\n')
|
| 305 |
+
else:
|
| 306 |
+
invalid_count += 1
|
| 307 |
+
|
| 308 |
+
# Speichere bereinigte Label-Datei
|
| 309 |
+
if invalid_count > 0 or len(filtered_lines) != len(lines):
|
| 310 |
+
with open(label_path, 'w') as f:
|
| 311 |
+
f.writelines(filtered_lines)
|
| 312 |
+
return True # Datei wurde geändert
|
| 313 |
+
return False # Keine Änderungen nötig
|
| 314 |
+
except Exception as e:
|
| 315 |
+
# Falls Fehler, überspringe diese Datei
|
| 316 |
+
return False
|
| 317 |
+
|
| 318 |
for i, img_file in enumerate(img_files):
|
| 319 |
if i % 100 == 0:
|
| 320 |
progress(0.25 + (i / len(img_files)) * 0.1, desc=f"Kopiere Bilder: {i}/{len(img_files)}")
|
|
|
|
| 324 |
if labels_dir:
|
| 325 |
label_file = labels_dir / img_file.name.replace(".jpg", ".txt")
|
| 326 |
if label_file.exists():
|
| 327 |
+
# Kopiere Label-Datei
|
| 328 |
+
dest_label = train_labels / label_file.name
|
| 329 |
+
shutil.copy2(label_file, dest_label)
|
| 330 |
+
|
| 331 |
+
# Filtere ungültige Klassen (Klasse > 11 für REAL-Dataset)
|
| 332 |
+
filter_invalid_labels(dest_label, max_class=11)
|
| 333 |
|
| 334 |
# Kopiere zugehörige PKL-Datei (optional)
|
| 335 |
if pkl_dir and pkl_dir.exists():
|
|
|
|
| 501 |
3. Versuche Training erneut (Repository wird beim nächsten Versuch geklont)"""
|
| 502 |
|
| 503 |
progress(0.47, desc="✅ Netlistify geklont")
|
| 504 |
+
|
| 505 |
+
# Patche slice.py um ungültige Klassen zu überspringen
|
| 506 |
+
slice_file = netlistify_dir / "slice.py"
|
| 507 |
+
if slice_file.exists():
|
| 508 |
+
try:
|
| 509 |
+
with open(slice_file, 'r', encoding='utf-8') as f:
|
| 510 |
+
slice_content = f.read()
|
| 511 |
+
|
| 512 |
+
# Prüfe ob Patch bereits vorhanden ist
|
| 513 |
+
if 'if cls not in class_label_real:' not in slice_content:
|
| 514 |
+
# Finde die Stelle wo class_label_real[cls] verwendet wird
|
| 515 |
+
# Ersetze direkte Zugriffe mit sicheren Zugriffen
|
| 516 |
+
old_pattern = 'if config == DatasetConfig.REAL:\n if class_label_real[cls] == "text":'
|
| 517 |
+
new_pattern = 'if config == DatasetConfig.REAL:\n if cls not in class_label_real:\n continue # Überspringe ungültige Klassen\n if class_label_real[cls] == "text":'
|
| 518 |
+
|
| 519 |
+
if old_pattern in slice_content:
|
| 520 |
+
slice_content = slice_content.replace(old_pattern, new_pattern)
|
| 521 |
+
else:
|
| 522 |
+
# Alternative: Ersetze alle class_label_real[cls] Zugriffe
|
| 523 |
+
import re
|
| 524 |
+
# Ersetze class_label_real[cls] mit sicherem Zugriff
|
| 525 |
+
slice_content = re.sub(
|
| 526 |
+
r'class_label_real\[cls\]',
|
| 527 |
+
r'class_label_real.get(cls, None)',
|
| 528 |
+
slice_content
|
| 529 |
+
)
|
| 530 |
+
# Füge Check hinzu, um None-Werte zu überspringen
|
| 531 |
+
slice_content = re.sub(
|
| 532 |
+
r'(\s+)if config == DatasetConfig\.REAL:',
|
| 533 |
+
r'\1if config == DatasetConfig.REAL:\n\1 if cls not in class_label_real:\n\1 continue # Überspringe ungültige Klassen',
|
| 534 |
+
slice_content
|
| 535 |
+
)
|
| 536 |
+
|
| 537 |
+
with open(slice_file, 'w', encoding='utf-8') as f:
|
| 538 |
+
f.write(slice_content)
|
| 539 |
+
progress(0.471, desc="🔧 slice.py gepatcht (ungültige Klassen werden übersprungen)")
|
| 540 |
+
except Exception as e:
|
| 541 |
+
# Falls Patch fehlschlägt, ist das nicht kritisch
|
| 542 |
+
# Die Label-Filterung sollte ausreichen
|
| 543 |
+
pass
|
| 544 |
|
| 545 |
# Prüfe ob main_config.py existiert
|
| 546 |
if not main_config_file.exists():
|