Ultralytics YOLO27 : Inscris-toi sur la liste d’attente.
Get Started
Créer des jeux de données YOLO hautes performances·Entraîner et itérer·Leçon 9/10
Leçondébutant

Premier ajustement fin et boucle d'itération

Ajuste finement les poids YOLO26 préentraînés avec les paramètres par défaut, classe les classes selon leur AP, avec le nombre d'objets manqués et confondus, puis transforme la classe la plus faible en prochaine correction du jeu de données.

L'exécution pratique de cette leçon obtient un mAP50 de 0,66, ce qui semble indiquer un problème de taux d'apprentissage. Pourtant, un tableau par classe montre autre chose : cup compte 14 objets annotés dans le jeu de validation, et le modèle n'en trouve aucun. C'est un problème de données, qu'aucun hyperparamètre n'aurait résolu. Considère la première exécution comme un diagnostic qui t'indique quelle classe corriger ensuite.

Résultat

Ajuste finement un modèle de référence, classe les classes selon leur AP et le nombre d'objets manqués ou confondus, puis définis une action sur le jeu de données quantifiée en nombre d'images.

Parcours accéléré
Si tu connais déjà les bases, voici la version courte.
  1. Ajuste finement le point de contrôle YOLO26 préentraîné pour ta tâche avec les paramètres par défaut.

  2. Classe les classes selon leur AP50-95 et compte les objets manqués et confondus pour chacune.

  3. Les objets manqués indiquent un problème de couverture ou des annotations manquantes ; les confusions indiquent un problème de définition des classes.

  4. Corrige les données, réentraîne avec des paramètres et une répartition identiques, puis compare.

Pratique

Partir de poids préentraînés#

L'entraînement à partir de zéro apprend toutes les caractéristiques avec de nouvelles données, tandis que l'apprentissage par transfert ajuste finement un réseau préentraîné pour la nouvelle tâche

L'ajustement fin part de poids qui reconnaissent déjà les contours, les textures et les formes ; il converge donc plus vite et nécessite beaucoup moins de données qu'un entraînement à partir de poids aléatoires. Choisis le point de contrôle YOLO26 adapté à ta tâche :

TâchePoint de contrôle préentraînéPréentraîné sur
Détectionyolo26n.ptCOCO
Segmentationyolo26n-seg.ptCOCO
Sémantiqueyolo26n-sem.ptCityscapes
Poseyolo26n-pose.ptPoints clés COCO
OBByolo26n-obb.ptDOTAv1
Classificationyolo26n-cls.ptImageNet
Profondeuryolo26n-depth.ptUn vaste ensemble de données de profondeur en intérieur et en extérieur

Le backbone et le neck sont transférés tels quels ; la tête de tâche est partiellement réinitialisée pour correspondre au nombre de classes. L'entraînement à partir de zéro n'est avantageux qu'avec de très grands jeux de données dans des domaines très inhabituels. Commence avec le modèle nano (n) pour obtenir rapidement une référence, puis passe à des tailles supérieures seulement lorsque les itérations sur les données ne produisent plus de progrès. Le guide d'ajustement fin explique ce qui se passe en interne.

Exécuter le modèle de référence#

Entraîne avec les paramètres par défaut ; le premier entraînement sert à établir une référence, pas à battre un record. Il s'appuie sur la répartition du jeu d'exercice présentée dans Répartir correctement le jeu de données, en commençant par écrire son fichier YAML de données :

from ultralytics import YOLO
from ultralytics.data.utils import check_det_dataset
from ultralytics.utils import YAML

names = check_det_dataset("coco128.yaml")["names"]  # le jeu d'exercice conserve les noms de classes de COCO
YAML.save("practice.yaml", {"path": "datasets/practice", "train": "train.txt", "val": "val.txt", "test": "test.txt", "names": names})

model = YOLO("yolo26n.pt")  # préentraîné sur COCO ; utilise le point de contrôle correspondant à ta tâche
model.train(data="practice.yaml", epochs=3, imgsz=320)  # une vraie exécution : epochs=100, imgsz=640
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95)
                   all         20        143      0.614        0.6      0.664      0.486

