Comprendre la détection de bout en bout dans Ultralytics YOLO26#
YOLO26 entraîne à la fois une tête one-to-many et une tête one-to-one. Par défaut, la prédiction et la validation utilisent la tête one-to-many avec la suppression non maximale (NMS). Cette approche privilégie la précision avec les mêmes poids entraînés. Définis nms=False pour utiliser à la place la tête one-to-one, plus rapide et sans NMS.
Un seul argument détermine le choix pour la prédiction, la validation, le suivi, l’exportation et l’évaluation comparative :
nms | Prédiction et validation | Export |
|---|---|---|
None (par défaut) | Tête one-to-many ; Ultralytics applique NMS | Sorties brutes one-to-many ; le programme appelant applique NMS |
True | Identique à None | Tête one-to-many avec NMS intégrée lorsque le format le permet |
False | Tête one-to-one sans suppression par IoU | Sorties one-to-one sans NMS lorsque le format le permet |
None signifie qu’aucun post-traitement facultatif n’est intégré au modèle. Cela ne supprime pas le traitement habituel qui convertit les sorties du modèle en résultats de prédiction ou en métriques de validation. La classification, la segmentation sémantique, la profondeur et les modèles sans tête de détection sélectionnable conservent leur comportement natif.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.predict("image.jpg") # one-to-many + NMS
metrics = model.val(data="coco.yaml") # one-to-many + NMS
results = model.predict("image.jpg", nms=False) # activer l’inférence sans NMS
results = model.predict("image.jpg", nms=None) # revenir à one-to-many + NMS
model.export(format="onnx") # sorties brutes one-to-many
model.export(format="onnx", nms=True) # intégrer NMS
model.export(format="onnx", nms=False) # sorties one-to-one sans NMSFonctionnement de la détection de bout en bout#
Les deux têtes partagent le backbone et le neck et sont optimisées pendant l’entraînement. La tête one-to-many fournit plusieurs prédictions candidates par objet ; NMS supprime les détections qui se chevauchent. La tête one-to-one apprend à produire une seule prédiction par objet. Le choix du chemin d’inférence ne désactive pas la supervision à deux têtes. La validation pendant l’entraînement utilise la tête d’inférence sélectionnée : le choix des checkpoints et l’arrêt anticipé reposent donc sur les mêmes prédictions que le déploiement.
| Tête | Sortie de détection avant traitement externe | Traitement |
|---|---|---|
| One-to-many (par défaut) | (N, nc + 4, 8400) | Filtrage par confiance et NMS |
| One-to-one | (N, 300, 6) | Filtrage par confiance ; aucune suppression par IoU |
Ici, N correspond à la taille du lot, nc au nombre de classes, et 8400 au nombre de candidats pour imgsz=640. Les lignes de détection one-to-one contiennent [x1, y1, x2, y2, confidence, class_id]. Les autres tâches de détection comportent des sorties supplémentaires :
| Tâche | Sortie de bout en bout | Données supplémentaires |
|---|---|---|
| Détection | (N, 300, 6) | — |
| Segmentation d’instances | (N, 300, 6 + nm) et (N, nm, H, W) | Coefficients de masque et prototypes |
| Pose | (N, 300, 57) | 17 points clés × 3 valeurs |
| OBB | (N, 300, 7) | Angle de rotation |
La fusion supprime les branches d’inférence inutilisées et replie les couches Conv et BatchNorm. Conserve le checkpoint d’entraînement d’origine si tu dois changer de tête : la fusion ne peut pas reconstruire une branche déjà supprimée. Un modèle auquel il ne reste que sa tête one-to-one conserve ce chemin disponible.
Sorties exportées#
Par défaut, les modèles de détection YOLOv8, YOLO11 et YOLO26 exportent des prédictions brutes one-to-many. Exporte YOLO26 avec nms=False pour obtenir des détections sans NMS.
nms=None | nms=False | |
|---|---|---|
| Sortie de détection | (N, nc + 4, 8400) | (N, 300, 6) |
| Format des boîtes | xywh | xyxy |
| Scores | Un score par classe et par candidat | Confiance et ID de classe par détection |
| Traitement externe | Filtrage par confiance et NMS | Filtrage par confiance |
nms=True produit également des détections traitées, mais utilise la tête one-to-many et intègre le NMS traditionnel. Cette option est utile si tu veux que ton environnement d’exécution de déploiement reçoive des détections sans avoir à implémenter lui-même la suppression.
Le graphe d’un modèle exporté détermine ses sorties. Le fait de transmettre nms lors du chargement ne reconstruit pas le graphe ; exporte le checkpoint source avec la valeur nms souhaitée pour sélectionner son chemin de sortie. Ultralytics utilise les métadonnées de l’artefact pour éviter d’appliquer le NMS deux fois.
Compatibilité des formats d’exportation#
ONNX, TensorRT, CoreML, OpenVINO et plusieurs autres formats prennent en charge les exportations sans NMS. NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX, Edge TPU et Qualcomm QNN utilisent le chemin one-to-many lorsque leurs opérateurs ne prennent pas en charge les sorties de bout en bout. Les avertissements de format expliquent ce repli.
- NMS intégré :
nms=Trueest soumis aux restrictions propres à chaque format concernant les tâches, la précision et les formes dynamiques. Les formats qui ne prennent pas en charge le NMS intégré exportent les sorties natives pour un traitement externe. - CoreML : Le NMS intégré prend en charge la détection, la segmentation et la pose avec des formes statiques. Utilise
nms=Truepour les modèles de détection qui nécessitent le pipeline NMS de Xcode Preview. - MNN : Le NMS intégré prend en charge la détection et la pose avec
dynamic=False. - IMX : La détection, la segmentation d’instances et la pose nécessitent un NMS intégré, sélectionné automatiquement.
- Hailo : YOLO26 utilise des tenseurs bruts avec le NMS côté hôte par défaut ;
nms=Falsesélectionne son chemin one-to-one. La détection YOLOv8/YOLO11 utilise le NMS de HailoRT. - Quantification : Les versions de TensorRT antérieures à 8.5.0, TensorRT 10.3.0 INT8 sur JetPack 6 et LiteRT INT8 ou
w8a16utilisent les sorties one-to-many.
Consulte les guides d’intégration propres à chaque matériel pour connaître la configuration requise. Pour obtenir des tenseurs de sortie FP16 complets, utilise nms=None ; les indices de classe de bout en bout peuvent maintenir les tenseurs de sortie en FP32 même lorsque le modèle est quantifié.
Compromis entre précision et vitesse#
Les résultats publiés de YOLO26 sur COCO montrent que la tête one-to-many améliore le mAP de détection de 0,6 à 0,8 point sur les cinq échelles : par exemple, 40,9 contre 40,1 pour YOLO26n et 57,5 contre 56,9 pour YOLO26x. La tête one-to-one évite l’étape NMS et privilégie la latence. Ces résultats justifient le choix par défaut, mais ne garantissent pas un gain sur chaque jeu de données.
Les mesures de vitesse publiées pour l’inférence sans NMS utilisent nms=False. Compare la précision et la latence en gardant la même sélection de tête, la même taille d’image, la même précision et le même matériel.
FAQ#
Cette option limite le nombre de détections renvoyées par la prédiction et la validation. Pour les exportations de bout en bout et avec NMS intégré, la limite fait partie du graphe : réexporte le modèle pour la modifier. L’exception est le NMS intégré de détection CoreML, qui n’impose aucune limite au nombre de détections. Les sorties de bout en bout peuvent contenir moins de candidats si l’image fournit moins de
max_detancres.Oui, avec
nms=Falseounms=Trueet la limite de détection par défaut. La forme seule ne permet pas d’identifier la tête exportée. Une exportation de détection COCO brute par défaut a normalement la forme(1, 84, 8400)àimgsz=640.Oui. Le même argument
nmssélectionne la tête de détection disponible pour la détection, la segmentation d’instances, la pose et OBB. Il ne remplace pas la reconstruction des masques, le décodage des points clés, le traitement des boîtes orientées, les probabilités de classification, les cartes de classes sémantiques ni le décodage de profondeur.