# Dieses Script enthält verschiedene nützliche Verarbeitungsoptionen für den Prozess der Trainingsdatensatzerstellung
# Finden und entfernen ungelabelter Bilder aus den gelabelten Fotos um Auswahl zu beschleunigen
import os
import shutil

# Ordner Pfade
ordner_a = '_MOMMERT/konstanz_labeled'  # Ordner mit den .png und .txt Dateien
ordner_b = '_MOMMERT/sorted_images_with_konstanz/unlabeled'  # Zielordner für die .png Dateien ohne zugehörige .txt Datei

# Stelle sicher, dass der Zielordner 'b' existiert, andernfalls erstelle ihn
if not os.path.exists(ordner_b):
    os.makedirs(ordner_b)

# Liste alle .txt Dateien in 'a'
txt_dateien = set([os.path.splitext(f)[0] for f in os.listdir(ordner_a) if f.endswith('.txt')])

# Liste alle .png Dateien in 'a'
png_dateien = [f for f in os.listdir(ordner_a) if f.endswith('_bbox.png')]

# Überprüfen, ob zu jeder .png Datei eine passende .txt Datei existiert
for png_datei in png_dateien:
    # Entferne die Endung '_bbox.png', um den Basisnamen zu erhalten
    basisname = os.path.splitext(png_datei)[0].replace('_bbox', '')
    
    # Wenn keine entsprechende .txt Datei vorhanden ist, verschiebe die .png Datei nach 'b'
    if basisname not in txt_dateien:
        quelle = os.path.join(ordner_a, png_datei)
        ziel = os.path.join(ordner_b, png_datei)
        shutil.move(quelle, ziel)
        print(f"Verschiebe {png_datei} nach {ordner_b}")





# Finden und verschieben von .txt Dateien, zu welchen keine .png Datei existiert.
import os
import shutil

# Ordner Pfade
ordner_a = '_MOMMERT/sorted_images'  # Ordner mit den .png und .txt Dateien
ordner_b = 'unwanted'  # Zielordner für die .txt Dateien ohne zugehörige .png Datei

# Stelle sicher, dass der Zielordner 'b' existiert, andernfalls erstelle ihn
if not os.path.exists(ordner_b):
    os.makedirs(ordner_b)

# Liste alle .png Dateien in 'a'
png_dateien = set([os.path.splitext(f)[0].replace('_bbox', '') for f in os.listdir(ordner_a) if f.endswith('_bbox.png')])

# Liste alle .txt Dateien in 'a'
txt_dateien = [f for f in os.listdir(ordner_a) if f.endswith('.txt')]

# Überprüfen, ob zu jeder .txt Datei eine passende .png Datei existiert
for txt_datei in txt_dateien:
    # Entferne die Endung '.txt', um den Basisnamen zu erhalten
    basisname = os.path.splitext(txt_datei)[0]
    
    # Wenn keine entsprechende .png Datei vorhanden ist, verschiebe die .txt Datei nach 'b'
    if basisname not in png_dateien:
        quelle = os.path.join(ordner_a, txt_datei)
        ziel = os.path.join(ordner_b, txt_datei)
        shutil.move(quelle, ziel)
        print(f"Verschiebe {txt_datei} nach {ordner_b}")





# Überschreiben von Bildern mit Skala mit Bildern ohne Skala (gelabelt)
import os
import shutil

# Pfade zu den Verzeichnissen
folder_a = "_MOMMERT/sorted_images/false"  # Pfad wo Bilder überschrieben werden sollen 
folder_b = "_MOMMERT/wuerzburg_labeled"  # Pfad zu Ordner wo Bilder hergenommen werden sollen