Le dossier d'exécution (runs/detect/train/) contient maintenant weights/best.pt. Seuls trois arguments méritent d'être envisagés lors du premier entraînement :

ArgumentPar défautQuand modifier ce paramètre
epochs100Moins pour les très petits jeux de données ; 200–300 pour les très grands
imgsz6401024 ou 1280 si de nombreux objets sont petits dans l'image
batch16-1 pour le réglage automatique de la taille des lots ; diminue cette valeur en cas d'erreur de mémoire insuffisante

Entraîner ton premier modèle détaille l'appel d'entraînement et son journal en direct.

Classer les classes et analyser les objets manqués#

Le mAP global masque l'emplacement du problème. Classe les classes selon leur AP50-95 et utilise la matrice de confusion pour répartir les erreurs de chaque classe entre les objets que le modèle n'a pas détectés du tout et ceux qu'il a attribués à une autre classe :

from ultralytics import YOLO

model = YOLO("runs/detect/train/weights/best.pt")  # your fine-tuned checkpoint
metrics = model.val(data="practice.yaml", imgsz=320, verbose=False)  # same data YAML and imgsz as training

matrix = metrics.confusion_matrix.matrix  # rows: predicted class, columns: true class; last row = background
for ap, cls in sorted(zip(metrics.box.ap, metrics.box.ap_class_index))[:5]:  # weakest five classes first
    total, missed, correct = matrix[:, cls].sum(), matrix[-1, cls], matrix[cls, cls]
    print(f"{model.names[cls]:>8}  AP50-95={ap:.3f}  {total:2.0f} labeled: {correct:2.0f} found, "
          f"{missed:2.0f} missed, {total - correct - missed:2.0f} called another class")
     car  AP50-95=0.000   4 labeled:  0 found,  4 missed,  0 called another class
    fork  AP50-95=0.000   1 labeled:  0 found,  0 missed,  1 called another class
 handbag  AP50-95=0.025   1 labeled:  1 found,  0 missed,  0 called another class
     cup  AP50-95=0.039  14 labeled:  0 found, 10 missed,  4 called another class
    sink  AP50-95=0.075   1 labeled:  1 found,  0 missed,  0 called another class

Chaque type d'erreur indique une correction différente du jeu de données :

  • Trop peu d'instances dans le jeu de validation (fork, handbag, sink, une instance chacune) : l'AP n'est que du bruit. N'interviens pas sur une classe tant que le jeu de validation ne contient pas au moins quelques dizaines de ses instances ; collecte d'abord davantage de groupes de validation.
  • Objets manqués (car : 4 sur 4, cup : 10 sur 14) : le modèle ne détecte aucun objet. Vérifie la couverture de ce scénario dans le jeu d'entraînement et recherche les annotations manquantes avec suspect_labels.py.
  • Attribués à une autre classe (cup : 4 sur 14) : les définitions des classes se chevauchent. Ouvre ces images, précise les définitions et indique dans le guide l'élément ressemblant.

cup est le constat exploitable ici : 14 instances annotées, et aucune détectée.

Lire le dossier d'exécution comme un retour sur les données#

Graphiques d'entraînement de la plateforme Ultralytics pour un modèle de segmentation : cartes récapitulatives de mAP50, mAP50-95, précision et rappel au-dessus des courbes de précision, de rappel et de mAP50-95 par époque

Chaque entraînement génère ces fichiers, et la plateforme Ultralytics affiche les mêmes courbes en direct pendant l'entraînement dans le cloud :

FichierCe qu'il révèle sur les données
confusion_matrix_normalized.pngLes classes confondues entre elles ou dont les instances sont manquées et considérées comme de l'arrière-plan
BoxPR_curve.pngPrécision-rappel par classe ; une courbe basse indique une classe faible
val_batch0_pred.jpgPrédictions sur de vraies images de validation ; repère les erreurs systématiques
labels.jpgNombre de classes et tailles de boîtes utilisés pour l'entraînement du modèle
results.pngCourbes de perte et de métriques ; une perte de validation qui augmente tandis que la perte d'entraînement baisse signale le surapprentissage

