YOLO Vision 2026:

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.

Hızlı Özet
  • Ultralytics API veya CLI mi kullanıyorsun? Herhangi bir değişiklik yapmana gerek yok; yalnızca model adını yolo26n.pt olarak 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 xyxy formatı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ıkAmaç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-ManyGeleneksel 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örevUç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.

Ultralytics API ile kod değişikliği gerekmez
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 / YOLO11YOLO26 (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?EvetHayır
İşlem sonrasıNMS + güven filtresiYalnı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 NMS

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

Geleneksel NMS tabanlı çıktı için one-to-many başlığını kullanma
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.

Uçtan uca desteklenmediğinde ne olur

When you export to one of these formats, Ultralytics automatically switches to the one-to-many head and logs a warning. This means you'll need NMS in your inference pipeline for these formats, just like with YOLOv8 or YOLO11.

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.

Quantization and runtime version can disable end-to-end

TensorRT and LiteRT support end-to-end, but the branch is auto-disabled on TensorRT older than 8.5.0, on TensorRT 10.3.0 with quantize=8 on JetPack 6, and on LiteRT with quantize=8 or quantize="w8a16". Each case logs a warning and exports the one-to-many head.

Accuracy and Speed Trade-offs#

Uçtan uca tespit, doğruluk üzerinde minimum etkiyle önemli dağıtım avantajları sağlar:

MetrikUçtan Uca (varsayılan)Bire Çok + NMS (end2end=False)
COCO mAPval0.6-0.8 lowerReferans
İşlem SonrasıYalnızca güven filtresiTam NMS hattı
Dağıtım KarmaşıklığıMinimumNMS 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 (veya yolo26n-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ın xywh konumundan xyxy konumuna 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=8 on JetPack 6, and LiteRT with quantize=8 or quantize="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=False ile 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=True ile end2end=False kullan.
  • 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=True ayarlarsan, bir uyarı ile otomatik olarak nms=False değerine zorlanır. Uçtan uca başlık, yinelenen filtrelemeyi zaten dahili olarak yönetir, bu nedenle harici NMS gereksizdir.

    Ancak, nms=True ile birleştirilen end2end=False geç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_det parametresi (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 scenes

    The value is baked into an exported graph as the head's top-k, so max_det=500 widens 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ı ŞekliAçı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 et
    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

    The two checks answer different questions: the ONNX metadata records the head that was exported, while predictor.model.end2end reports that the backend output is already post-processed and needs no external NMS. They disagree for a model exported with end2end=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=False yedek 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, and yolo26n-obb.pt output shapes are listed under How End-to-End Detection Works.

Yorumlar