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.
- Ultralytics API veya CLI mi kullanıyorsun? Değişiklik gerekmez; model adını
yolo26n.ptolarak 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, 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ık | Amaç | 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-Çok | Geleneksel 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örev | Uç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.
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 / YOLO11 | YOLO26 (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 gerekli | Evet | Hayır |
| Son işleme | NMS + güven filtresi | Yalnı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:
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.
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:
| Metrik | Uç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üşük | YOLO11 ile aynı veya daha iyi |
| Son İşleme | 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 ~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(veyayolo26n-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ı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: 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=Falseile 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=Falsewithnms=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 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'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ı Ş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ö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:
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 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örev | Model | Uçtan Uca Çıktı |
|---|---|---|
| Algılama | yolo26n.pt | (N, 300, 6) |
| 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) |