Ultralytics YOLO27 : Inscris-toi sur la liste d’attente.
Get Started
Leçondébutant

Bonnes pratiques d’annotation

Rédige un guide d’annotation, choisis un outil, évite les dix erreurs qui nuisent discrètement à la précision et mesure l’accord entre annotateurs à l’aide d’un script avant de passer à l’échelle supérieure.

La qualité des annotations plafonne celle du modèle. Dix annotateurs qui interprètent chacun le terme « palette » légèrement différemment produisent un jeu de données qui apprend simultanément ces dix interprétations ; aucune quantité d’entraînement ne résout cette contradiction. Un guide écrit, une session de calibrage mesurée et une courte liste d’erreurs connues permettent de garder des annotations cohérentes, qu’une seule personne annote 500 images ou qu’une équipe en annote 50 000.

Résultat

Rédige un guide d’annotation, mesure l’accord entre deux annotateurs à l’aide d’un script et transforme chaque désaccord en règle écrite.

Parcours accéléré
Si tu connais déjà les bases, voici la version courte.
  1. Définis les classes, les règles de dessin et une règle d’occlusion avant le début de l’annotation.

  2. Annote chaque objet pertinent dans chaque image, avec des boîtes ajustées à la partie visible.

  3. Mesure l’accord sur un échantillon commun ; passe à l’échelle supérieure uniquement si le résultat atteint au moins 90 %.

  4. Vérifie manuellement chaque annotation proposée par le modèle ; ne l’accepte jamais automatiquement.

Pratique

Choisis l’outil d’annotation#

L’outil adapté dépend de la tâche, de l’équipe et de l’endroit où se déroule l’entraînement :

OutilIdéal pourRemarques
Ultralytics PlatformLes sept tâches YOLO : un éditeur pour les boîtes, les polygones, les masques sémantiques, les points clés, les boîtes orientées et les classes d’image, ainsi que les cartes de profondeur téléversées ; annotation intelligente SAMAnnotations, graphiques du jeu de données et entraînement au même endroit ; aucune étape d’exportation
CVATGrandes équipes, vidéos et processus de révision complexesAuto-hébergé ou dans le cloud
Label StudioProjets multimodaux (image + texte + audio)Configuration flexible, mais apprentissage plus difficile
LabelmeAnnotation par polygones pour les petites équipesApplication de bureau simple
LabelImgPrototypes rapides avec des boîtes uniquementLéger ; le dépôt est archivé

Sur Ultralytics Platform, l’annotation intelligente SAM 2.1, SAM 3 et SAM 3.1 fonctionne avec les jeux de données de détection, de segmentation, de segmentation sémantique et OBB. Quel que soit ton choix, vérifie que l’outil exporte le format YOLO adapté à ta tâche ; Préparer un jeu de données personnalisé explique le format des annotations et leur conversion.

Les sept types d’annotation#

Tâches Ultralytics YOLO côte à côte : classification, détection, segmentation, segmentation sémantique, pose, OBB et profondeur

Type d’annotationCe que tu dessinesTâche
Étiquette de classeUne étiquette par imageClassification
Boîte englobanteRectangle aligné sur les axes pour chaque objetDétection
PolygoneContour de chaque instance d’objetSegmentation d’instance
Masque denseUne classe pour chaque pixelSegmentation sémantique
Points clésPoints nommés tels que les articulationsPose
Boîte orientéeRectangle pivoté pour chaque objetOBB
Carte de profondeurRien : une carte des distances par pixel issue d’un capteur de profondeur, associée à chaque imageEstimation de profondeur

Rédige d’abord le guide d’annotation#

Avant que quiconque ne dessine une boîte, rédige un guide composé de cinq sections :

  1. Définitions des classes : un paragraphe par classe, avec des exemples positifs, des objets ressemblants qui ne font pas partie de la classe et des cas limites.
  2. Règles de dessin : des boîtes ajustées à l’objet visible ; des polygones qui suivent son contour visible.
  3. Règles d’occlusion et de taille : un seuil pour les objets partiels (« annote si tu peux identifier la classe ») et un pour les objets minuscules (« annote les personnes de plus de 10 pixels »), appliqués partout.
  4. Journal des cas ambigus : chaque question du type « qu’en est-il de celui-ci ? », avec la réponse convenue et une capture d’écran.
  5. Éléments à ignorer : tout ce qu’il ne vaut pas la peine d’annoter pour cette tâche.

