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

Commencer par l'objectif métier

Transforme un objectif métier en une tâche de vision, en classes définies et en test d'acceptation exécutable sous forme de code, avant même de collecter la moindre image.

Un bureau avec un ordinateur portable affichant un jeu de données d'images annotées, des tirages photo triés, des notes autocollantes indiquant les classes et une liste de contrôle du jeu de données

Une équipe d'entrepôt photographie tout pendant un mois, puis apprend que la responsable de la sécurité ne s'intéresse qu'aux personnes à proximité des chariots élévateurs en mouvement et que la moitié des annotations doit être refaite. Un objectif d'une page, convenu avant la première photo, évite cela. Il prend un après-midi à rédiger et détermine tous les choix ultérieurs de ce cours : quoi collecter, quoi annoter et quand le modèle est assez bon pour être déployé.

Résultat

Rédige un objectif d'une page et transforme son indicateur de réussite en un script de test d'acceptation qui affiche PASS ou FAIL pour n'importe quel modèle.

Parcours accéléré
Si tu connais déjà les bases, voici la version courte.
  1. Formule l'objectif métier en une phrase mesurable avec une échéance.

  2. Choisis la plus simple des sept tâches de vision qui permet d'y répondre.

  3. Définis 3–10 classes en une phrase chacune, en nommant pour chacune un élément ressemblant qu'elle exclut.

  4. Rédige le test d'acceptation : indicateur, seuil et jeu de données de réserve non observé. Puis exécute-le sous forme de code.

  5. Indique ce que la v1 ne prendra pas en charge.

Pratique

L'objectif d'une page#

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

Cinq lignes répondent aux questions dont dépend chaque étape ultérieure. Le guide sur la définition des objectifs du projet traite des mêmes sujets plus en détail. Voici un exemple rempli pour un entrepôt, qui sert de base à ce cours :

LigneQuestion à laquelle elle répondExemple d'entrepôt
Objectif métierQu'est-ce qui change pour l'entreprise, et pour quand ?Réduire de 30 % les incidents évités de justesse aux portes de quai en six mois.
Tâche de visionQue renvoie le modèle ?Détection d'objets : des boîtes autour des chariots élévateurs et des personnes.
ClassesQu'est-ce qui reçoit exactement une annotation ?forklift, person, pallet ; tout le reste est de l'arrière-plan.
Test d'acceptationQuel chiffre signifie « prêt à déployer » ?Rappel sur person ≥ 0,95 avec une précision ≥ 0,85 sur 500 images provenant de caméras non utilisées pour l'entraînement.
Hors périmètreQue ne promettra pas la v1 ?Quais plongés dans l'obscurité, personnes entièrement cachées derrière des rayonnages, transpalettes manuels.

Affiche la page à un endroit où toute l'équipe peut la voir. Si une partie prenante conteste une ligne plus tard, modifie d'abord la page, puis le jeu de données.

Choisir la tâche la plus simple qui répond à la question#

La même scène avec un chat et un chien interprétée de trois façons : la classification d'image demande s'il s'agit d'un chat, la détection d'objets demande quels objets se trouvent où, et la segmentation d'image demande quels pixels appartiennent à quel objet

La tâche détermine ce que les annotateurs dessinent, et cela détermine l'essentiel du budget d'annotation. Suis cet arbre de décision et arrête-toi à la première tâche qui répond à la question métier :

Ultralytics YOLO prend en charge sept tâches. Pour planifier un jeu de données, ce qui compte, c'est le coût d'annotation de chacune ; Fondamentaux de la vision par ordinateur les compare en détail dans sa leçon sur les tâches de vision.

TâcheProduction des annotateursEffort d'annotationÀ choisir lorsque
ClassificationUne étiquette par imageLe plus faibleUne réponse par image suffit
DétectionClasse + boîte alignée sur les axes par objetFaibleTu dois compter ou localiser des objets
OBBClasse + boîte orientée par objetMoyenLes objets sont longs, fins ou vus d'en haut
PoseClasse + points clés nommés par objetÉlevéLa position des articulations ou des parties compte
Segmentation d’instanceClasse + polygone par objetÉlevéLe contour de chaque objet compte
Segmentation sémantiqueUne classe pour chaque pixelLe plus élevéTu as besoin de régions, pas d’objets dénombrables
Estimation de profondeurRien n’est dessiné : une carte de profondeur par image, généralement obtenue à l’aide d’un capteur de profondeurDépend du matériel de captureTu as besoin de la distance de chaque pixel