Valider et diagnostiquer explique chaque graphique ; ici, la question est toujours de savoir quelles données manquent.

La boucle axée sur les données#

Une itération type : choisis la classe la plus faible qui compte suffisamment d'instances dans le jeu de validation, audite environ 50 images qui la contiennent, corrige les données, réentraîne avec les mêmes paramètres et la même répartition, puis compare l'AP par classe. Passe ensuite à la classe la plus faible suivante.

Ne change qu’une chose par réentraînement

Si tu ajoutes 300 images et augmentes imgsz lors du même réentraînement, tu ne peux pas savoir quel changement a modifié le score. Garde les paramètres et la séparation identiques pendant les itérations sur les données, afin que chaque comparaison isole un seul changement de données.

Quand régler les hyperparamètres#

Après deux ou trois itérations sur les données, lorsque les classes faibles restantes ne s'expliquent plus par la couverture, les annotations ou les définitions, le réglage peut permettre de gagner les derniers points. Le guide d'ajustement fin aborde le gel de couches, les taux d'apprentissage et le choix de l'optimiseur. Mais si tu ajustes les paramètres avant que les données soient au point, tu passes des semaines à optimiser un modèle entraîné sur un jeu de données inadéquat.

Une fois qu'un modèle réussit acceptance_test.py sur le jeu de test verrouillé, YOLO d'Ultralytics en production traite de l'exportation et du déploiement, tandis que Surveiller l'état et la précision et Automatiser la boucle de réentraînement, dans Développer avec la plateforme Ultralytics, abordent la boucle de réentraînement.

Essayer

Ajuste finement le point de contrôle YOLO26 correspondant à ta tâche avec les paramètres par défaut, puis exécute rank_classes.py sur best.pt. Écarte les classes qui comptent trop peu d'instances dans le jeu de validation, audite environ 50 images de la classe restante la plus faible et détermine si ses erreurs sont des objets manqués ou des confusions. Livrable : une action sur le jeu de données (collecter, réannoter ou redéfinir) et le nombre d'images concernées.

Terminé lorsque
Tu as terminé la leçon lorsque tous les éléments suivants sont réunis.
  • Un modèle de référence entraîné avec les paramètres par défaut a produit best.pt et un tableau classant les classes.

  • La classe la plus faible qui compte suffisamment d'instances dans le jeu de validation est nommée, avec le nombre d'objets manqués et confondus.

  • Une action sur le jeu de données est indiquée avec le nombre d’images concernées, et aucun hyperparamètre n’a encore changé.

Afficher la solution

À l’issue de l’essai, cup est la classe à traiter : 14 instances annotées dans val, 0 détectée, 10 manquées, 4 attribuées à une autre classe. Voici un plan chiffré :

ConstatAction sur le jeu de donnéesVolume
10 des 14 gobelets manquésVérifie la couverture de train : compte les images train avec des gobelets par caméra et par jour ; collecte des images de gobelets dans les groupes qui n’en contiennent aucun.40 nouvelles images avec des gobelets, réparties sur 4 jours de prise de vue
4 des 14 attribués à une autre classeOuvre-les dans val_batch0_pred.jpg et dans la matrice de confusion ; s’ils sont attribués à wine glass ou à bowl, ajoute les deux classes similaires à la définition de cup.Réannote environ 30 images train selon la nouvelle règle.
Classes à une instanceN’interviens pas encore ; ajoute des groupes val qui en contiennent.Prochaine collecte

Réentraîne ensuite avec epochs, imgsz et la même partition, relance rank_classes.py, puis compare l’AP de cup avant et après. Si elle augmente, les données étaient le goulot d’étranglement ; si ce n’est pas le cas, vérifie les 50 images suivantes avant de toucher à un hyperparamètre.

Et ensuite ?

La dernière leçon rassemble tout le cours dans une liste de contrôle d’une page que tu peux utiliser avec un client à chaque lancement de projet.