Link to this sectionUltralytics YOLO26'da Uçtan Uca Tespitin Anlaşılması#
Link to this sectionGiriş#
YOLO26 modeline YOLOv8 veya YOLO11 gibi önceki bir modelden geçiş yapıyorsan, fark edeceğin en büyük değişikliklerden biri Non-Maximum Suppression (NMS) işleminin kaldırılmasıdır. Geleneksel YOLO modelleri, nihai tespitlere indirgemek için ayrı bir NMS son işleme adımı gerektiren binlerce çakışan tahmin üretir. Bu durum gecikmeyi artırır, dışa aktarma grafiklerini karmaşıklaştırır ve farklı donanım platformlarında tutarsız bir şekilde çalışabilir.
YOLO26 farklı bir yaklaşım benimser. Nihai tespitleri doğrudan modelden çıktı olarak verir; harici filtreleme gerekmez. Bu, uçtan uca nesne tespiti olarak bilinir ve tüm YOLO26 modellerinde varsayılan olarak etkindir. Sonuç olarak daha basit bir dağıtım hattı, daha düşük gecikme süresi ve CPU'larda %43'e kadar daha hızlı çıkarım elde edersin.
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ı sana anlatır.
Bu mimari değişikliğin arkasındaki motivasyona daha derin bir bakış için Ultralytics blog yazısı: YOLO26 neden NMS'yi kaldırıyor ve bu dağıtımı nasıl değiştiriyor kısmına göz at.
- Ultralytics API veya CLI mi kullanıyorsun? Herhangi bir değişiklik yapmana gerek yok; sadece model adını
yolo26n.ptolarak değiştirmen yeterli. - Özel çıkarım kodu mu kullanıyorsun (ONNX Runtime, TensorRT, vb.)? Son işleme mantığını güncelle; tespit çıktısı artık
(N, 300, 6)boyutunda vexyxyformatında, NMS gerekmiyor. Diğer görevler fazladan veri (maske katsayıları, kilit noktalar veya açı) ekler. - Dışa aktarma mı yapıyorsun? Çoğu format uçtan uca çıktıyı yerel olarak destekler. Ancak bazı formatlar (NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX, Edge TPU ve QNN), desteklenmeyen operatör kısıtlamaları (örneğin
torch.topk) nedeniyle otomatik olarak geleneksel çıktıya geri döner. Hailo HEF iş akışları, ONNX'ten Hailo'ya özel betiklerle derlenir, bu nedenle modelin için tespit başlığını ve NMS yapılandırmasını doğrula.
Link to this sectionUçtan Uca Tespit Nasıl Çalışır?#
YOLO26, eğitim sırasında çift başlı bir mimari kullanır. Her iki başlık da aynı omurgayı ve boyun yapısını paylaşır, ancak çıktıları farklı yollarla üretir:
| Başlık | Amaç | Tespit Çıktısı | Son İşleme |
|---|---|---|---|
| One-to-One (varsayılan) | Uçtan uca çıkarım | (N, 300, 6) | Sadece güven eşiği |
| One-to-Many | Geleneksel YOLO çıktısı | (N, nc + 4, 8400) | NMS gerektirir |
Yukarıdaki şekiller tespit içindir. Diğer görevler, uçtan uca çıktıyı her tespit için ek verilerle genişletir:
| Görev | Uçtan Uca Çıktı | Ek Veri |
|---|---|---|
| Tespit | (N, 300, 6) | — |
| Örnek Segmentasyonu | (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ı |
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 one-to-many başlığını da kaldırarak model boyutunu ve FLOP değerlerini azaltır. Çift başlı mimari hakkında daha fazla bilgi için YOLO26 model sayfasına bak.
Link to this sectionKodumu Değiştirmem Gerekli mi?#
Link to this sectionUltralytics Python API veya CLI Kullanımı#
Değişiklik gerekmez. Standart Ultralytics Python API veya CLI kullanıyorsan her şey otomatik çalışır; tahmin, doğrulama ve dışa aktarma işlemlerinin tümü uçtan uca modelleri kutudan çıktığı gibi destekler.
from ultralytics import YOLO
# Load a YOLO26 model
model = YOLO("yolo26n.pt")
# Predict — no NMS step, no code changes
results = model.predict("image.jpg")Link to this sectionÖzel Çıkarım Kodu Kullanımı#
Evet, çıktı formatı farklıdır. Eğer 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 / 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 | Evet | Hayır |
| Son işleme | NMS + güven filtresi | Sadece güven filtresi |
Segmentasyon, poz ve OBB görevleri için YOLO26, her tespite göreve özel veriler ekler; yukarıdaki çıktı şekilleri tablosuna bak.
Burada N, yığın boyutu 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ılı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!Link to this sectionOne-to-Many Başlığına Geçiş#
Eğer 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 one-to-many başlığına geçebilirsin:
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)Link to this sectionDışa Aktarma Formatı Uyumluluğu#
Çoğu dışa aktarma formatı uçtan uca çıkarımı doğrudan destekler; bunlar arasında ONNX, TensorRT, CoreML, OpenVINO, TFLite, TF.js ve MNN bulunur.
Aşağıdaki formatlar uçtan uca desteğine sahip değildir ve otomatik olarak one-to-many başlığına geri döner: NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX, Edge TPU ve Qualcomm QNN.
Hailo HEF için derleme adımı, ONNX dışa aktarımından sonra model.export(format=...) dışında gerçekleşir. Tam tespit modelinle eşleşen Hailo DFC günlüklerini, .alls model betiğini ve NMS JSON dosyasını kullan; eğer bir uçtan uca YOLO26 grafiği Hailo araç zincirin tarafından desteklenmiyorsa, ONNX modelini end2end=False ile dışa aktar ve geleneksel tespit başlığını derle.
TensorRT uçtan uca desteğe sahiptir, ancak TensorRT ≤10.3.0 sürümünde int8=True ile dışa aktarma yaparken bu özellik otomatik olarak devre dışı bırakılır.
Link to this sectionDoğruluk ve Hız Ödünleşimleri#
Uçtan uca tespit, doğruluk üzerinde minimum etkiyle önemli dağıtım avantajları sağlar:
| Metrik | Uçtan Uca (varsayılan) | One-to-Many + NMS (end2end=False) |
|---|---|---|
| CPU Çıkarım Hızı | %43'e kadar daha hızlı | Temel değer |
| mAP Etkisi | ~0.5 mAP daha düşük | YOLO11 ile aynı veya daha yüksek |
| Son İşleme | Sadece güven filtresi | Tam NMS hattı |
| Dağıtım Karmaşıklığı | Minimal | NMS 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. Eğer maksimum doğruluk birincil önceliğinse, her zaman end2end=False kullanarak one-to-many başlığına geri dönebilirsin.
Tüm model boyutları (n, s, m, l, x) genelindeki detaylı kıyaslamalar için YOLO26 performans metriklerine bak.
Link to this sectionYOLOv8 veya YOLO11'den Geçiş#
Mevcut bir projeyi YOLO26'ya yükseltiyorsan, sorunsuz bir geçiş sağlamak için işte hızlı bir kontrol listesi:
- 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şleme kodu: Yeni çıktı şekillerini -tespit için
(N, 300, 6)artı segmentasyon, poz ve OBB için göreve özel verileri- işleyecek şekilde güncelle. Ayrıca kutu formatınınxywhyerinexyxyolduğunu 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 destek için TensorRT sürümünün >10.3.0 olduğundan emin ol.
- FP16 dışa aktarmalar: Tüm çıktıların FP16 olmasını istiyorsan,
end2end=Falseile dışa aktar — output0'ın neden FP32 kaldığına göz at. - iOS / CoreML: End-to-end is fully supported. If you need Xcode Preview support, use
end2end=Falsewithnms=True - Uç cihazlar (NCNN, RKNN): Bu formatlar otomatik olarak bire çok (one-to-many) moduna döner, bu yüzden cihaz üzerindeki işlem hattına NMS ekle.
Link to this sectionSSS#
Link to this sectionend2end=True ve nms=True seçeneklerini 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.
Ancak, end2end=False ve nms=True kombinasyonu geçerli bir yapılandırmadır; geleneksel NMS'yi dışa aktarma grafiğine işler. Bu, CoreML dışa aktarımları için yararlı olabilir çünkü Xcode'daki Önizleme işlevini doğrudan algılama modeliyle kullanmanı sağlar.
Link to this sectionUç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 verebileceğ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 scenesVarsayı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 adede kadar temiz algılama üretecek şekilde optimize edilmiştir, bu nedenle bu sınırın üzerindeki algılamalar daha düşük kaliteli 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.
Link to this sectionDışa aktardığım ONNX modelim (1, 300, 6) çıktısını veriyor — bu doğru mu?#
Evet, bu algılama için beklenen uçtan uca çıktı formatıdır: 1 batch size, 300'e kadar algılama ve her biri 6 değerden oluşan [x1, y1, x2, y2, confidence, class_id]. Güven eşiğine göre filtrelemen yeterli, başka bir işlem gerekmez — NMS gerekmez.
Diğer görevler için çıktı şekli farklıdır:
| Görev | Çıktı Şekli | Açı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önme açısı |
Link to this sectionDışa aktardığım modelin uçtan uca olup olmadığını nasıl kontrol ederim?#
Bunu Ultralytics Python API'sini kullanarak veya doğrudan dışa aktarılan ONNX modeli meta verilerini inceleyerek kontrol edebilirsin:
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 enabledAlternatif 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 kısmına bak.
Link to this sectionUçtan uca destek örnek segmentasyon, poz ve OBB görevleri için var mı?#
Evet. YOLO26 algılama tarzı görev varyantları — algılama, örnek segmentasyon, poz tahmini ve yönlendirilmiş nesne algılama (OBB) — varsayılan olarak uçtan uca çıkarımı destekler. end2end=False geri dönüşü bu görevler genelinde de mevcuttur.
Her görev, temel algılama çıktısını göreve özel verilerle genişletir:
| Görev | Model | Uçtan Uca Çıktı |
|---|---|---|
| Algılama | yolo26n.pt | (N, 300, 6) |
| Örnek Segmentasyon | yolo26n-seg.pt | (N, 300, 38) + proto (N, 32, 160, 160) |
| Poz | yolo26n-pose.pt | (N, 300, 57) |
| OBB | yolo26n-obb.pt | (N, 300, 7) |