YOLO Vision 2026:

Ultralytics YOLO26'da Uçtan Uca Tespitin Anlaşılması#

YOLOv8 veya YOLO11 gibi daha önceki bir modelden YOLO26 sürümüne geçiyorsan fark edeceğin en büyük değişikliklerden biri Non-Maximum Suppression (NMS) özelliğinin kaldırılmasıdır. Geleneksel YOLO modelleri, son tespitleri filtrelemek için ayrı bir NMS son işlem adımı gerektiren binlerce örtüşen tahmin üretir. Bu durum gecikme ekler, dışa aktarma grafiklerini karmaşıklaştırır ve farklı donanım platformlarında tutarsız davranabilir.

YOLO26 farklı bir yaklaşım benimser. Harici filtreleme gerektirmeden, nihai tespitleri doğrudan modelden çıktısı olarak verir. Bu, uçtan uca nesne tespiti olarak bilinir ve tüm YOLO26 modellerinde varsayılan olarak etkinleştirilir. Sonuç olarak daha basit bir dağıtım hattı, daha düşük gecikme ve CPU'larda %43'e kadar daha hızlı çıkarım elde edilir.

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şimin arkasındaki motivasyonu daha derinlemesine incelemek için YOLO26'nın neden NMS'yi kaldırdığına dair Ultralytics blog yazısına göz at.

