Ultralytics YOLO26 ile Uçtan Uca Algılamayı Anlamak

Giriş

If you're upgrading to YOLO26 from an earlier model like YOLOv8 or YOLO11, one of the biggest changes you'll notice is the removal of Non-Maximum Suppression (NMS). Traditional YOLO models produce thousands of overlapping predictions that need a separate NMS post-processing step to filter down to final detections. This adds latency, complicates export graphs, and can behave inconsistently across different hardware platforms.

YOLO26 farklı bir yaklaşım benimser. Nihai algılamaları doğrudan modelden çıkarır; harici filtreleme gerekmez. Buna uçtan uca nesne algılama denir ve tüm YOLO26 modellerinde varsayılan olarak etkinleştirilmiştir. Sonuç, daha basit bir dağıtım hattı, daha düşük gecikme süresi ve CPU'larda %43'e kadar daha hızlı çıkarımdır.

Bu kılavuz, nelerin değiştiğini, kodunu güncellemen gerekip gerekmediğini, hangi dışa aktarma formatlarının uçtan uca çıkarımı desteklediğini ve eski YOLO modellerinden nasıl sorunsuz bir şekilde geçiş yapacağını adım adım açıklar.

Bu mimari değişikliğin arkasındaki motivasyona daha derin bir bakış için Ultralytics'in YOLO26'nın neden NMS'yi kaldırdığına ve bunun dağıtımı nasıl değiştirdiğine dair blog yazısına göz at.

Hızlı Özet
  • Ultralytics API veya CLI mi kullanıyorsun? Değişiklik gerekmez; model adını yolo26n.pt olarak değiştirmen yeterli.
  • Using custom inference code (ONNX Runtime, TensorRT, etc.)? Update your post-processing — detection output is now (N, 300, 6) in xyxy format, no NMS required. Other tasks append extra data (mask coefficients, keypoints, or angle).
  • Dışa aktarma mı yapıyorsun? Çoğu format uçtan uca çıktıyı yerel olarak destekler. Ancak, birkaç format (NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX ve Edge TPU), desteklenmeyen operatör kısıtlamaları (örneğin torch.topk) nedeniyle otomatik olarak geleneksel çıktıya geri döner.

Uçtan Uca Algılama Nasıl Çalışır

YOLO26, eğitim sırasında ikili başlık mimarisi kullanır. Her iki başlık aynı omurgayı ve boyun kısmını paylaşır, ancak çıktıları farklı yollarla üretir:

BaşlıkAmaçAlgılama ÇıktısıSon İşleme
Bire-Bir (varsayılan)Uçtan uca çıkarım(N, 300, 6)Yalnızca güven eşiği
Bire-ÇokGeleneksel YOLO çıktısı(N, nc + 4, 8400)NMS gerektirir

Yukarıdaki şekiller algılama içindir. Diğer görevler, bire-bir çıktıyı her algılama için ek verilerle genişletir:

GörevUçtan Uca ÇıktıEk Veri
Tespit (Detection)(N, 300, 6)
Bölümleme(N, 300, 6 + nm) + proto (N, nm, H, W)nm maske katsayıları (varsayılan 32)
Duruş(N, 300, 57)17 kilit nokta × 3 (x, y, görünürlük)
OBB(N, 300, 7)Dönüş açısı

During training, both heads run simultaneously — the one-to-many head provides a richer learning signal, while the one-to-one head learns to produce clean, non-overlapping predictions. During inference and export, only the one-to-one head is active by default, producing up to 300 detections per image in the format [x1, y1, x2, y2, confidence, class_id].

model.fuse() çağrısını yaptığında, daha hızlı çıkarım için Conv + BatchNorm katmanlarını birleştirir ve uçtan uca modellerde bire-çok başlığı da 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ı

Hiç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şlemlerinin tümü uçtan uca modelleri doğrudan destekler.

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şleme mantığı yazdıysan (örneğin ONNX Runtime veya TensorRT ile çıkarım yaparken), bunu yeni çıktı şeklini işleyecek şekilde güncellemen gerekir:

YOLOv8 / YOLO11YOLO26 (uçtan uca)
Algılama çı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 gerekliEvetHayır
Son işlemeNMS + güven filtresiYalnızca güven filtresi

Segmentasyon, poz ve OBB görevleri için YOLO26, her algılamaya göreve özel veriler ekler; yukarıdaki çıktı şekilleri tablosuna bak.

Burada N, toplu iş boyutudur ve nc sınıf sayısıdır (örneğin COCO için 80).

Uçtan uca modellerle son işleme çok daha basittir; ö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] > conf_threshold]  # confidence filter — that's it!

Bire-Çok Başlığa Geçiş

Geleneksel YOLO çıktı formatına ihtiyacın varsa (örneğin mevcut NMS tabanlı son işleme kodunu yeniden kullanmak için), end2end=False ayarını yaparak istediğin zaman bire-çok başlığa geçebilirsin:

Geleneksel NMS tabanlı çıktı için bire-çok başlığı 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, TFLite, TF.js ve MNN dahil olmak üzere uçtan uca çıkarımı doğrudan destekler.

Aşağıdaki formatlar uçtan uca desteklemez ve otomatik olarak bire-çok başlığa geri döner: NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX ve Edge TPU.

Uçtan uca desteklenmediğinde ne olur

Bu formatlardan birine dışa aktardığında, Ultralytics otomatik olarak bire-çok başlığa geçer ve bir uyarı günlüğü oluşturur; manuel müdahale gerekmez. Bu, YOLOv8 veya YOLO11 ile olduğu gibi, bu formatlar için çıkarım hattında NMS'ye ihtiyacın olacağı anlamına gelir.