Types d’annotation d’image sur un régime de bananes : la classification indique la présence, la détection ajoute l’emplacement et le comptage, la segmentation sémantique montre quels pixels correspondent aux bananes, et la segmentation d’instances ajoute la taille et la forme de chaque banane

Lis le panneau des bananes comme une liste de prix : la détection indique déjà la présence, l’emplacement et le nombre, et seuls les deux panneaux de segmentation ajoutent la taille et la forme, à un coût d’annotation bien plus élevé. Si l’entreprise veut seulement savoir « combien de bananes », la détection est la solution et les polygones sont une dépense inutile.

La segmentation épuise le budget par défaut

Les équipes se tournent souvent vers la segmentation parce qu’elle semble plus précise, puis épuisent leur budget d’annotation avant que le jeu de données couvre les équipes de nuit, la pluie ou le deuxième site. Les polygones coûtent plusieurs fois plus cher par objet que les boîtes. Choisis la segmentation uniquement si un critère de l’objectif exige le contour lui-même, par exemple pour mesurer une surface ou découper un masque.

Définis des classes qu’un annotateur peut appliquer#

Une classe n’est utile que si deux annotateurs attribuent la même étiquette au même objet. Définis chaque classe en une phrase qui précise un élément ressemblant qu’elle exclut :

  • forklift : un chariot élévateur motorisé, fourches et mât compris. Exclut les transpalettes manuels.
  • person : toute personne, y compris partiellement visible, assise ou dans la cabine d’un véhicule. Exclut les reflets et les affiches.
  • pallet : une palette d’expédition en bois ou en plastique, chargée ou vide. Exclut les caisses empilées sans palette à leur base.

Choisis ensuite délibérément le niveau de granularité. Les classes générales (« véhicule ») coûtent moins cher et convergent plus vite ; les classes détaillées (« berline », « pick-up ») sont plus utiles en aval, mais plus difficiles à appliquer de façon cohérente. Commence par définir les besoins de l’entreprise. Il est possible de regrouper plus tard des étiquettes détaillées en classes générales avec une seule ligne de code, mais il est impossible de subdiviser des classes générales sans refaire l’annotation.

Si tu ne peux pas le formuler par écrit, les annotateurs ne peuvent pas l’étiqueter

« Tout ce qui semble dangereux » ou « les trucs qui bloquent l’allée » ne constitue pas une classe. Cela demande à chaque annotateur de porter un jugement, et un modèle entraîné sur des jugements incohérents apprend cette incohérence. Reformule une classe vague jusqu’à ce qu’un nouvel annotateur puisse l’appliquer à partir de la seule définition, ou transforme-la en règle appliquée après la détection (par exemple, « tout pallet à l’intérieur du polygone de l’allée »).

Transforme la métrique en un test d’acceptation que tu peux exécuter#

Choisis la métrique qui correspond au coût d’une erreur :

  • Un oubli coûte cher (sécurité, défauts) : fixe un seuil de rappel pour cette classe.
  • Une fausse alerte coûte cher (rejet automatique de pièces, alerte du personnel) : fixe un seuil de précision.
  • Toutes les classes comptent autant (comptage, inventaire) : fixe un seuil d’AP par classe pour qu’aucune classe ne se dissimule derrière la moyenne.

Le guide des métriques de performance YOLO explique chacune d’elles. Écris ensuite le test sous forme de code pour mettre fin aux débats sur la question « est-ce assez bon ? ». Ce script fonctionne dès maintenant avec un modèle préentraîné sur le jeu de démonstration COCO8, puis plus tard avec ton propre checkpoint et ton jeu de données de validation indépendant :

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # later: your fine-tuned runs/detect/train/weights/best.pt
metrics = model.val(data="coco8.yaml", classes=[0], verbose=False)  # 0 = person; later: your holdout YAML

