Comprendre la détection d’objets
Lis la sortie d’un détecteur — classe, boîte, confiance — et règle les seuils de confiance et d’IoU en fonction du coût de chaque erreur.
La plupart des systèmes de vision en production reposent sur la détection, complétée par une logique : compteurs, suiveurs, alertes de zone, floutage pour protéger la vie privée. Lorsqu’un système se comporte mal, la cause est généralement le choix involontaire d’un seuil, et non le modèle. Sache exactement ce que renvoie un détecteur et quels sont les deux paramètres qui déterminent la liste : tu pourras ainsi déboguer presque tout ce qui s’appuie dessus.
Pratique
Ce que renvoie un détecteur#

Chaque étiquette de cette image correspond à une ligne de sortie : un nom de classe, un niveau de confiance et la boîte qui l’entoure. Un modèle de détection renvoie exactement cette liste :
- Classe — un indice entier associé à un nom via
result.names(0correspond àperson,5àbus). - Boîte — quatre nombres qui localisent l’objet ;
xyxyindique les coordonnées en pixels du coin supérieur gauche et du coin inférieur droit. - Confiance — un score compris entre 0 et 1, utilisé pour classer et filtrer les détections.
Le comptage, les alertes, le suivi et le floutage sont des fonctionnalités que tu codes à partir de ces lignes.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", verbose=False)[0]
for box in result.boxes:
name = result.names[int(box.cls)]
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{name:8} conf={float(box.conf):.2f} box=({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")bus conf=0.88 box=(0, 230, 803, 751)
person conf=0.87 box=(49, 398, 240, 902)
person conf=0.86 box=(223, 405, 345, 861)
person conf=0.85 box=(670, 395, 810, 880)
person conf=0.65 box=(0, 553, 60, 871)Ligne par ligne : la boîte du bus commence à x=0 parce que le bus sort du cadre à gauche ; trois personnes obtiennent un score de 0.85–0.87 ; la quatrième personne, coupée par le bord gauche, n’obtient que 0.65 — le modèle ne voit que la moitié du corps. Une faible confiance pour les objets tronqués est normale, et c’est là qu’un seuil a d’abord un effet.
Chaque boîte est disponible dans quatre formats ; utilise celui qu’attend ton code en aval :
| Attribut | Format | Utilisation habituelle |
|---|---|---|
boxes.xyxy | Coordonnées des coins en pixels (x1, y1, x2, y2) | Recadrage, dessin, règles de chevauchement |
boxes.xywh | Centre en pixels, largeur et hauteur | Filtres de taille, mouvement |
boxes.xyxyn | Coordonnées des coins normalisées entre 0 et 1 | Règles qui restent valides lorsque la résolution change |
boxes.xywhn | Centre et dimensions normalisés entre 0 et 1 | Fichiers d’étiquettes YOLO |
Des candidats à la liste finale#
En interne, le modèle attribue un score à de nombreuses boîtes candidates par objet. Deux filtres les transforment en liste affichée :
Filtre de confiance. conf élimine les boîtes sous un seuil ; la valeur par défaut en prédiction est 0.25. Sur l’image du bus, le nombre change rapidement :
conf | Boîtes sur bus.jpg |
|---|---|
| 0.10 | 7 |
| 0.25 | 5 |
| 0.50 | 5 |
| 0.75 | 4 |
Filtre des doublons. La suppression non maximale (NMS) conserve la boîte ayant la confiance la plus élevée et élimine les autres boîtes de la même classe qui la chevauchent au-delà de iou (valeur par défaut : 0.7). Le chevauchement est mesuré par l’intersection sur union : la surface commune divisée par la surface totale réunie.

iou | Boîtes sur bus.jpg | Effet |
|---|---|---|
| 0.3 | 5 | Strict : les boîtes qui se chevauchent sont fusionnées |
| 0.7 | 5 | Par défaut |
| 0.95 | 8 | Permissif : les quasi-doublons sont conservés |
Choisis les seuils en fonction du coût des erreurs#
| Si… | Alors… |
|---|---|
| Un faux négatif coûte cher (alertes de sécurité, défauts) | Abaisse conf et accepte quelques fausses alertes |
| Une fausse alerte est visible par les utilisateurs (recherche, étiquetage) | Relève conf |
| Tu communiques des nombres de détections | Fais varier conf sur les images de validation et garde la valeur qui minimise l'erreur de comptage |
| Les vrais objets voisins disparaissent dans les foules | Relève iou, par exemple de 0.7 → 0.8 |
| Le même objet reçoit deux boîtes | Abaisse iou |
| La difficulté varie selon les classes | Fais des prédictions avec la valeur la plus basse de conf dont tu as besoin, puis filtre par classe dans le code |
La surveillance de la sécurité en entrepôt est le cas classique où utiliser un seuil bas ; le mode Predict répertorie tous les arguments d'inférence.
Pièges#
Symptôme : « le modèle est sûr à 88 % que c’est un bus », et des seuils choisis à l’intuition. Solution : considère la confiance comme un score de classement. Dans YOLO26, un seul score couvre à la fois « il y a un objet » et « c’est cette classe », et il n’est pas calibré — choisis le seuil à partir des données de validation, pas en fonction de la signification du nombre.
Quand deux personnes se tiennent côte à côte, leurs boîtes se chevauchent fortement et NMS peut supprimer une vraie personne comme « doublon ». Augmente iou et la deuxième boîte réapparaît. YOLO26 propose aussi une tête de détection de bout en bout qui ne nécessite aucun NMS ; passe nms=False pour l’utiliser.
Symptôme : un seuil qui semble parfait sur l’image de démonstration échoue avec la vraie caméra. Solution : balaie les seuils sur un jeu de validation issu de la caméra de déploiement ; une seule image te montre uniquement l’effet des paramètres.
Quatre façons de se tromper#
| Échec | Quel est le problème ? | Correctif habituel |
|---|---|---|
| Bonne classe, boîte imprécise | Localisation | Des règles de boîte plus strictes et cohérentes ; une valeur plus élevée de imgsz pour les petits objets |
| Bonne boîte, mauvaise classe | Classification | Ajoute des exemples de la paire confondue ou fusionne les classes |
| Aucune boîte | Rappel | Ajoute des exemples de cette situation : éclairage, taille, occultation |
| Boîte sur l'arrière-plan | Précision | Des images difficiles contenant tout ce qui a trompé le modèle |
Deux listes facilitent le diagnostic : les vrais positifs à faible confiance (le modèle doute d'objets réels) et les faux positifs à forte confiance (il est sûr de lui, mais se trompe). Elles orientent vers des correctifs différents.
Afficher la solution
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", conf=0.05, save=True, verbose=False)[0]
for box in sorted(result.boxes, key=lambda b: -float(b.conf)):
name, conf = result.names[int(box.cls)], float(box.conf)
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{conf:.2f} {name:10} ({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")0.88 bus (0, 230, 803, 751)
0.87 person (49, 398, 240, 902)
0.86 person (223, 405, 345, 861)
0.85 person (670, 395, 810, 880)
0.65 person (0, 553, 60, 871)
0.18 person (0, 600, 40, 871)
0.12 stop sign (0, 252, 35, 326)
0.08 handbag (43, 732, 78, 812)
0.07 skateboard (669, 822, 808, 881)
0.06 handbag (225, 634, 291, 705)Toutes les boîtes sous 0.5 sont des faux positifs. La boîte à 0.18 de person fait doublon avec la personne à 0.65, coupée au bord gauche. La boîte à 0.12 de stop sign correspond à un vrai panneau routier, mais avec la mauvaise classe. Les sacs à main et le skateboard sont sur des mains et des chaussures. Tous les objets réels ont un score supérieur à 0.6 ; conf=0.5 conserve donc les quatre personnes et écarte toutes les détections parasites pour un compteur de piétons — il évite le double comptage. Vérifie ce réglage sur un jeu de validation provenant de la caméra réelle avant le déploiement : la personne tronquée à 0.65 montre à quel point les objets réels peuvent être proches du seuil.