İçeriğe geç

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çinde xyxy biç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ıkAmaç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 ÇokGeleneksel 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örevUç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 / YOLO11YOLO26 (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üzenKutu koordinatları + çapa başına sınıf skorları[x1, y1, x2, y2, conf, class_id]
NMS gerekliEvetHayır
Son işlemeNMS + güven eşiği filtresiYalnı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:

MetrikUç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üşükYOLO11 ile eşleşir veya onu aşar
İşlem SonrasıYalnızca güven eşiği filtresiTam NMS hattı
Dağıtım KarmaşıklığıMinimalNMS 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 (veya yolo26n-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: xywh için xyxy
  • 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=False ile nms=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ı ŞekliAçı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örevModelUçtan Uca Çıktı
Algılamayolo26n.pt(N, 300, 6)
Segmentasyonyolo26n-seg.pt(N, 300, 38) + proto (N, 32, 160, 160)
Pozyolo26n-pose.pt(N, 300, 57)
OBByolo26n-obb.pt(N, 300, 7)


📅 12 gün önce oluşturuldu ✏️ 10 gün önce güncellendi
glenn-jocherraimbekovm

Yorumlar