Ultralytics YOLO26'da Uçtan Uca detect'i Anlamak
Giriş
YOLOv8 veya YOLO11 gibi önceki bir modelden YOLO26'ya yükseltme yapıyorsanız, fark edeceğiniz en büyük değişikliklerden biri, Non-Maximum Suppression (NMS) kaldırılmasıdır. Geleneksel YOLO modelleri, nihai detect'lere filtrelemek için ayrı bir NMS son işlem 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 davranabilir.
YOLO26 farklı bir yaklaşım benimser. Modelden doğrudan nihai detect'ler çıkarır — harici filtreleme gerekmez. Bu, uçtan uca nesne algılama 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 edilir.
Bu kılavuz, nelerin değiştiğini, kodunuzu güncellemeniz gerekip gerekmediğini, hangi dışa aktarma biçimlerinin uçtan uca çıkarımı desteklediğini ve eski YOLO modellerinden sorunsuz bir şekilde nasıl geçiş yapacağınızı anlatır.
Bu mimari değişimin arkasındaki motivasyona daha derinlemesine bir bakış için, YOLO26'nın NMS'yi neden kaldırdığına dair Ultralytics blog yazısına bakın.
Hızlı Özet
- Ultralytics API'sini veya CLI'yı mı kullanıyorsunuz? Değişiklik gerekmez — sadece model adınızı şununla değiştirin:
yolo26n.pt. - Özel çıkarım kodu mu kullanıyorsunuz (ONNX Runtime, TensorRT vb.)? Son işleminizi güncelleyin — detect çıktısı artık
(N, 300, 6)içindexyxybiçiminde, NMS gerekmez. Diğer görevler ek veri (maske katsayıları, anahtar noktaları veya açı) ekler. - Dışa mı Aktarıyorsunuz? Çoğu biçim, uçtan uca çıktıyı doğal olarak destekler. Ancak, bazı biçimler (NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX ve Edge TPU) desteklenmeyen operatör kısıtlamaları nedeniyle (örn.,
torch.topk).
Uçtan Uca Algılama Nasıl Çalışır
YOLO26, eğitim sırasında çift başlı bir mimari kullanır. Her iki başlık da aynı backbone ve boynu paylaşır, ancak çıktıları farklı şekillerde üretir:
| Başlık | Amaç | Algılama Çıktısı | İşlem Sonrası |
|---|---|---|---|
| Bire Bir (varsayılan) | Uçtan uca çıkarım | (N, 300, 6) | Sadece 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ı algılama başına ek verilerle genişletir:
| Görev | Uçtan Uca Çıktı | Ek Veri |
|---|---|---|
| Algılama | (N, 300, 6) | — |
| Segmentasyon | (N, 300, 6 + nm) + proto (N, nm, H, W) | nm maske katsayıları (varsayılan 32) |
| Poz | (N, 300, 57) | 17 anahtar nokta × 3 (x, y, görünürlük) |
| OBB | (N, 300, 7) | Dönme açısı |
Eğitim sırasında, her iki başlık da eş zamanlı çalışır — bire çok başlık daha zengin bir öğrenme sinyali sağlarken, bire bir başlık temiz, çakışmayan tahminler üretmeyi öğrenir. Sırasında çıkarım ve export, yalnızca bire bir başlık varsayılan olarak aktiftir ve görüntü başına 300'e kadar algılama üretir, şu formatta: [x1, y1, x2, y2, confidence, class_id].
Çağırdığınızda model.fuse(), daha hızlı çıkarım için Conv + BatchNorm katmanlarını birleştirir ve uçtan uca modellerde, model boyutunu ve FLOPs'u azaltarak bire çok başlığı da kaldırır. Çift başlı mimari hakkında daha fazla bilgi için şuraya bakınız: YOLO26 model sayfası.
Kodumu Değiştirmem Gerekiyor mu?
Ultralytics Python API'si veya CLI Kullanarak
Değişiklik gerekmez. Standart Ultralytics Python API veya CLI kullanırsanız, her şey otomatik olarak çalışır — tahmin, doğrulama ve dışa aktarma hepsi uçtan uca modelleri kutudan çıktığı gibi destekler.
Ultralytics 'sında herhangi bir 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")
yolo predict model=yolo26n.pt source=image.jpg
Özel Çıkarım Kodu Kullanarak
Evet, çıktı formatı farklıdır. YOLOv8 veya YOLO11 için özel bir son işleme mantığı yazdıysanız (örneğin, ONNX Runtime veya TensorRT ile çıkarım yaparken), bunu yeni çıktı şeklini işleyecek şekilde güncellemeniz gerekecektir:
| 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 | Kutu koordinatları + çapa başına sınıf skorları | [x1, y1, x2, y2, conf, class_id] |
| NMS gerekli | Evet | Hayır |
| Son işleme | NMS + güven eşiği filtresi | Yalnızca güven eşiği filtresi |
segmentation, poz ve obb görevleri için YOLO26, her bir algılamaya göreve özgü veriler ekler — yukarıdaki çıktı şekilleri tablosuna bakın.
Burada N şudur yığın boyutu ve nc sınıf sayısıdır (örn. 80 için COCO).
Uçtan uca modellerle, son işleme çok daha basit hale gelir — örneğin, ONNX Runtime kullanıldığında:
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 Çoklu Başlığa Geçiş
Geleneksel YOLO çıktı formatına ihtiyacınız varsa (örneğin, mevcut NMS tabanlı son işleme kodunu yeniden kullanmak için), şunu ayarlayarak istediğiniz zaman tek-çoklu başlığa geçiş yapabilirsiniz: end2end=False:
Geleneksel NMS tabanlı çıktı için tek-çoklu 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)
yolo predict model=yolo26n.pt source=image.jpg end2end=False
yolo val model=yolo26n.pt data=coco.yaml end2end=False
yolo export model=yolo26n.pt format=onnx end2end=False
Dışa Aktarma Biçimi 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ı kutudan çıktığı haliyle destekler.
Aşağıdaki formatlar uçtan uca desteği sağlamaz ve otomatik olarak tek-çoklu 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ığınızda, Ultralytics otomatik olarak tek-çoklu başlığa geçer ve bir uyarı kaydeder — manuel müdahaleye gerek yoktur. Bu, tıpkı YOLOv8 veya YOLO11 ile olduğu gibi, bu formatlar için çıkarım hattınızda NMS'ye ihtiyacınız olacağı anlamına gelir.
TensorRT + INT8
TensorRT uçtan uca desteği vardır, ancak otomatik olarak devre dışı bırakılır ile dışa aktarılırken int8=True TensorRT ≤10.3.0 üzerinde.
Doğruluk ve Hız Dengelemeleri
Uçtan uca algılama, doğruluk üzerinde minimum etkiyle önemli dağıtım avantajları sağlar:
| Metrik | Uçtan Uca (varsayılan) | Birden Çoğa + NMS (end2end=False) |
|---|---|---|
| CPU Çıkarım Hızı | %43'e kadar daha hızlı | Temel Çizgi |
| mAP Etkisi | ~0.5 mAP daha düşük | YOLO11 ile eşleşir veya onu aşar |
| İşlem Sonrası | Yalnızca güven eşiği filtresi | Tam NMS hattı |
| Dağıtım Karmaşıklığı | Minimal | NMS uygulaması gerektirir |
Çoğu gerçek dünya uygulaması için, ~0.5'lik mAP fark önemsizdir, özellikle hız ve basitlik kazanımları göz önüne alındığında. Eğer maksimum doğruluk en büyük önceliğinizse, her zaman şunu kullanarak birden çoğa başlığa geri dönebilirsiniz end2end=False.
Tüm model boyutları (n, s, m, l, x) genelindeki ayrıntılı karşılaştırmalı testler için YOLO26 performans metriklerine bakın.
YOLOv8 veya YOLO11'den Geçiş
Mevcut bir projeyi YOLO26'ya yükseltiyorsanız, sorunsuz bir geçiş sağlamak için hızlı bir kontrol listesi aşağıdadır:
- Ultralytics API / CLI kullanıcıları: Değişiklik gerekmez — sadece model adını şuna güncelleyin:
yolo26n.pt(veyayolo26n-seg.pt,yolo26n-pose.pt,yolo26n-obb.pt) - Özel son işleme kodu: Yeni çıktı şekillerini işlemek için güncelleyin —
(N, 300, 6)algılama için, artı görev özel verileri için segmentasyon, poseve OBB. Ayrıca kutu formatının şuradan değiştiğini de unutmayın:xywhiçinxyxy - Dışa aktarma hatları: Hedef formatınız için yukarıdaki format uyumluluğu bölümünü kontrol edin
- TensorRT + INT8: Uçtan uca destek için TensorRT sürümünüzün >10.3.0 olduğundan emin olun
- FP16 dışa aktarımları: Tüm çıktıları FP16 olarak istiyorsanız, şunu kullanarak dışa aktarın:
end2end=False— bkz. neden output0'ın FP32 kaldığı - iOS / CoreML: Uçtan uca tam olarak desteklenmektedir. Xcode Önizleme desteğine ihtiyacınız varsa, şunu kullanın:
end2end=Falseilenms=True - Uç cihazlar (NCNN, RKNN): Bu formatlar bire çokluya otomatik geri döner, bu nedenle cihaz içi hattınıza NMS'yi dahil edin
SSS
end2end=True ve nms=True'yu birlikte kullanabilir miyim?
Hayır. Bu seçenekler birbirini dışlar. Eğer şunu ayarlarsanız: nms=True uçtan uca bir modelde sırasında export, otomatik olarak şuna zorlanacaktır: nms=False bir uyarı ile. Uçtan uca başlık zaten dahili olarak yinelenen filtrelemeyi halleder, bu nedenle harici NMS gereksizdir.
Ancak, end2end=False ile birleştirildiğinde nms=True geçerli bir yapılandırmadır — geleneksel NMS'yi dışa aktarma grafiğine dahil eder. Bu, şunlar için faydalı olabilir: CoreML dışa aktarımları için, çünkü Xcode'daki Önizleme işlevini detect modeliyle doğrudan kullanmanızı sağlar.
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 detect sayısını belirler. Bunu çıkarım veya dışa aktarma sırasında ayarlayabilirsiniz:
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 şununla eğitildiğini unutmayın: max_det=300. Bu değeri artırabilmenize rağmen, bire bir başlık eğitim sırasında 300'e kadar temiz detect üretmek üzere optimize edilmiştir, bu nedenle bu sınırın üzerindeki detect'ler daha düşük kalitede olabilir. Görüntü başına 300'den fazla detect'e ihtiyacınız varsa, daha yüksek bir max_det değeriyle yeniden eğitmeyi düşünün.
Dışa aktardığım ONNX modelim (1, 300, 6) çıktı veriyor — bu doğru mu?
Evet, beklenen uçtan uca detect için çıktı formatı şöyledir: yığın boyutu 1'den, 300'e kadar detect, her biri 6 değerle [x1, y1, x2, y2, confidence, class_id]. Sadece güven eşiğine göre filtreleyin ve işiniz bitti — 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ı |
Dışa aktardığım modelin uçtan uca olup olmadığını nasıl kontrol ederim?
Ultralytics Python API'sini kullanarak veya dışa aktarılmış ONNX model meta verilerini doğrudan inceleyerek kontrol edebilirsiniz:
Bir modelin uçtan uca olup olmadığını kontrol edin
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
import onnxruntime as ort
session = ort.InferenceSession("yolo26n.onnx")
metadata = session.get_modelmeta().custom_metadata_map
print(metadata.get("end2end")) # 'True' if end-to-end is enabled
Alternatif olarak, çıkış şeklini kontrol edin — uçtan uca detect modelleri çıktı verir (1, 300, 6), geleneksel modeller ise çıktı verir (1, nc + 4, 8400). Diğer görev şekilleri için şuraya bakın: çıkış şekilleri SSS.
Uçtan uca, segmentasyon, pose ve obb görevleri için destekleniyor mu?
Evet. Tüm YOLO26 görev varyantları — tespit, segmentasyon, poz tahminive yönelimli nesne algılama (OBB) — varsayılan olarak uçtan uca çıkarımı destekler. end2end=False geri dönüş tüm görevlerde de mevcuttur.
Her görev, temel detect çı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) |