samyolo / convert_label.py
regisLik
deploy1
c9595c6
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)