precision, recall = metrics.box.mp, metrics.box.mr
print(f"person: precision={precision:.2f} recall={recall:.2f}")
print("PASS" if recall >= 0.95 and precision >= 0.85 else "FAIL: below the acceptance test")
                   all          4         10      0.939        0.8      0.848      0.387
person: precision=0.94 recall=0.80
FAIL: below the acceptance test

Ce que chaque ligne t’indique :

  • classes=[0] évalue uniquement person, afin que les autres classes ne puissent pas gonfler le résultat. Utilise l’identifiant de ta propre classe de sécurité.
  • La ligne du validateur indique 4 images contenant 10 personnes annotées. mp et mr correspondent à la précision et au rappel au seuil de confiance qui les équilibre le mieux (F1 maximal).
  • Un modèle COCO préentraîné détecte 8 des 10 personnes, soit un rappel de 0,80 : le résultat est précis, mais pas assez sûr. Cet échec montre que le test fait son travail. Dans ce cours, un échec renvoie aux données, pas aux hyperparamètres.
La clause de mise à l’écart compte autant que le nombre

Un test constitué à partir des mêmes caméras et des mêmes jours que l’entraînement mesure la mémoire, pas la capacité à être déployé. Indique le jeu de mise à l’écart dans l’objectif (« caméras non utilisées pour l’entraînement », « les deux dernières semaines d’images ») et constitue-le avec Répartir correctement le jeu de données.

Note ce que la v1 ne fera pas#

Aucun modèle n’est parfait. Précise donc à l’avance les erreurs acceptables : les conditions que tu ne couvriras pas (brouillard épais, obscurité totale), les éléments ressemblants qu’il est acceptable de confondre et les classes rares reportées à la v2. Cette ligne évite qu’un modèle qui atteint son objectif soit jugé selon un seuil de 100 % jamais énoncé, et indique à l’équipe de collecte où ne pas investir ses efforts pour l’instant.

Essayer

Remplis le tableau des objectifs à cinq lignes pour ton projet et envoie-le à la personne responsable du résultat commercial. Révise chaque ligne qu’elle remet en question. Copie ensuite acceptance_test.py, définis l’identifiant de ta classe et tes seuils, puis exécute le script avec le modèle préentraîné pour que le test existe avant le jeu de données. Livrables : objective.md et un acceptance_test.py fonctionnel.

Terminé lorsque
Tu as terminé la leçon lorsque tous les éléments suivants sont réunis.
  • L’objectif commercial tient en une phrase mesurable avec une échéance, et la personne responsable l’a approuvé.

  • Chaque classe a une définition en une phrase et au moins un élément ressemblant nommé qu’elle exclut.

  • acceptance_test.py s’exécute et affiche PASS ou FAIL pour une métrique, un seuil et un jeu de validation indépendant défini.

Afficher la solution

Voici un objectif concret pour un autre projet : une chaîne d’épiceries qui détecte les emplacements vides en rayon.

LigneRéponse
Objectif métierRéduire de 25 % les minutes de rupture de stock sur les 200 produits les plus vendus en un trimestre.
Tâche de visionDétection. Le magasin a besoin de l’emplacement de chaque espace vide, pas de son contour : les boîtes sont donc préférables aux polygones.
Classesgap : un emplacement vide en rayon d’au moins la largeur d’un produit ; exclut les emplacements cachés par un client ou un chariot. price_tag : une étiquette de bord de rayon ; exclut les autocollants promotionnels.
Test d'acceptationRappel de gap ≥ 0.90 avec une précision ≥ 0.80 sur 400 images provenant de 5 magasins non utilisés pour l’entraînement.
Hors périmètrePortes de congélateur avec reflets, présentoirs de tête de gondole, rayon des fruits et légumes.

Le rappel passe en premier, car un espace vide non détecté entraîne une vente perdue, tandis qu’une fausse alerte coûte une courte marche à un membre du personnel. acceptance_test.py ne change qu’à trois endroits : data="holdout_stores.yaml" (les cinq magasins inconnus), classes=[0] (0 devient gap) et les seuils recall >= 0.90 and precision >= 0.80.

Et ensuite ?

Ensuite, transforme l’objectif en spécification de jeu de données qui indique les images nécessaires et leur nombre.