Une ou deux pages avec des captures d’écran suffisent largement. Le guide sert ensuite de base à une courte boucle de travail effectuée avant de passer à l’échelle supérieure pour l’annotation :

Un étiquetage partiel ruine discrètement l’entraînement

Étiquette tous les objets pertinents dans chaque image. Un chariot élévateur non étiqueté apprend au modèle que les chariots élévateurs font parfois partie de l’arrière-plan, et le modèle apprend donc à ne pas les détecter. Un jeu de données partiellement étiqueté semble identique à un jeu de données plus petit et entièrement étiqueté, jusqu’à ce que tu lances l’entraînement. Termine chaque image avant de passer à la suivante.

Dix erreurs qui nuisent à la précision#

Les erreurs que l’équipe d’annotation d’Ultralytics rencontre le plus souvent, illustrées par des images de chariots élévateurs, de personnes et de palettes (adaptées d’une présentation d’Alexis Schutzger). Utilise-les comme premières entrées de ton guide.

1. Extrapoler la forme de l’objet. Annote uniquement ce que tu peux voir. Ici, le chariot élévateur se trouve derrière une personne et une pile de bois, mais sa boîte englobe les deux, jusqu’à l’endroit où l’annotateur a imaginé le reste du véhicule. Encadre uniquement la partie visible.

Erreur d’annotation : la boîte du chariot élévateur s’étend sur la personne et la pile de bois devant lui, extrapolant la partie cachée au lieu d’encadrer uniquement ce qui est visible

2. Boîtes imprécises. Les boîtes doivent épouser l’objet. Celle-ci coupe les lumières du toit de protection ; une boîte qui coupe une partie de l’objet ou laisse une marge de sol apprend au modèle une étendue incorrecte.

Erreur d’annotation : boîte imprécise autour d’un chariot élévateur, dont le bord supérieur coupe les lumières du toit de protection au lieu d’englober l’objet entier

3. Conventions incohérentes pour des objets similaires. La boîte de gauche inclut les fourches ; celle de droite les exclut. Le modèle reçoit deux réponses à la même question : note donc la convention à suivre, fourches incluses ou exclues.

Erreur d’annotation : deux chariots élévateurs similaires encadrés selon des conventions différentes, une boîte incluant les fourches et l’autre les excluant

4. Annotations manquantes. Deux personnes se tiennent à côté du chariot élévateur, mais une seule est encadrée. La personne sans annotation apprend au modèle que « les personnes font partie de l’arrière-plan ».

Erreur d’annotation : le chariot élévateur et un agriculteur sont encadrés, mais le deuxième agriculteur n’est pas annoté

5. Mauvaise classe. Vérifie la classe, pas seulement la boîte. Une boîte correcte autour d’un chariot élévateur étiqueté person corrompt les deux classes, généralement à cause d’une erreur de raccourci clavier.

Erreur d’annotation : boîte correctement dessinée autour d’un chariot élévateur auquel la mauvaise classe « personne » a été attribuée

6. Annotations vides ou parasites. Chaque annotation doit correspondre à un véritable objet et à une véritable classe. Un clic parasite laisse une boîte presque vide comme celle dans le coin, et une boîte enregistrée sans classe peut être exportée sous None ou avec la classe 0. Corrige-les ou supprime-les.

Erreur d’annotation : annotation parasite presque vide d’un chariot élévateur laissée dans le coin de l’image, à côté de la véritable boîte du chariot

7. Boîtes en double. Un objet, une boîte. Deux boîtes qui se chevauchent sur le même chariot élévateur gonflent le nombre d’instances et apprennent au modèle à prédire des doublons.

Erreur d’annotation : deux boîtes en double qui se chevauchent sur un seul chariot élévateur

8. Consignes peu claires. Sans règle écrite, les annotateurs improvisent : ici, l’un a encadré uniquement la tête du conducteur et lui a attribué la classe forklift. Le conducteur fait-il partie du chariot élévateur, ou s’agit-il d’un person distinct ? Réponds une fois à cette question dans le guide.

