End-to-End-Erkennung in Ultralytics YOLO26 verstehen#
YOLO26 detection-style models — Erkennung, Segmentierung, Pose und OBB — sind standardmäßig NMS-frei: Sie geben endgültige Erkennungen direkt vom Modell aus, ohne einen Non-Maximum Suppression (NMS) Nachbearbeitungsschritt. Ältere Modelle wie YOLOv8 und YOLO11 erzeugen Tausende von überlappenden Vorhersagen, die ein separater NMS-Schritt herausfiltern muss, was die Latenz erhöht, Exportgraphen verkompliziert und sich auf verschiedenen Hardwareplattformen unterschiedlich verhalten kann.
Dies wird als End-to-End object detection bezeichnet und ist standardmäßig aktiviert. Das Ergebnis ist eine einfachere Bereitstellungspipeline und eine geringere Latenz — YOLO26n läuft auf Intel Xeon CPU @ 2.00 GHz bis zu 43 % schneller als YOLO11n bei der CPU-ONNX-Inferenz.
Dieser Leitfaden führt dich durch die Änderungen, erklärt, ob du deinen Code aktualisieren musst, welche Exportformate die End-to-End-Inferenz unterstützen und wie du problemlos von älteren YOLO-Modellen migrierst.
Einen tieferen Einblick in die Motivation hinter diesem architektonischen Wandel findest du im Blogbeitrag von Ultralytics darüber, warum YOLO26 NMS entfernt.
- Verwendest du die Ultralytics API oder CLI? Es sind keine Änderungen erforderlich – ändere einfach deinen Modellnamen in
yolo26n.pt. - Verwendest du benutzerdefinierten Inferenzcode (ONNX Runtime, TensorRT usw.)? Aktualisiere deine Nachbearbeitung – die Detektionsausgabe ist jetzt
(N, 300, 6)im Formatxyxy, ganz ohne NMS. Andere Aufgaben hängen zusätzliche Daten an (Maskenkoeffizienten, Schlüsselpunkte oder Winkel). - Exportierst du? Die meisten Formate behalten die End-to-End-Ausgabe nativ bei, einige wenige greifen auf die herkömmliche Ausgabe zurück, und die Quantifizierung kann sie deaktivieren — siehe Export Format Compatibility.
Wie End-to-End-Erkennung funktioniert#
YOLO26 verwendet während des Trainings eine Architektur mit zwei Köpfen. Beide Köpfe teilen sich dasselbe Backbone und denselben Neck, erzeugen die Ausgaben jedoch auf unterschiedliche Weise:
| Kopf | Zweck | Erkennungsausgabe | Nachbearbeitung |
|---|---|---|---|
| One-to-One (Standard) | End-to-End-Inferenz | (N, 300, 6) | Nur Konfidenz-Schwellenwert |
| One-to-Many | Herkömmliche YOLO-Ausgabe | (N, nc + 4, 8400) | Erfordert NMS |
Die obigen Formen gelten für die detection, wobei N die batch size ist, nc die Anzahl der Klassen (z. B. 80 für COCO) und die Ankeranzahl von 8400 der Wert bei imgsz=640 ist. Andere Aufgaben erweitern die Eins-zu-Eins-Ausgabe um zusätzliche Daten pro Erkennung:
| Aufgabe | End-to-End-Ausgabe | Zusätzliche Daten |
|---|---|---|
| Detektion | (N, 300, 6) | — |
| Instanzsegmentierung | (N, 300, 6 + nm) + Proto (N, nm, H, W) | nm Maskenkoeffizienten (Standard 32) |
| Pose | (N, 300, 57) | 17 Keypoints × 3 (x, y, Sichtbarkeit) |
| OBB | (N, 300, 7) | Rotationswinkel |
Während des Trainings laufen beide Köpfe gleichzeitig – der 1:viele-Kopf liefert ein reichhaltigeres Lernsignal, während der 1:1-Kopf lernt, saubere, sich nicht überschneidende Vorhersagen zu erzeugen. Während der Inferenz und des Exports ist standardmäßig nur der 1:1-Kopf aktiv, der bis zu 300 Detektionen pro Bild im Format [x1, y1, x2, y2, confidence, class_id] liefert.
Wenn du model.fuse() aufrufst, werden Conv- und BatchNorm-Schichten für eine schnellere Inferenz zusammengelegt, und bei End-to-End-Modellen wird außerdem der 1:viele-Kopf entfernt, wodurch Modellgröße und FLOPs reduziert werden. Weitere Einzelheiten zur Architektur mit zwei Köpfen findest du auf der YOLO26-Modellseite.
Muss ich meinen Code ändern?#
Verwendung der Ultralytics Python API oder CLI#
Keine Änderungen erforderlich. Wenn du die Standard-Ultralytics Python API oder CLI verwendest, funktioniert alles automatisch – Vorhersage, Validierung und Export verarbeiten End-to-End-Modelle von Haus aus.
from ultralytics import YOLO
# Load a YOLO26 model
model = YOLO("yolo26n.pt")
# Predict — no NMS step, no code changes
results = model.predict("image.jpg")Verwendung von benutzerdefiniertem Inferenzcode#
Ja, das Ausgabeformat ist anders. Wenn du benutzerdefinierte Nachbearbeitungslogik für YOLOv8 oder YOLO11 geschrieben hast (z. B. beim Ausführen der Inferenz mit ONNX Runtime oder TensorRT), musst du diese aktualisieren, um die neue Ausgabeform zu verarbeiten:
| YOLOv8 / YOLO11 | YOLO26 (End-to-End) | |
|---|---|---|
| Erkennungsausgabe | (N, nc + 4, 8400) | (N, 300, 6) |
| Box-Format | xywh (Zentrum x, Zentrum y, Breite, Höhe) | xyxy (oben links x, oben links y, unten rechts x, unten rechts y) |
| Layout | Box-Koordinaten + Klassen-Scores pro Anker | [x1, y1, x2, y2, conf, class_id] |
| NMS erforderlich | Ja | Nein |
| Nachbearbeitung | NMS + Konfidenz-Filter | Nur Konfidenz-Filter |
Bei Segmentierungs-, Posen- und OBB-Aufgaben hängt YOLO26 aufgabenspezifische Daten an jede Detektion an – siehe die Tabelle der Ausgabeformen.
Mit End-to-End-Modellen wird die Nachbearbeitung viel einfacher – zum Beispiel bei der Verwendung von ONNX Runtime:
import onnxruntime as ort
# Load and run the exported end-to-end model
session = ort.InferenceSession("yolo26n.onnx")
output = session.run(None, {session.get_inputs()[0].name: input_tensor})
# End-to-end output: (batch, 300, 6) → [x1, y1, x2, y2, confidence, class_id]
detections = output[0][0] # first image in batch
detections = detections[detections[:, 4] > 0.25] # confidence filter, no NMSUmschalten auf den One-to-Many-Kopf#
Wenn du das traditionelle YOLO-Ausgabeformat benötigst (z. B. um bestehenden NMS-basierten Nachbearbeitungscode wiederzuverwenden), kannst du zum 1:viele-Kopf wechseln, sofern dieser verfügbar ist, indem du end2end=False einstellst:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Prediction with NMS (traditional behavior)
results = model.predict("image.jpg", end2end=False)
# Validation with NMS
metrics = model.val(data="coco.yaml", end2end=False)
# Export without end-to-end
model.export(format="onnx", end2end=False)Kompatibilität der Exportformate#
Die meisten Exportformate unterstützen die End-to-End-Inferenz von Haus aus, darunter ONNX, TensorRT, CoreML, OpenVINO, LiteRT und MNN.
Die folgenden Formate unterstützen End-to-End nicht und greifen automatisch auf den 1:viele-Kopf zurück: NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX, Edge TPU und Qualcomm QNN.
Für Hailo wählt der Exporter den Ausgabepfad aus dem geladenen Kopf statt aus einem Argument, sodass end2end bei Übergabe abgelehnt wird: Ein standardmäßiges YOLO26-Erkennungsmodell behält seine NMS-freien Eins-zu-Eins-Ausgaben, während ein Checkpoint, dessen Kopf bereits end2end=False ist, den herkömmlichen Pfad mit HailoRT NMS kompiliert.
Kompromisse zwischen Genauigkeit und Geschwindigkeit#
End-to-End-Detektion bietet erhebliche Vorteile bei der Bereitstellung bei minimalen Auswirkungen auf die Genauigkeit:
| Metrik | End-to-End (Standard) | 1:viele + NMS (end2end=False) |
|---|---|---|
| COCO mAPval | 0,6-0,8 niedriger | Basislinie |
| Nachbearbeitung | Nur Konfidenz-Filter | Vollständige NMS-Pipeline |
| Bereitstellungskomplexität | Minimal | Erfordert NMS-Implementierung |
Über die fünf Erkennungsskalen hinweg kostet der Eins-zu-Eins-Kopf 0,6-0,8 mAP auf COCO — 40,9 bis 40,1 für YOLO26n und 57,5 bis 56,9 für YOLO26x — im Austausch für den vollständigen Wegfall des NMS-Durchlaufs. Wenn maximale Genauigkeit für dich Priorität hat, greife auf den Eins-zu-Viele-Kopf mit end2end=False zurück.
Siehe die YOLO26-Leistungsmetriken für detaillierte Benchmarks über alle Modellgrößen hinweg (n, s, m, l, x).
Migration von YOLOv8 oder YOLO11#
Wenn du ein bestehendes Projekt auf YOLO26 aktualisierst:
- Benutzer von Ultralytics API / CLI: Keine Änderungen erforderlich – aktualisiere einfach den Modellnamen auf
yolo26n.pt(oderyolo26n-seg.pt,yolo26n-pose.pt,yolo26n-obb.pt) - Benutzerdefinierter Nachbearbeitungscode: Aktualisiere ihn zur Verarbeitung der neuen Ausgabeformen –
(N, 300, 6)für die Detektion sowie aufgabenspezifische Daten für Segmentierung, Pose und OBB. Beachte auch die Änderung des Box-Formats vonxywhzuxyxy - Exportpipelines: Überprüfe den Abschnitt zur Formatkompatibilität für dein Zielformat
- TensorRT unter 8.5.0: End-to-End ist bei jeder Präzision deaktiviert — aktualisiere TensorRT auf 8.5.0 oder höher, um es beizubehalten
- Quantisierte Exporte: TensorRT 10.3.0 mit
quantize=8auf JetPack 6 und LiteRT mitquantize=8oderquantize="w8a16"deaktivieren End-to-End automatisch — exportiere mit einer höheren Präzision, um es beizubehalten - FP16-Exporte: Wenn du alle Ausgaben in FP16 benötigst, exportiere mit
end2end=False– siehe warum output0 FP32 bleibt - iOS / CoreML: End-to-End wird vollständig unterstützt. Wenn du Xcode-Vorschauunterstützung benötigst, verwende
end2end=Falsemitnms=True - Edge-Geräte (NCNN, RKNN): Diese Formate fallen automatisch auf One-to-Many zurück, also füge NMS in deine On-Device-Pipeline ein
Fazit#
Die End-to-End-Detektion ist in YOLO26 der Standard und erfordert keine Codeänderungen, wenn du die Ultralytics Python API oder CLI verwendest. Lediglich benutzerdefinierte Nachbearbeitungspipelines müssen aktualisiert werden, um die neue (N, 300, 6)-Ausgabe zu lesen und den NMS-Schritt wegzulassen – mit Ausnahme von Exportformaten, die auf die 1:viele-Ausgabe zurückgreifen (wie NCNN und RKNN), welche weiterhin NMS auf dem Gerät erfordern. Detaillierte Geschwindigkeits- und Genauigkeits-Benchmarks über alle Modellgrößen hinweg findest du auf der YOLO26-Modellseite und den vollständigen Satz an Exportoptionen und -formaten in der Dokumentation zum Export-Modus.
FAQ#
Nein. Diese Optionen schließen sich gegenseitig aus. Wenn du
nms=Truebei einem End-to-End-Modell während des Exports einstellst, wird es mit einer Warnung automatisch aufnms=Falsegezwungen. Der End-to-End-Kopf verarbeitet die Duplikatfilterung bereits intern, sodass ein externer NMS nicht erforderlich ist.Die Kombination aus
end2end=Falseundnms=Trueist jedoch eine gültige Konfiguration – sie integriert traditionelles NMS in den Exportgraphen. Dies kann für CoreML-Exporte nützlich sein, da du dadurch die Vorschaufunktion in Xcode direkt mit dem Detektionsmodell verwenden kannst.Der Parameter
max_det(Standard: 300) legt die maximale Anzahl der pro Bild zurückgegebenen Detektionen fest. Du kannst ihn zum Zeitpunkt der Inferenz oder des Exports anpassen:model.predict("image.jpg", max_det=100) # fewer detections model.export(format="onnx", max_det=500) # more detections for dense scenesDer Wert ist als Top-K des Kopfes in einen exportierten Graphen eingebettet, sodass
max_det=500den Ausgabetensor auf bis zu(1, 500, 6)erweitert, gedeckelt durch die Ankeranzahl.Ja, das ist das erwartete End-to-End-Ausgabeformat für die Erkennung: batch size von 1, bis zu 300 Erkennungen, jeweils mit 6 Werten
[x1, y1, x2, y2, confidence, class_id]. Einfach nach Konfidenz-Schwellenwert filtern — kein NMS erforderlich.Für andere Aufgaben unterscheidet sich die Ausgabeform:
Aufgabe Ausgabeform Beschreibung Detektion (1, 300, 6)[x1, y1, x2, y2, conf, class_id]Segmentierung (1, 300, 38)+(1, 32, 160, 160)6 Box-Werte + 32 Masken-Koeffizienten sowie ein Prototyp-Masken-Tensor Pose (1, 300, 57)6 Box-Werte + 17 Keypoints × 3 (x, y, Sichtbarkeit) OBB (1, 300, 7)6 Box-Werte + 1 Rotationswinkel Du kannst dies über die Ultralytics Python API oder über die Metadaten des exportierten ONNX-Modells überprüfen:
Prüfen, ob ein Modell End-to-End istfrom ultralytics import YOLO model = YOLO("yolo26n.onnx") model.predict(verbose=False) # run predict to setup predictor first print(model.predictor.model.end2end) # True if end-to-end is enabledDie beiden Überprüfungen beantworten unterschiedliche Fragen: Die ONNX-Metadaten zeichnen den Kopf auf, der exportiert wurde, während
predictor.model.end2endmeldet, dass die Backend-Ausgabe bereits nachbearbeitet ist und kein externes NMS benötigt. Sie stimmen bei einem Modell nicht überein, das mitend2end=False, nms=Trueexportiert wurde, welches den Eins-zu-Viele-Kopf verwendet, aber NMS in den Graphen einbettet und auch(1, 300, 6)ausgibt — weder das Flag noch die Ausgabeform allein identifizieren also den Kopf. Für andere Aufgabenformen siehe die output shapes FAQ.Ja. YOLO26-Aufgabenvarianten im Detektionsstil – Detektion, Instanzsegmentierung, Posenschätzung und ausgerichtete Objekterkennung (OBB) – unterstützen die End-to-End-Inferenz standardmäßig. Der
end2end=False-Fallback ist ebenfalls über diese Aufgaben hinweg verfügbar.Jede Aufgabe erweitert die Basis-Erkennungsausgabe um aufgabenspezifische Daten; die Ausgabeformen für
yolo26n.pt,yolo26n-seg.pt,yolo26n-pose.ptundyolo26n-obb.ptsind unter How End-to-End Detection Works aufgeführt.