YOLO Vision 2026:

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.

Kurze Zusammenfassung
  • 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 Format xyxy, 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:

KopfZweckErkennungsausgabeNachbearbeitung
One-to-One (Standard)End-to-End-Inferenz(N, 300, 6)Nur Konfidenz-Schwellenwert
One-to-ManyHerkö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:

AufgabeEnd-to-End-AusgabeZusä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.

Keine Codeänderungen mit der Ultralytics API erforderlich
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 / YOLO11YOLO26 (End-to-End)
Erkennungsausgabe(N, nc + 4, 8400)(N, 300, 6)
Box-Formatxywh (Zentrum x, Zentrum y, Breite, Höhe)xyxy (oben links x, oben links y, unten rechts x, unten rechts y)
LayoutBox-Koordinaten + Klassen-Scores pro Anker[x1, y1, x2, y2, conf, class_id]
NMS erforderlichJaNein
NachbearbeitungNMS + Konfidenz-FilterNur 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 NMS

Umschalten 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:

Verwendung des One-to-Many-Kopfes für herkömmliche NMS-basierte Ausgabe
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.

Was passiert, wenn End-to-End nicht unterstützt wird

Wenn du in eines dieser Formate exportierst, wechselt Ultralytics automatisch zum Eins-zu-Viele-Kopf und protokolliert eine Warnung. Das bedeutet, dass du NMS in deiner Inferenzpipeline für diese Formate benötigst, genau wie bei YOLOv8 oder YOLO11.

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.

Quantisierung und Laufzeitversion können End-to-End deaktivieren

TensorRT und LiteRT unterstützen End-to-End, aber der Zweig wird auf TensorRT älter als 8.5.0, auf TensorRT 10.3.0 mit quantize=8 unter JetPack 6 und auf LiteRT mit quantize=8 oder quantize="w8a16" automatisch deaktiviert. Jeder Fall protokolliert eine Warnung und exportiert den Eins-zu-Viele-Kopf.

Kompromisse zwischen Genauigkeit und Geschwindigkeit#

End-to-End-Detektion bietet erhebliche Vorteile bei der Bereitstellung bei minimalen Auswirkungen auf die Genauigkeit:

MetrikEnd-to-End (Standard)1:viele + NMS (end2end=False)
COCO mAPval0,6-0,8 niedrigerBasislinie
NachbearbeitungNur Konfidenz-FilterVollständige NMS-Pipeline
BereitstellungskomplexitätMinimalErfordert 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 (oder yolo26n-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 von xywh zu xyxy
  • 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=8 auf JetPack 6 und LiteRT mit quantize=8 oder quantize="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=False mit nms=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=True bei einem End-to-End-Modell während des Exports einstellst, wird es mit einer Warnung automatisch auf nms=False gezwungen. Der End-to-End-Kopf verarbeitet die Duplikatfilterung bereits intern, sodass ein externer NMS nicht erforderlich ist.

    Die Kombination aus end2end=False und nms=True ist 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 scenes

    Der Wert ist als Top-K des Kopfes in einen exportierten Graphen eingebettet, sodass max_det=500 den 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:

    AufgabeAusgabeformBeschreibung
    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 ist
    from 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 enabled

    Die beiden Überprüfungen beantworten unterschiedliche Fragen: Die ONNX-Metadaten zeichnen den Kopf auf, der exportiert wurde, während predictor.model.end2end meldet, dass die Backend-Ausgabe bereits nachbearbeitet ist und kein externes NMS benötigt. Sie stimmen bei einem Modell nicht überein, das mit end2end=False, nms=True exportiert 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.pt und yolo26n-obb.pt sind unter How End-to-End Detection Works aufgeführt.

Kommentare