Hızlı Özet
  • Ultralytics API veya CLI mi kullanıyorsun? Herhangi bir değişiklik yapmana gerek yok; yalnızca model adını yolo26n.pt olarak değiştir.
  • Özel çıkarım kodu mu (ONNX Runtime, TensorRT vb.) kullanıyorsun? Son işlemini güncelle; tespit çıkışı artık NMS gerekmeden xyxy formatında (N, 300, 6)'dır. Diğer görevler ek veriler (maske katsayıları, kilit noktalar veya açı) ekler.
  • Dışa aktarıyor musun? Çoğu format uçtan uca çıktıyı yerel olarak destekler. Ancak birkaç format (NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX, Edge TPU ve QNN), desteklenmeyen operatör kısıtlamaları (ör. 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.

Uçtan Uca Tespit Nasıl Çalışır#

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

BaşlıkAmaç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-ManyGeleneksel YOLO çıktısı(N, nc + 4, 8400)NMS gerektirir

Yukarıdaki şekiller tespit içindir. Diğer görevler, bire bir çıktıyı tespit başına ek verilerle genişletir:

GörevUçtan Uca ÇıktıEk Veri
Algılama(N, 300, 6)
Örnek Bölütleme(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 aynı anda çalışır — bire çok başlık daha zengin bir öğrenme sinyali sağlarken, bire bir başlık temiz ve örtüşmeyen tahminler üretmeyi öğrenir. Çıkarım ve dışa aktarma sırasında, varsayılan olarak yalnızca bire bir başlık etkindir ve [x1, y1, x2, y2, confidence, class_id] formatında görüntü başına 300'e kadar tespit üretir.

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

Herhangi 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şlemleri uçtan uca modelleri doğrudan kutudan çıktığı gibi işler.

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şlem mantığı yazdıysan (ONNX Runtime veya TensorRT ile çıkarım çalıştırırken olduğu gibi), yeni çıktı şeklini işlemek için bunu güncellemen gerekecektir:

YOLOv8 / YOLO11YOLO26 (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?EvetHayır
İşlem sonrasıNMS + güven filtresiYalnızca güven filtresi

Segmentasyon, poz ve OBB görevleri için YOLO26, her tespite göreve özel veriler ekler — çıktı şekilleri tablosuna bak.

Burada N yığın boyutunu ve nc sınıf sayısını (COCO için 80 gibi) temsil eder.

Uçtan uca modellerle son işlem çok daha basitleşir — ö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!

One-to-Many Başlığına Geçiş#

Geleneksel YOLO çıktı formatına ihtiyacın varsa (örneğin mevcut NMS tabanlı son işlem kodunu yeniden kullanmak için), end2end=False ayarını yaparak uygun olduğunda bire çok başlığa geçiş yapabilirsin:

Geleneksel NMS tabanlı çıktı için one-to-many başlığını 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, LiteRT ve MNN dahil olmak üzere uçtan uca çıkarımı doğrudan destekler.

Aşağıdaki formatlar uçtan uca desteğe sahip değildir ve otomatik olarak bire çok başlığa geri döner: NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX, Edge TPU ve Qualcomm QNN.

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ı kaydeder — 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.

Hailo HEF için derleme adımı, ONNX dışa aktarımından sonra model.export(format=...) dışında gerçekleşir. Tam tespit modeline uyan Hailo DFC günlüklerini, .alls model betiğini ve NMS JSON'ı kullan; eğer 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 + INT8

TensorRT uçtan uca desteği sunar, ancak JetPack 6 üzerinde TensorRT 10.3.0 ile quantize=8 kullanılarak dışa aktarma yapılırken otomatik olarak devre dışı bırakılır.

Doğruluk ve Hız Ödünleşimleri#

Uçtan uca tespit, doğruluk üzerinde minimum etkiyle ö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ıReferans
mAP Etkisi~0.5 mAP daha düşükYOLO11 ile eşleşir veya onu geçer
İşlem SonrasıYalnı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çları göz önüne alındığında ihmal edilebilir düzeydedir. Maksimum doğruluk en büyük önceliğinse, end2end=False kullanarak her zaman bire çok başlığa dönebilirsin.

Tüm model boyutları (n, s, m, l, x) genelinde ayrıntılı kıyaslamalar için YOLO26 performans metriklerine göz at.

YOLOv8 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 (veya yolo26n-seg.pt, yolo26n-pose.pt, yolo26n-obb.pt) olarak güncelle
  • Özel son işlem kodu: Yeni çıktı şekillerini ele alacak şekilde güncelle — tespit için (N, 300, 6), ayrıca segmentasyon, poz ve OBB için görev odaklı veriler. Ayrıca kutu formatının xywh konumundan xyxy konumuna değiştiğini unutma
  • Dışa aktarma hatları: Hedef formatın için format uyumluluğu bölümünü kontrol et
  • TensorRT + INT8: JetPack 6 üzerinde TensorRT 10.3.0, quantize=8 ile uçtan uca desteği otomatik olarak devre dışı bırakır — uçtan uca desteği korumak için farklı bir TensorRT sürümü kullan
  • FP16 dışa aktarımları: Tüm çıktıların FP16 olmasını istiyorsan end2end=False ile dışa aktar — output0 neden FP32 kalır konusuna göz at
  • iOS / CoreML: Uçtan uca tam olarak desteklenir. Xcode Önizleme desteğine ihtiyacın varsa, nms=True ile end2end=False kullan.
  • 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.

Sonuç#

Uçtan uca tespit, YOLO26'da varsayılandır ve Ultralytics Python API veya CLI kullanıyorsan hiçbir kod değişikliği gerektirmez. Yalnızca özel son işlem hatlarının yeni (N, 300, 6) çıktısını okumak ve NMS adımını kaldırmak için güncellenmesi gerekir — cihaz üstünde hâlâ NMS gerektiren, bire çok çıktıya geri dönen dışa aktarma formatları (NCNN ve RKNN gibi) hariç. Tüm model boyutlarındaki ayrıntılı hız ve doğruluk kıyaslamaları için YOLO26 model sayfasına, tüm dışa aktarma seçenekleri ve formatları için ise Dışa aktarma modu belgelerine bak.

SSS#

end2end=True ve nms=True özelliklerini birlikte kullanabilir miyim?#

Hayır. Bu seçenekler birbirini dışlar. Dışa aktarma sırasında uçtan uca bir modelde nms=True ayarlarsan, bir uyarı ile otomatik olarak nms=False değerine zorlanır. Uçtan uca başlık, yinelenen filtrelemeyi zaten dahili olarak yönetir, bu nedenle harici NMS gereksizdir.

Ancak, nms=True ile birleştirilen end2end=False geçerli bir yapılandırmadır; geleneksel NMS'yi dışa aktarma grafiğine entegre eder. Bu, tespit modeliyle doğrudan Xcode içindeki Önizleme fonksiyonunu kullanmana izin verdiği için CoreML dışa aktarmaları için yararlı olabilir.

Uçtan uca modellerde max_det parametresi neyi kontrol eder?#

max_det parametresi (varsayılan: 300) görüntü başına döndürülen maksimum tespit sayısını belirler. Bunu çıkarım veya dışa aktarma zamanında ayarlayabilirsin:

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

Varsayılan YOLO26 denetim noktalarının max_det=300 ile eğitildiğini unutma. Bu değeri artırabilmene rağmen, bire bir başlık eğitim sırasında 300'e kadar temiz tespit üretecek şekilde optimize edilmiştir, bu nedenle bu sınırın ötesindeki tespitler daha düşük kalitede olabilir. Görüntü başına 300'den fazla tespite ihtiyacın varsa, daha yüksek bir max_det değeriyle yeniden eğitmeyi değerlendir.

Dışa aktardığım ONNX modelim (1, 300, 6) çıktısı veriyor — bu doğru mu?#

Evet, bu tespit için beklenen uçtan uca çıktı formatıdır: 1 yığın boyutu, her biri [x1, y1, x2, y2, confidence, class_id] 6 değere sahip 300'e kadar tespit. Güvenlik eşiğine göre filtrele ve işlem tamamdır — NMS gerekmez.

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

GörevÇıktı ŞekliAçı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ı

Dış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:

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 tespit 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.

Örnek segmentasyonu, poz ve OBB görevleri için uçtan uca destekleniyor mu?#

Evet. YOLO26 tespit tarzı görev varyantları — tespit, örnek segmentasyonu, poz tahmini ve yönlendirilmiş nesne tespiti (OBB) — varsayılan olarak uçtan uca çıkarımı destekler. end2end=False yedek seçeneği de bu görevler arasında kullanılabilir.

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

GörevModelUçtan Uca Çıktı
Tespityolo26n.pt(N, 300, 6)
Örnek Segmentasyonuyolo26n-seg.pt(N, 300, 38) + proto (N, 32, 160, 160)
Poseyolo26n-pose.pt(N, 300, 57)
OBByolo26n-obb.pt(N, 300, 7)

Yorumlar