Ultralytics YOLO27 :

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 :

nmsPrédiction et validationExportation
None (par défaut)Tête one-to-many ; Ultralytics exécute la NMSSorties brutes one-to-many ; le consommateur exécute la NMS
TrueIdentique à NoneTête one-to-many avec NMS intégrée là où elle est prise en charge
FalseTête one-to-one sans suppression d'IoUSorties 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.

Choisir le chemin de sortie
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 outputs

Fonctionnement 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êteSortie de détection avant traitement externeTraitement
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âcheSortie de bout en boutDonné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=Nonenms=False
Sortie de détection(N, nc + 4, 8400)(N, 300, 6)
Format de boîtexywhxyxy
ScoresUn score par classe par candidatConfiance et ID de classe par détection
Traitement externeFiltrage de confiance et NMSFiltrage 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=True est 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=True pour 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=False sé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 w8a16 reviennent à 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=False ou nms=True avec 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 nms sé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.

Commentaires