# Liste alle .png Dateien in Ordner 'a'
for filename in os.listdir(folder_a):
    if filename.endswith('.png'):
        # Pfad zur Datei in Ordner 'b'
        file_b_path = os.path.join(folder_b, filename)

        # Prüfe, ob die Datei in Ordner 'b' existiert
        if os.path.exists(file_b_path):
            # Pfad zur Originaldatei in Ordner 'a'
            original_file_path = os.path.join(folder_a, filename)

            # Kopiere die Datei aus Ordner 'b' nach Ordner 'a' und überschreibe die ursprüngliche Datei
            shutil.copy(file_b_path, original_file_path)
            print(f"Datei {filename} wurde von '{folder_b}' nach '{folder_a}' kopiert und überschrieben.")
        else:
            print(f"Datei {filename} existiert nicht in '{folder_b}'.")






# Vereinheitlichung aller .txt und .png files
import os

# Pfad zum Ordner 'a'
folder_a = 'sorted_images/good'

# Funktion zum Umbenennen von Dateien
def rename_files_in_folder():
    for filename in os.listdir(folder_a):
        # Pfad zur Datei
        file_path = os.path.join(folder_a, filename)
        
        # Überprüfen, ob es eine .txt-Datei ist und die Endung '_DOP20_BW.txt' hat
        if filename.endswith('_DOP20_BW.txt'):
            new_filename = filename.replace('_DOP20_BW.txt', '_rgbi_20cm.txt')
            new_file_path = os.path.join(folder_a, new_filename)
            os.rename(file_path, new_file_path)
            print(f"Umbenannt: {file_path} -> {new_file_path}")
        
        # Überprüfen, ob es eine .png-Datei ist und die Endung '_DOP20_BW.png' hat
        elif filename.endswith('_DOP20_BW_bbox.png'):
            new_filename = filename.replace('_DOP20_BW_bbox.png', '_rgbi_20cm_bbox.png')
            new_file_path = os.path.join(folder_a, new_filename)
            os.rename(file_path, new_file_path)
            print(f"Umbenannt: {file_path} -> {new_file_path}")

# Umbenennung starten
rename_files_in_folder()







# Reduzierung des Datensatzes um alle bilder, welche die Klassen 2-6 beinhalten:
import os
import shutil

# Originalverzeichnis
source_dir = 'sorted_images'

# Verzeichnis, das durchsucht werden soll
good_dir = os.path.join(source_dir, 'good')

# Neues Verzeichnis für unerwünschte Dateien
unwanted_dir = 'unwanted'
os.makedirs(unwanted_dir, exist_ok=True)

# Kopie des 'sorted_images'-Ordners erstellen
backup_dir = 'sorted_images_backup'
if not os.path.exists(backup_dir):
    shutil.copytree(source_dir, backup_dir)
    print(f"Kopie des Verzeichnisses erstellt: {backup_dir}")
else:
    print(f"Backup-Verzeichnis existiert bereits: {backup_dir}")

# Klassen, die als unerwünscht gelten
unwanted_classes = {2, 3, 4, 5, 6}

# Funktion zum Verschieben der Dateien
def move_files(txt_file, png_file, unwanted_dir):
    # Verschiebe die .txt Datei
    shutil.move(txt_file, os.path.join(unwanted_dir, os.path.basename(txt_file)))
    
    # Verschiebe die zugehörige .png Datei
    if os.path.exists(png_file):
        shutil.move(png_file, os.path.join(unwanted_dir, os.path.basename(png_file)))
    else:
        print(f"Keine entsprechende .png Datei gefunden für: {png_file}")

# Durchlaufe das Verzeichnis 'good'
for filename in os.listdir(good_dir):
    if filename.endswith('.txt'):
        txt_file_path = os.path.join(good_dir, filename)
        png_file_path = txt_file_path.replace('.txt', '_bbox.png')

        # Überprüfe die .txt Datei
        with open(txt_file_path, 'r') as file:
            lines = file.readlines()
            for line in lines:
                class_id = int(line.split()[0])  # Die erste Zahl in jeder Zeile ist die Klassen-ID
                if class_id in unwanted_classes:
                    move_files(txt_file_path, png_file_path, unwanted_dir)
                    break  # Breche die Schleife ab, wenn eine unerwünschte Klasse gefunden wurde

print("Verschieben unerwünschter Dateien abgeschlossen.")
