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) yönteminin kaldırılmasıdır. Geleneksel YOLO modelleri, nihai tespitlere kadar filtrelemek için ayrı bir NMS işlem sonrası adımı gerektiren binlerce örtüşen 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 durum uçtan uca nesne tespiti olarak bilinir 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ğ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ş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.
- Ultralytics API veya CLI mi kullanıyorsun? Herhangi bir değişiklik yapmana gerek yok; sadece model adını
yolo26n.ptile değiştirmen yeterli. - Using custom inference code (ONNX Runtime, TensorRT, etc.)? Update your post-processing — detection output is now
(N, 300, 6)inxyxyformat, 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, desteklenmeyen operatör kısıtlamaları (örneğin,
torch.topk) nedeniyle birkaç format (NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX, Edge TPU ve QNN) otomatik olarak geleneksel çıktıya geri döner. Hailo HEF iş akışları, ONNX'ten Hailo'ya özgü komut dosyalarıyla derlenir, bu yüzden 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ı ş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 |
Yukarıdaki şekiller tespit içindir. Diğer görevler, one-to-one çıktısını 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ı |
Eğitim sırasında her iki başlık da aynı anda çalışır; one-to-many başlığı daha zengin bir öğrenme sinyali sağlarken, one-to-one başlığı temiz ve örtüşmeyen tahminler üretmeyi öğrenir. Çıkarım ve dışa aktarma sırasında, varsayılan olarak yalnızca one-to-one başlığı aktiftir ve [x1, y1, x2, y2, confidence, class_id] formatında görüntü başına 300'e kadar tespit üretir.
model.fuse() komutunu çalıştırdığında, daha hızlı çıkarım için Conv + BatchNorm katmanlarını birleştirir ve uçtan uca modellerde, model boyutunu ve FLOP'ları azaltarak one-to-many başlığını da kaldırır. Çift başlı mimari hakkında daha fazla ayrıntı için YOLO26 model sayfasına bak.
Link to this sectionKodumu Değiştirmem Gerekiyor mu?#
Link to this sectionUltralytics Python API veya CLI Kullanımı#
Değişiklik yapmana gerek yok. 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.
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. YOLOv8 veya YOLO11 için özel işlem sonrası mantığı yazdıysan (örneğin, ONNX Runtime veya TensorRT ile çıkarım yaparken), bunu yeni çıktı şeklini işleyecek şekilde 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; yukarıdaki çıktı şekilleri tablosuna bak.
N yığın boyutu ve nc sınıf sayısıdır (örneğin, COCO için 80).
Uçtan uca modellerle işlem sonrası çok daha basit hale gelir; ö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!Link to this sectionOne-to-Many Başlığına Geçiş#
Geleneksel YOLO çıktı formatına ihtiyacın varsa (örneğin, mevcut NMS tabanlı işlem sonrası kodunu yeniden kullanmak için), end2end=False ayarını yaparak istediğin zaman one-to-many başlığına 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)Link to this sectionDış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 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 komut dosyasını ve NMS JSON'ını kullan; uçtan uca bir 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 JetPack 6 üzerindeki TensorRT 10.3.0'da int8=True ile dışa aktarırken 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ı | Referans |
| mAP Etkisi | ~0.5 mAP daha düşük | YOLO11 ile eşleşir veya onu geçer |
| İşlem Sonrası | Yalnızca güven filtresi | Tam NMS hattı |
| Dağıtım Karmaşıklığı | Minimum | NMS uygulaması gerektirir |
Çoğu gerçek dünya uygulaması için, özellikle hız ve basitlik kazanımları düşünüldüğünde, ~0.5 mAP farkı önemsizdir. Maksimum doğruluk en büyük önceliğin ise, end2end=False kullanarak her zaman one-to-many başlığına geri dönebilirsin.
Tüm model boyutları (n, s, m, l, x) genelindeki ayrıntılı 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 işlem sonrası kodu: Yeni çıktı şekillerini işleyecek şekilde güncelle; tespit için
(N, 300, 6), ayrıca segmentasyon, poz ve OBB için göreve özel veriler. Ayrıca kutu formatınınxywh'denxyxy'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: JetPack 6 üzerinde TensorRT 10.3.0,
int8=Trueile uçtan uca özelliği otomatik olarak devre dışı bırakır; uçtan uca özelliğini korumak için farklı bir TensorRT sürümü kullan. - FP16 dışa aktarmaları: Tüm çıktıların FP16 olması gerekiyorsa,
end2end=Falseile dışa aktar; neden output0'ın 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 one-to-many'ye geri döner, bu yüzden cihaz içi hattına NMS'yi dahil et.
Link to this sectionSSS#
Link to this sectionend2end=True ve nms=True özelliklerini 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.
Link to this sectionUçtan uca modellerde max_det parametresi neyi kontrol eder?#
The max_det parameter (default: 300) sets the maximum number of detections the one-to-one head can output per image. You can adjust it at inference or export time:
model.predict("image.jpg", max_det=100) # fewer detections, slightly faster
model.export(format="onnx", max_det=500) # more detections for dense scenesNote that the default YOLO26 checkpoints were trained with max_det=300. While you can increase this value, the one-to-one head was optimized during training to produce up to 300 clean detections, so detections beyond that limit may be lower quality. If you need more than 300 detections per image, consider retraining with a higher max_det value.
Link to this sectionDışa aktardığım ONNX modelim (1, 300, 6) çıktısı 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ı Ş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ı |
Link to this sectionDışa aktardığım modelin uçtan uca olup olmadığını nasıl kontrol edebilirim?#
Ultralytics Python API'sini kullanarak veya doğrudan dışa aktarılan ONNX model 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 enabledAlternatively, check the output shape — end-to-end detection models output (1, 300, 6), while traditional models output (1, nc + 4, 8400). For other task shapes, see the output shapes FAQ.
Link to this sectionÖrnek segmentasyonu, poz ve OBB görevleri için uçtan uca destekleniyor mu?#
Yes. YOLO26 detection-style task variants — detection, instance segmentation, pose estimation, and oriented object detection (OBB) — support end-to-end inference by default. The end2end=False fallback is available across these tasks as well.
Her görev, temel tespit çıktısını göreve özel verilerle genişletir:
| Görev | Model | Uçtan Uca Çıktı |
|---|---|---|
| Tespit | yolo26n.pt | (N, 300, 6) |
| Örnek Segmentasyonu | yolo26n-seg.pt | (N, 300, 38) + proto (N, 32, 160, 160) |
| Pose | yolo26n-pose.pt | (N, 300, 57) |
| OBB | yolo26n-obb.pt | (N, 300, 7) |