Ultralytics YOLO26'da Uçtan Uca Tespitin Anlaşılması#
YOLO26 detection-style models — detection, segmentation, pose, and OBB — are NMS-free by default: they output final detections directly from the model, with no Non-Maximum Suppression (NMS) post-processing step. Earlier models like YOLOv8 and YOLO11 produce thousands of overlapping predictions that a separate NMS step has to filter down, which adds latency, complicates export graphs, and can behave inconsistently across hardware platforms.
This is known as end-to-end object detection, and it is enabled by default. The result is a simpler deployment pipeline and lower latency — YOLO26n runs up to 43% faster than YOLO11n on CPU ONNX inference (Intel Xeon CPU @ 2.00 GHz).
Bu kılavuz, nelerin değiştiği, kodunu güncellemen gerekip gerekmediği, hangi dışa aktarma formatlarının uçtan uca çıkarımı desteklediği ve eski YOLO modellerinden nasıl sorunsuz bir şekilde geçiş yapabileceğin konusunda sana rehberlik eder.
Bu mimari değişimin arkasındaki motivasyonu daha derinlemesine incelemek için YOLO26'nın neden NMS'yi kaldırdığına dair Ultralytics blog yazısına göz at.
- Ultralytics API veya CLI mi kullanıyorsun? Herhangi bir değişiklik yapmana gerek yok; yalnızca model adını
yolo26n.ptolarak değiştir. - Özel çıkarım kodu mu (ONNX Runtime, TensorRT vb.) kullanıyorsun? Son işlemini güncelle; tespit çıkışı artık NMS gerekmeden
xyxyformatında(N, 300, 6)'dır. Diğer görevler ek veriler (maske katsayıları, kilit noktalar veya açı) ekler. - Exporting? Most formats keep end-to-end output natively; a few fall back to traditional output, and quantization can disable it — see Export Format Compatibility.
Uçtan Uca Tespit Nasıl Çalışır#
YOLO26, eğitim sırasında bir ikili başlık mimarisi kullanır. Her iki başlık da aynı omurgayı ve boyun kısmını paylaşır ancak çıktıları farklı şekillerde üretir:
| Başlık | Amaç | Tespit Çıktısı | İşlem Sonrası |
|---|---|---|---|
| One-to-One (varsayılan) | Uçtan uca çıkarım | (N, 300, 6) | Yalnızca güven eşiği |
| One-to-Many | Geleneksel YOLO çıktısı | (N, nc + 4, 8400) | NMS gerektirir |
The shapes above are for detection, where N is the batch size, nc is the number of classes (e.g., 80 for COCO), and the 8400 anchor count is the value at imgsz=640. Other tasks extend the one-to-one output with additional data per detection:
| Görev | Uçtan Uca Çıktı | Ek Veri |
|---|---|---|
| Algılama | (N, 300, 6) | — |
| Örnek Bölütleme | (N, 300, 6 + nm) + proto (N, nm, H, W) | nm maske katsayıları (varsayılan 32) |
| Poz | (N, 300, 57) | 17 kilit nokta × 3 (x, y, görünürlük) |
| OBB | (N, 300, 7) | Dönüş açısı |
Eğitim sırasında her iki başlık aynı anda çalışır — bire çok başlık daha zengin bir öğrenme sinyali sağlarken, bire bir başlık temiz ve örtüşmeyen tahminler üretmeyi öğrenir. Çıkarım ve dışa aktarma sırasında, varsayılan olarak yalnızca bire bir başlık etkindir ve [x1, y1, x2, y2, confidence, class_id] formatında görüntü başına 300'e kadar tespit üretir.
model.fuse() çağrısı yaptığında, daha hızlı çıkarım için Conv + BatchNorm katmanlarını birleştirir ve uçtan uca modellerde ayrıca bire çok başlığı kaldırarak model boyutunu ve FLOP değerlerini azaltır. İkili başlık mimarisi hakkında daha fazla ayrıntı için YOLO26 model sayfasına bak.
Kodumu Değiştirmem Gerekiyor mu?#
Ultralytics Python API veya CLI Kullanımı#
Herhangi bir değişiklik gerekmez. Standart Ultralytics Python API veya CLI kullanıyorsan her şey otomatik olarak çalışır — tahmin, doğrulama ve dışa aktarma işlemleri uçtan uca modelleri doğrudan kutudan çıktığı gibi işler.
from ultralytics import YOLO
# Load a YOLO26 model
model = YOLO("yolo26n.pt")
# Predict — no NMS step, no code changes
results = model.predict("image.jpg")Özel Çıkarım Kodu Kullanımı#
Evet, çıktı formatı farklıdır. YOLOv8 veya YOLO11 için özel son işlem mantığı yazdıysan (ONNX Runtime veya TensorRT ile çıkarım çalıştırırken olduğu gibi), yeni çıktı şeklini işlemek için bunu güncellemen gerekecektir:
| YOLOv8 / YOLO11 | YOLO26 (uçtan uca) | |
|---|---|---|
| Tespit çıktısı | (N, nc + 4, 8400) | (N, 300, 6) |
| Kutu formatı | xywh (merkez x, merkez y, genişlik, yükseklik) | xyxy (sol üst x, sol üst y, sağ alt x, sağ alt y) |
| Düzen | Çapa başına kutu koordinatları + sınıf skorları | [x1, y1, x2, y2, conf, class_id] |
| NMS gerekli mi? | Evet | Hayır |
| İşlem sonrası | NMS + güven filtresi | Yalnızca güven filtresi |
Segmentasyon, poz ve OBB görevleri için YOLO26, her tespite göreve özel veriler ekler — çıktı şekilleri tablosuna bak.
Uçtan uca modellerle son işlem çok daha basitleşir — örneğin ONNX Runtime kullanırken:
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 NMSOne-to-Many Başlığına Geçiş#
Geleneksel YOLO çıktı formatına ihtiyacın varsa (örneğin mevcut NMS tabanlı son işlem kodunu yeniden kullanmak için), end2end=False ayarını yaparak uygun olduğunda bire çok başlığa geçiş yapabilirsin:
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)Dışa Aktarma Formatı Uyumluluğu#
Çoğu dışa aktarma formatı, ONNX, TensorRT, CoreML, OpenVINO, LiteRT ve MNN dahil olmak üzere uçtan uca çıkarımı doğrudan destekler.
Aşağıdaki formatlar uçtan uca desteğe sahip değildir ve otomatik olarak bire çok başlığa geri döner: NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX, Edge TPU ve Qualcomm QNN.
For Hailo, the exporter picks the output path from the loaded head rather than from an argument, so end2end is rejected if passed: a default YOLO26 detection model keeps its NMS-free one-to-one outputs, while a checkpoint whose head is already end2end=False compiles the traditional path with HailoRT NMS.
Accuracy and Speed Trade-offs#
Uçtan uca tespit, doğruluk üzerinde minimum etkiyle önemli dağıtım avantajları sağlar:
| Metrik | Uçtan Uca (varsayılan) | Bire Çok + NMS (end2end=False) |
|---|---|---|
| COCO mAPval | 0.6-0.8 lower | Referans |
| İşlem Sonrası | Yalnızca güven filtresi | Tam NMS hattı |
| Dağıtım Karmaşıklığı | Minimum | NMS uygulaması gerektirir |
Across the five detection scales the one-to-one head costs 0.6-0.8 mAP on COCO — 40.9 to 40.1 for YOLO26n and 57.5 to 56.9 for YOLO26x — in exchange for dropping the NMS pass entirely. If maximum accuracy is your priority, fall back to the one-to-many head with end2end=False.
Tüm model boyutları (n, s, m, l, x) genelinde ayrıntılı kıyaslamalar için YOLO26 performans metriklerine göz at.
YOLOv8 veya YOLO11'den Geçiş#
If you're upgrading an existing project to YOLO26:
- Ultralytics API / CLI kullanıcıları: Değişiklik gerekmez — sadece model adını
yolo26n.pt(veyayolo26n-seg.pt,yolo26n-pose.pt,yolo26n-obb.pt) olarak güncelle - Özel son işlem kodu: Yeni çıktı şekillerini ele alacak şekilde güncelle — tespit için
(N, 300, 6), ayrıca segmentasyon, poz ve OBB için görev odaklı veriler. Ayrıca kutu formatınınxywhkonumundanxyxykonumuna değiştiğini unutma - Dışa aktarma hatları: Hedef formatın için format uyumluluğu bölümünü kontrol et
- TensorRT below 8.5.0: end-to-end is disabled at every precision — upgrade TensorRT to 8.5.0 or later to keep it
- Quantized exports: TensorRT 10.3.0 with
quantize=8on JetPack 6, and LiteRT withquantize=8orquantize="w8a16", auto-disable end-to-end — export at a higher precision to keep it - FP16 dışa aktarımları: Tüm çıktıların FP16 olmasını istiyorsan
end2end=Falseile dışa aktar — output0 neden FP32 kalır konusuna göz at - iOS / CoreML: Uçtan uca tam olarak desteklenir. Xcode Önizleme desteğine ihtiyacın varsa,
nms=Trueileend2end=Falsekullan. - Uç cihazlar (NCNN, RKNN): Bu formatlar otomatik olarak one-to-many'ye geri döner, bu yüzden cihaz içi hattına NMS'yi dahil et.
Sonuç#
Uçtan uca tespit, YOLO26'da varsayılandır ve Ultralytics Python API veya CLI kullanıyorsan hiçbir kod değişikliği gerektirmez. Yalnızca özel son işlem hatlarının yeni (N, 300, 6) çıktısını okumak ve NMS adımını kaldırmak için güncellenmesi gerekir — cihaz üstünde hâlâ NMS gerektiren, bire çok çıktıya geri dönen dışa aktarma formatları (NCNN ve RKNN gibi) hariç. Tüm model boyutlarındaki ayrıntılı hız ve doğruluk kıyaslamaları için YOLO26 model sayfasına, tüm dışa aktarma seçenekleri ve formatları için ise Dışa aktarma modu belgelerine bak.
SSS#
Hayır. Bu seçenekler birbirini dışlar. Dışa aktarma sırasında uçtan uca bir modelde
nms=Trueayarlarsan, bir uyarı ile otomatik olaraknms=Falsedeğerine zorlanır. Uçtan uca başlık, yinelenen filtrelemeyi zaten dahili olarak yönetir, bu nedenle harici NMS gereksizdir.Ancak,
nms=Trueile birleştirilenend2end=Falsegeçerli bir yapılandırmadır; geleneksel NMS'yi dışa aktarma grafiğine entegre eder. Bu, tespit modeliyle doğrudan Xcode içindeki Önizleme fonksiyonunu kullanmana izin verdiği için CoreML dışa aktarmaları için yararlı olabilir.max_detparametresi (varsayılan: 300) görüntü başına döndürülen maksimum tespit sayısını belirler. Bunu çıkarım veya dışa aktarma zamanında ayarlayabilirsin:model.predict("image.jpg", max_det=100) # fewer detections model.export(format="onnx", max_det=500) # more detections for dense scenesThe value is baked into an exported graph as the head's top-k, so
max_det=500widens the output tensor to up to(1, 500, 6), capped by the anchor count.Yes, that's the expected end-to-end output format for detection: batch size of 1, up to 300 detections, each with 6 values
[x1, y1, x2, y2, confidence, class_id]. Simply filter by confidence threshold — no NMS needed.Diğer görevler için çıktı şekli farklıdır:
Görev Çıktı Şekli Açıklama Tespit (1, 300, 6)[x1, y1, x2, y2, conf, class_id]Segmentasyon (1, 300, 38)+(1, 32, 160, 160)6 kutu değeri + 32 maske katsayısı ve ayrıca bir prototip maske tensörü Pose (1, 300, 57)6 kutu değeri + 17 anahtar nokta × 3 (x, y, görünürlük) OBB (1, 300, 7)6 kutu değeri + 1 dönüş açısı You can check from the Ultralytics Python API or from the exported ONNX model metadata:
Bir modelin uçtan uca olup olmadığını kontrol etfrom 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 enabledThe two checks answer different questions: the ONNX metadata records the head that was exported, while
predictor.model.end2endreports that the backend output is already post-processed and needs no external NMS. They disagree for a model exported withend2end=False, nms=True, which uses the one-to-many head but bakes NMS into the graph and also outputs(1, 300, 6)— so neither the flag nor the output shape alone identifies the head. For other task shapes, see the output shapes FAQ.Evet. YOLO26 tespit tarzı görev varyantları — tespit, örnek segmentasyonu, poz tahmini ve yönlendirilmiş nesne tespiti (OBB) — varsayılan olarak uçtan uca çıkarımı destekler.
end2end=Falseyedek seçeneği de bu görevler arasında kullanılabilir.Each task extends the base detection output with task-specific data;
yolo26n.pt,yolo26n-seg.pt,yolo26n-pose.pt, andyolo26n-obb.ptoutput shapes are listed under How End-to-End Detection Works.