TensorRT + INT8

TensorRT uçtan uca destekler, ancak TensorRT ≤10.3.0 sürümünde int8=True ile dışa aktarırken bu özellik otomatik olarak devre dışı bırakılır.

Doğruluk ve Hız Dengesi

Uçtan uca algılama, doğruluk üzerinde minimum etki ile önemli dağıtım avantajları sağlar:

MetrikUçtan Uca (varsayılan)Bire-Çok + NMS (end2end=False)
CPU Çıkarım Hızı%43'e kadar daha hızlıTemel
mAP Etkisi~0.5 mAP daha düşükYOLO11 ile aynı veya daha iyi
Son İşlemeYalnızca güven filtresiTam NMS hattı
Dağıtım KarmaşıklığıMinimumNMS uygulaması gerektirir

Çoğu gerçek dünya uygulaması için ~0.5 mAP farkı, özellikle hız ve basitlik kazanımları göz önüne alındığında ihmal edilebilir düzeydedir. Maksimum doğruluk önceliğinse, her zaman end2end=False kullanarak bire-çok başlığa dönebilirsin.

Tüm model boyutları (n, s, m, l, x) için ayrıntılı karşılaştırmalı değerlendirmeler için YOLO26 performans metriklerine bak.

YOLOv8 veya YOLO11'den Geçiş

Mevcut bir projeyi YOLO26'ya yükseltiyorsan, sorunsuz bir geçiş için hızlı kontrol listesi:

  • 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şleme kodu: Yeni çıktı şekillerini (algılama için (N, 300, 6) artı segmentasyon, poz ve OBB için göreve özel veriler) işleyecek şekilde güncelle. Ayrıca kutu formatının xywh'den xyxy'ye değiştiğini unutma.
  • Dışa aktarma hatları: Hedef formatın için yukarıdaki format uyumluluğu bölümünü kontrol et.
  • TensorRT + INT8: Uçtan uca desteği için TensorRT sürümünün >10.3.0 olduğunu doğrula.
  • FP16 dışa aktarmaları: Tüm çıktıların FP16 olmasını istiyorsan, end2end=False ile dışa aktar; output0'ın neden FP32 kaldığına bak.
  • iOS / CoreML: End-to-end is fully supported. If you need Xcode Preview support, use end2end=False with nms=True
  • Uç cihazlar (NCNN, RKNN): Bu formatlar otomatik olarak bire-çok başlığa döner, bu nedenle cihaz içi hattına NMS ekle.

SSS

end2end=True ve nms=True ayarlarını birlikte kullanabilir miyim?

No. These options are mutually exclusive. If you set nms=True on an end-to-end model during export, it will be automatically forced to nms=False with a warning. The end-to-end head already handles duplicate filtering internally, so external NMS is unnecessary.

However, end2end=False combined with nms=True is a valid configuration — it bakes traditional NMS into the export graph. This can be useful for CoreML exports because it lets you use the Preview function in Xcode with the detection model directly.

Uçtan uca modellerde max_det parametresi neyi kontrol eder?

max_det parametresi (varsayılan: 300), bire-bir başlığın görüntü başına çıkarabileceği maksimum algılama sayısını belirler. Bunu çıkarım veya dışa aktarma sırasında ayarlayabilirsin:

model.predict("image.jpg", max_det=100)  # fewer detections, slightly faster
model.export(format="onnx", max_det=500)  # more detections for dense scenes

Varsayılan YOLO26 kontrol noktalarının max_det=300 ile eğitildiğini unutma. Bu değeri artırabilsen de, bire-bir başlık eğitim sırasında 300'e kadar temiz algılama üretecek şekilde optimize edildi, bu nedenle bu sınırın ötesindeki algılamalar daha düşük kalitede olabilir. Görüntü başına 300'den fazla algılamaya ihtiyacın varsa, daha yüksek bir max_det değeriyle yeniden eğitmeyi düşün.

Dışa aktarılan ONNX modelim (1, 300, 6) çıktısını veriyor, bu doğru mu?

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 and you're done — no NMS needed.

Diğer görevler için çıktı şekli farklıdır:

GörevÇıktı ŞekliAçıklama
Algılama(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ı, artı bir prototip maske tensörü
Poz(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öndürme açısı

Dışa aktardığım modelin uçtan uca (end-to-end) olup olmadığını nasıl kontrol ederim?

Bunu Ultralytics Python API kullanarak veya doğrudan dışa aktarılan ONNX modeli meta verilerini inceleyerek kontrol edebilirsin:

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

Alternatif olarak, çıktı şeklini kontrol et; uçtan uca algılama modelleri (1, 300, 6) çıktısı verirken, geleneksel modeller (1, nc + 4, 8400) çıktısı verir. Diğer görev şekilleri için çıktı şekilleri SSS bölümüne bak.

Uçtan uca desteği segmentasyon, poz ve OBB görevleri için mevcut mu?

Evet. Tüm YOLO26 görev varyantları; algılama, segmentasyon, poz tahmini ve yönlendirilmiş nesne algılama (OBB), varsayılan olarak uçtan uca çıkarımı destekler. end2end=False geri dönüş seçeneği de tüm görevlerde kullanılabilir.

Her görev, temel algılama çıktısını göreve özel verilerle genişletir:

GörevModelUçtan Uca Çıktı
Algılamayolo26n.pt(N, 300, 6)
Segmentasyonyolo26n-seg.pt(N, 300, 38) + proto (N, 32, 160, 160)
Pozyolo26n-pose.pt(N, 300, 57)
OBByolo26n-obb.pt(N, 300, 7)

Yorumlar