Erreur d’annotation : sans consigne claire, un annotateur encadre uniquement la tête de l’opérateur et l’étiquette comme un chariot élévateur

9. Images aberrantes. Écarte les images qui ne correspondent pas au déploiement. Une photo de panorama urbain dans un jeu de données de chariots élévateurs n’apporte rien d’utile et dilue le reste.

Erreur d’annotation : photo de gratte-ciel intégrée à un jeu de données de chariots élévateurs comme image aberrante

10. Ambiguïté induite par l’augmentation. Si un recadrage peut supprimer la caractéristique qui définit une classe, deux classes deviennent identiques. Coupe le symbole dans le coin d’un as de cœur : il ressemble alors aux cartes étiquetées unknown. Utiliser l’augmentation avec précaution explique comment corriger le problème.

Erreur d’annotation : cartes à jouer où un as de cœur dont le symbole du coin a été recadré ressemble aux cartes étiquetées comme inconnues

Mesure l’accord, ne le devine pas#

Une phase de calibration donne les mêmes images à deux annotateurs et compare leurs étiquettes objet par objet. Deux étiquettes concordent si elles ont la même classe et se chevauchent selon un IoU d’au moins 0,5. Ce script calcule le score sur les images de validation de COCO8. Pour pouvoir l’exécuter sans deuxième personne, un modèle préentraîné joue le rôle de l’annotateur B ; avec une vraie équipe, lis plutôt les boîtes de B dans ses fichiers d’étiquettes :

from pathlib import Path

import torch

from ultralytics import YOLO
from ultralytics.data.utils import check_det_dataset, img2label_paths
from ultralytics.utils.metrics import box_iou
from ultralytics.utils.ops import xywh2xyxy

data = check_det_dataset("coco8.yaml")
model = YOLO("yolo26n.pt")  # stands in for a second annotator; compare two label folders the same way
names = data["names"]

matched = total = 0
for image in sorted(Path(data["val"]).glob("*.jpg")):
    rows = [r.split() for r in Path(img2label_paths([str(image)])[0]).read_text().splitlines() if r.strip()]
    a_cls = torch.tensor([int(r[0]) for r in rows])  # annotator A: the dataset labels
    a_box = xywh2xyxy(torch.tensor([[float(v) for v in r[1:]] for r in rows]))
    b = model(image, conf=0.5, verbose=False)[0].boxes  # annotator B: confident model proposals
    iou = box_iou(a_box, b.xyxyn)
    used = set()
    for i in range(len(rows)):  # pair each A object with the best unused same-class B box at IoU >= 0.5
        ok = [j for j in range(len(b)) if j not in used and b.cls[j] == a_cls[i] and iou[i, j] >= 0.5]
        if ok:
            used.add(max(ok, key=lambda j: iou[i, j]))
        else:
            print(f"{image.name}: {names[int(a_cls[i])]} labeled by A only")
    for j in set(range(len(b))) - used:
        print(f"{image.name}: {names[int(b.cls[j])]} labeled by B only")
    matched += len(used)
    total += len(rows) + len(b) - len(used)

print(f"agreement: {matched}/{total} objects = {matched / total:.0%}")
000000000049.jpg: person labeled by A only
000000000049.jpg: person labeled by A only
000000000049.jpg: potted plant labeled by A only
000000000049.jpg: person labeled by A only
000000000049.jpg: person labeled by A only
000000000049.jpg: person labeled by A only
000000000061.jpg: person labeled by A only
000000000061.jpg: elephant labeled by A only
000000000061.jpg: person labeled by A only
agreement: 8/17 objects = 47%

Comment interpréter le résultat :

  • Le score correspond au nombre d’objets appariés divisé par le nombre total d’objets dessinés par l’un ou l’autre annotateur : 8 sur 17.
  • Les désaccords se concentrent. Les neuf désaccords se trouvent dans deux images, et la plupart concernent des personnes couvrant bien moins de 1 % de l’image. Ce ne sont pas neuf erreurs aléatoires, mais une seule règle manquante : étiquetons-nous les personnes éloignées ?
  • La solution consiste à ajouter une consigne au guide, par exemple « étiqueter toute personne mesurant au moins 10 pixels de haut dans une image de 640 pixels ». Les deux annotateurs réétiquettent ces deux images, puis le score est recalculé.

