File size: 3,099 Bytes
c9595c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import os

def convert_labels_in_place(input_dir, class_mapping):
    """
    Convertit les fichiers de labels en format YOLOv5 directement dans les fichiers originaux.

    Args:
        input_dir (str): Répertoire contenant les fichiers de labels à convertir.
        class_mapping (dict): Dictionnaire {nom_classe: index}.
    """
    for file_name in os.listdir(input_dir):
        if not file_name.endswith(".txt"):
            continue

        input_path = os.path.join(input_dir, file_name)
        temp_path = input_path + ".temp"  # Fichier temporaire pour éviter d'écraser immédiatement

        with open(input_path, "r") as infile, open(temp_path, "w") as tempfile:
            for line in infile:
                parts = line.split()
                # Vérifier que la ligne a au moins 10 éléments
                if len(parts) < 10:
                    print(f"Skipping invalid line in {file_name}: {line.strip()}")
                    continue

                try:
                    # Extraire les sommets du polygone
                    x1, y1 = float(parts[0]), float(parts[1])
                    x2, y2 = float(parts[2]), float(parts[3])
                    x3, y3 = float(parts[4]), float(parts[5])
                    x4, y4 = float(parts[6]), float(parts[7])

                    # Calculer les coordonnées de la bounding box
                    x_min = min(x1, x2, x3, x4)
                    y_min = min(y1, y2, y3, y4)
                    x_max = max(x1, x2, x3, x4)
                    y_max = max(y1, y2, y3, y4)

                    # Calculer x_center, y_center, width, height normalisés
                    img_width, img_height = 640, 640  # Assurez-vous que cette taille est correcte
                    x_center = ((x_min + x_max) / 2) / img_width
                    y_center = ((y_min + y_max) / 2) / img_height
                    width = (x_max - x_min) / img_width
                    height = (y_max - y_min) / img_height

                    # Convertir le nom de classe en indice
                    class_name = parts[8]
                    if class_name not in class_mapping:
                        print(f"Classe inconnue dans {file_name}: {class_name}")
                        continue

                    class_id = class_mapping[class_name]

                    # Écrire la ligne convertie dans le fichier temporaire
                    tempfile.write(f"{class_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n")
                except ValueError as e:
                    print(f"Erreur de conversion dans {file_name}: {line.strip()} | Erreur : {e}")
                    continue

        # Remplacer le fichier original par le fichier temporaire
        os.replace(temp_path, input_path)
        print(f"Converti : {input_path}")


# Mapping des noms de classes aux indices
class_mapping = {
    "component": 0,
    "void": 1
}

# Répertoire des fichiers de labels
input_dir = "labelid_image/valid/labels"

# Conversion des labels directement dans les fichiers originaux
convert_labels_in_place(input_dir, class_mapping)