diff --git a/python_scripts/DLM_Tree_Classification/YOLO_Formatting_Script b/python_scripts/DLM_Tree_Classification/YOLO_Formatting_Script new file mode 100644 index 0000000000000000000000000000000000000000..7514ed741872b7bbc48dff80f76b694cc159c3ee --- /dev/null +++ b/python_scripts/DLM_Tree_Classification/YOLO_Formatting_Script @@ -0,0 +1,109 @@ +# Austausch von gelabeldet rgb´s zu ungelabelden rgb´s + +import os +import shutil + +# Pfade zu den Verzeichnissen +folder_a = "_MOMMERT/sorted_images/good" +new_folder = "_MOMMERT/sorted_images_YOLO_formatted" + +# Kopiere folder_a in das aktuelle Verzeichnis und benenne es um +shutil.copytree(folder_a, new_folder) + +# Pfade zu den zusätzlichen RGB-Bildverzeichnissen +rgb_folders = [ + "_MOMMERT/wuerzburg_aerial_images_rgb", + "_MOMMERT/memmingen_aerial_images_rgb", + "_MOMMERT/konstanz_aerial_images_rgb" +] + +# Durchsuche den neuen Ordner nach Bilddateien mit der Endung '_bbox.png' +for filename in os.listdir(new_folder): + if filename.endswith('_bbox.png'): + # Ersetze '_bbox.png' durch '.png' im Dateinamen + new_filename = filename.replace('_bbox.png', '.png') + + # Suche in allen RGB-Verzeichnissen nach der entsprechenden Datei + file_found = False + for rgb_folder in rgb_folders: + file_b_path = os.path.join(rgb_folder, new_filename) + + # Prüfe, ob die Datei in einem der RGB-Ordner vorhanden ist + if os.path.exists(file_b_path): + # Pfad zur Originaldatei im neuen Ordner + original_file_path = os.path.join(new_folder, filename) + + # Kopiere die Datei aus dem RGB-Ordner in den neuen Ordner + shutil.copy(file_b_path, original_file_path) + + # Neuer Pfadname im neuen Ordner + new_file_path = os.path.join(new_folder, new_filename) + + # Umbenennen der Datei im neuen Ordner + os.rename(original_file_path, new_file_path) + + print(f"Kopiert und umbenannt: {file_b_path} -> {new_file_path}") + + file_found = True + break # Beende die Suche, wenn die Datei gefunden wurde + + if not file_found: + print(f"Keine passende Datei gefunden für: {new_filename}") + +print("Vorgang abgeschlossen.") + +# .txt Generator - für die korrekte Konvertierung ins YOLO Format +# Pfad zu Verzeichnis +dir = "_MOMMERT/sorted_images_YOLO_formatted" + +# Funktion, um sicherzustellen, dass für jedes Bild eine .txt-Datei vorhanden ist +def create_empty_label_files(directory): + image_files = [f for f in os.listdir(directory) if f.endswith(('.jpg', '.jpeg', '.png'))] + for image_file in image_files: + txt_file = os.path.splitext(image_file)[0] + ".txt" + txt_path = os.path.join(directory, txt_file) + if not os.path.exists(txt_path): + # Erstelle eine leere .txt Datei + open(txt_path, 'w').close() + + +create_empty_label_files(dir) + +# Sicherstellen, dass alle Bounding-Boxen maximale Werte von 1 und minimale Werte von 0 besitzen +# Pfad zu Ordner 'a', der die .txt-Dateien enthält +folder = "_MOMMERT/sorted_images_YOLO_formatted" + +def check_and_correct_labels(label_dir): + # Durchsuche alle .txt-Dateien im Ordner + for label_file in os.listdir(label_dir): + if label_file.endswith('.txt'): + file_path = os.path.join(label_dir, label_file) + corrected_lines = [] + + with open(file_path, 'r') as f: + lines = f.readlines() + for line in lines: + # Zerlege die Zeile in einzelne Werte + values = line.strip().split() + + # Erste Zahl ist die Klassen-ID, die bleibt unverändert + class_id = values[0] + + # Konvertiere die restlichen Werte in Fließkommazahlen und prüfe sie + coords = [float(v) for v in values[1:]] + + # Korrigiere die Werte, die außerhalb des Bereichs liegen + coords = [min(1.0, max(0.0, v)) for v in coords] + + # Erstelle die korrigierte Zeile + corrected_line = f"{class_id} " + " ".join(map(str, coords)) + "\n" + corrected_lines.append(corrected_line) + + # Speichere die korrigierten Koordinaten zurück in die .txt-Datei + with open(file_path, 'w') as f: + f.writelines(corrected_lines) + +# Beispiel-Aufruf +label_directory = folder +check_and_correct_labels(label_directory) +