La règle de décision : n’augmente l’échelle de l’annotation que lorsque l’accord atteint 90 %. En dessous, chaque nouvel annotateur multiplie les incohérences.

Utilise l’annotation intelligente pour accélérer le travail#

L’annotation intelligente permet à un modèle YOLO ou SAM de proposer des étiquettes qu’une personne accepte ou corrige, ce qui peut multiplier le débit plusieurs fois. Procède par cycles : entraîne un modèle sur un lot vérifié, utilise-le pour proposer les étiquettes du lot suivant, vérifie-les, puis réentraîne le modèle. C’est le cycle d’apprentissage actif, présenté dans Annotation intelligente et étiquetage par lots sur Ultralytics Platform.

Accepter automatiquement les propositions inscrit les erreurs du modèle dans les données

Un modèle qui ne détecte pas les petites personnes ne propose aucune boîte pour elles, et un réviseur qui clique sur « tout accepter » ne les ajoute jamais. Le modèle suivant, entraîné sur ces étiquettes, les manque avec encore plus d’assurance. Révise chaque image et ajoute les éléments manqués par le modèle, en plus de corriger ce qu’il a dessiné.

Vérifie à l’œil#

Chaque entraînement Ultralytics écrit labels.jpg et train_batch*.jpg dans son dossier d’exécution. Le premier trace le nombre de classes ainsi que la position et la taille des boîtes ; les autres montrent de vraies images d’entraînement avec leurs étiquettes. Ouvre-les avant la fin de la première époque. L’œil repère ce que les métriques ne verront jamais : des boîtes autour des ombres, des ID de classe inversés et des polygones qui ne se referment pas.

Essayer

Rédige un guide d’annotation d’une page pour tes classes, avec les cinq sections ci-dessus et les dix erreurs comme exemples. Donne les mêmes 20 à 50 images à deux personnes, demande-leur de les annoter séparément, puis adapte agreement.py pour comparer leurs deux dossiers d’étiquettes. Livrables : le guide, le score d’accord et une nouvelle règle pour chaque groupe de désaccords.

Terminé lorsque
Tu as terminé la leçon lorsque tous les éléments suivants sont réunis.
  • Le guide définit chaque classe et précise les règles de dessin, d’occultation et de taille.

  • Deux annotateurs ont étiqueté les mêmes images et l’accord est mesuré par un script, pas estimé.

  • Chaque groupe de désaccords a donné lieu à une règle écrite, et l’accord atteint au moins 90 % après réannotation.

Afficher la solution

Les désaccords sur COCO8 donnent lieu à des consignes comme celles-ci dans le guide :

DésaccordRègle ajoutée au guide
Personnes éloignées dans 000000000049.jpg étiquetées uniquement par AÉtiqueter toute personne mesurant au moins 10 pixels de haut dans une image de 640 pixels ; ignorer les personnes plus petites dans toutes les images.
Plante en pot au bord de l’image étiquetée uniquement par AÉtiqueter un objet coupé par le bord de l’image si au moins la moitié de l’objet est visible.
Éléphant partiellement caché par un autre éléphant dans 000000000061.jpgÉtiqueter les animaux occultés si leur tête ou la moitié de leur corps est visible ; encadrer uniquement la partie visible.

Pour comparer deux personnes plutôt qu’une personne et un modèle, lis les lignes de l’annotateur B dans le second dossier d’étiquettes, exactement comme le script lit celles de A (Path("labels_b", image.stem + ".txt")), crée b_cls et b_box à partir de ces lignes avec les mêmes deux lignes de code, puis utilise-les partout où le script lit b.cls et b.xyxyn. Relance le script après la réannotation ; le cycle est terminé lorsque le score dépasse 90 %.

Et ensuite ?

Une fois les étiquettes prêtes, la leçon suivante effectue un contrôle qualité pour repérer ce que le guide a oublié, avant que cela ne compromette un entraînement.