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. La prédiction et la validation utilisent la tête one-to-many avec Non-Maximum Suppression (NMS) par défaut. Cela favorise la précision en utilisant 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 argument contrôle le choix parmi la prédiction, la validation, le suivi, l'exportation et l'évaluation comparative :
nms | Prédiction et validation | Exportation |
|---|---|---|
None (par défaut) | Tête one-to-many ; Ultralytics exécute la NMS | Sorties brutes one-to-many ; le consommateur exécute la NMS |
True | Identique à None | Tête one-to-many avec NMS intégrée là où elle est prise en charge |
False | Tête one-to-one sans suppression d'IoU | Sorties one-to-one sans NMS là où elles sont prises en charge |
None signifie qu'aucun post-traitement optionnel n'est intégré dans le modèle. Cela ne supprime pas le traitement normal 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êtes de détection sélectionnables conservent le comportement natif de leur tâche.
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) # opt into NMS-free inference
results = model.predict("image.jpg", nms=None) # switch back to one-to-many + NMS
model.export(format="onnx") # raw one-to-many outputs
model.export(format="onnx", nms=True) # embed NMS
model.export(format="onnx", nms=False) # NMS-free one-to-one outputsFonctionnement de la détection de bout en bout#
Les deux têtes partagent le squelette et le col et sont optimisées lors de l'entraînement. La tête one-to-many fournit plusieurs prédictions candidates par objet ; la NMS supprime les détections qui se chevauchent. La tête one-to-one apprend à produire une seule prédiction par objet. La sélection du chemin d'inférence ne désactive pas la supervision à double tête. La validation pendant l'entraînement utilise la tête d'inférence sélectionnée, de sorte que la sélection du point de contrôle et l'arrêt précoce suivent 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 de confiance et NMS |
| One-to-one | (N, 300, 6) | Filtrage de confiance ; pas de suppression d'IoU |
Ici, N est la taille du lot, nc est le nombre de classes, et 8400 est le nombre de candidats à imgsz=640. Les lignes de détection one-to-one contiennent [x1, y1, x2, y2, confidence, class_id]. D'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 ainsi que le repli des couches Conv et BatchNorm. Conserve ton point de contrôle d'entraînement d'origine si tu as besoin de changer de tête : la fusion ne peut pas reconstruire une branche qui a déjà été supprimée. Un modèle dont il ne reste que la tête one-to-one conserve ce chemin disponible.
Sorties exportées#
Les modèles de détection YOLOv8, YOLO11 et YOLO26 exportent par défaut des prédictions brutes one-to-many. Exporte YOLO26 avec nms=False pour des détections sans NMS.
nms=None | nms=False | |
|---|---|---|
| Sortie de détection | (N, nc + 4, 8400) | (N, 300, 6) |
| Format de boîte | xywh | xyxy |
| Scores | Un score par classe par candidat | Confiance et ID de classe par détection |
| Traitement externe | Filtrage de confiance et NMS | Filtrage de confiance |
nms=True produit également des détections traitées, mais utilise la tête one-to-many et intègre la NMS traditionnelle. C'est utile lorsque ton environnement d'exécution de déploiement doit recevoir des détections sans implémenter lui-même la suppression.
Le graphe d'un modèle exporté détermine ses sorties. Passer nms lors de son chargement ne reconstruit pas le graphe ; exporte le point de contrôle 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 la 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 reviennent au chemin one-to-many lorsque leurs opérateurs ne peuvent pas prendre en charge la sortie de bout en bout. Les avertissements de format expliquent ce repli.
- NMS intégrée :
nms=Trueest soumis aux restrictions de tâche, de précision et de forme dynamique de chaque format. Les formats sans prise en charge de la NMS intégrée exportent des sorties natives pour un traitement externe. - CoreML : La NMS intégrée 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 ont besoin du pipeline NMS de Xcode Preview. - MNN : La NMS intégrée 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 une NMS intégrée, sélectionnée automatiquement.
- Hailo : YOLO26 utilise des tenseurs bruts avec une NMS côté hôte par défaut ;
nms=Falsesélectionne son chemin one-to-one. La détection YOLOv8/YOLO11 utilise la 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
w8a16reviennent à des sorties one-to-many.
Consulte les guides d'intégration individuels pour connaître les exigences matérielles. Pour des tenseurs de sortie complets en FP16, utilise nms=None ; les indices de classe de bout en bout peuvent conserver les tenseurs de sortie en FP32 même lorsque le modèle est quantifié.
compromis entre précision et vitesse#
Les résultats COCO YOLO26 publiés montrent que la tête one-to-many améliore la 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 la passe NMS et privilégie la latence. Ces résultats motivent le choix par défaut ; ils ne garantissent pas un gain sur chaque jeu de données.
Les mesures de vitesse sans NMS publiées utilisent nms=False. Compare la précision et la latence en utilisant 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#
Il limite les détections renvoyées par la prédiction et la validation. Pour les exportations de type bout en bout et NMS intégré, la limite fait partie du graphe, donc réexporte pour la modifier ; la détection CoreML avec NMS intégré fait exception et ne possède aucune limite de détection. La sortie de bout en bout peut contenir moins de candidats lorsque l'image fournit moins d'ancres que
max_det.Oui, pour
nms=Falseounms=Trueavec la limite de détection par défaut. La forme seule n'identifie pas quelle tête a été 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 l'OBB. Il ne remplace pas la reconstruction de masque, le décodage des points clés, la gestion des boîtes rotatives, les probabilités de classification, les cartes de classes sémantiques ou le décodage de profondeur.