İçeriğe geç

Ultralytics 'da Uçtan Uca Algılama: Bir İnceleme

Giriş

Eğer YOLO26 'ya, YOLOv8 veya YOLO11gibi daha eski bir modelden YOLO26'ya yükseltme yapıyorsanız, fark edeceğiniz en büyük değişikliklerden biri Non-Maximum Suppression (NMS) özelliğinin kaldırılmasıdır. Geleneksel YOLO , nihai algılamalara ulaşmak için ayrı bir NMS adımına ihtiyaç duyan binlerce çakışan tahmin üretir. Bu durum gecikmeye neden olur, grafiklerin dışa aktarılmasını zorlaştırır ve farklı donanım platformlarında tutarsız davranışlara yol açabilir.

YOLO26 farklı bir yaklaşım benimsiyor. Nihai algılama sonuçlarını doğrudan modelden çıkarıyor; harici filtreleme gerekmiyor. Bu, uçtan uca nesne algılama olarak bilinir ve tüm YOLO26 modellerinde varsayılan olarak etkinleştirilmiştir. Sonuç olarak, daha basit bir dağıtım süreci, daha düşük gecikme süresi ve CPU'larda %43'e varan daha hızlı çıkarım elde ediliyor.

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 özelliğini desteklediğini ve eski YOLO sorunsuz bir şekilde nasıl geçiş yapabileceğinizi adım adım anlatmaktadır.

Bu mimari değişikliğin ardındaki nedenleri daha ayrıntılı olarak incelemek için, YOLO26'nın NMS neden kaldırdığına dairUltralytics yazısına göz atın.

Kısa Özet

  • Ultralytics mi yoksa CLI mi kullanıyorsunuz? Herhangi bir değişiklik yapmanıza gerek yok — sadece model adınızı şununla değiştirin: yolo26n.pt.
  • Özel çıkarım kodu (ONNX , TensorRT vb.) kullanıyor musunuz? Son işlemlerinizi güncelleyin — algılama çıktısı artık (N, 300, 6) içinde xyxy biçimi, NMS . Diğer görevler ek veriler ekler (maske katsayıları, anahtar noktalar veya açı).
  • İhracat mı yapıyorsunuz? Çoğu format, uçtan uca çıktıyı yerel olarak desteklemektedir. Ancak, bazı formatlar (NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX ve Edge TPU), desteklenmeyen operatör kısıtlamaları nedeniyle otomatik olarak geleneksel çıktıya geri dönmektedir (örneğin, 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ş da aynı backbone boynu paylaşır, ancak çıktıları farklı şekillerde üretir:

BaşlıkAmaçAlgılama Çıkışıİşlem Sonrası
Bire bir (varsayılan)Uçtan uca çıkarım(N, 300, 6)Yalnızca güven aralığı
Birden çokGeleneksel YOLO(N, nc + 4, 8400)NMS gereklidir

Yukarıdaki şekiller algılama amaçlıdır. Diğer görevler, her algılama için ek verilerle bire bir çıktıyı genişletir:

GörevUçtan uca çıktıEk Veriler
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önüş açısı

Eğitim sırasında her iki başlık da aynı anda çalışır — "birden çoğa" başlığı daha zengin bir öğrenme sinyali sağlarken, "bire bir" başlığı ise net ve birbiriyle çakışmayan tahminler üretmeyi öğrenir. Eğitim sırasında çıkarım ve export, sadece bire bir görüşme varsayılan olarak etkindir ve görüntü başına en fazla 300 algılama üretir; formatı [x1, y1, x2, y2, confidence, class_id].

Aradığınızda model.fuse(), daha hızlı çıkarım için Conv + BatchNorm katmanlarını katlar ve uçtan uca modellerde ayrıca tek-çoklu başlığı kaldırarak model boyutunu ve FLOP değerini azaltır. Çift başlıklı mimari hakkında daha fazla ayrıntı için bkz. YOLO26 model sayfası.

Kodumu değiştirmem gerekiyor mu?

Ultralytics Python veya CLI kullanma

Herhangi bir değişiklik gerekmiyor. Standart Ultralytics Python veya CLIkullanıyorsanız, her şey otomatik olarak çalışır — tahmin, doğrulama ve dışa aktarma işlemleri, kullanıma hazır uçtan uca modelleri yönetir.

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 Kodunu Kullanma

Evet, çıktı biçimi farklı. Eğer YOLOv8 veya YOLO11 için özel bir son işleme mantığı yazdıysanız (örneğin, ONNX veya TensorRTile çıkarım çalıştırırken), yeni çıktı biçimini işleyebilmesi için bunu güncellemeniz gerekecektir:

YOLOv8 YOLO11YOLO26 (uçtan uca)
Algılama çıkışı(N, nc + 4, 8400)(N, 300, 6)
Kutu biçimixywh (merkez x, merkez y, genişlik, yükseklik)xyxy (sol üst x, sol üst y, sağ alt x, sağ alt y)
DüzenKutu koordinatları + her bir bağlantı noktası için sınıf puanları[x1, y1, x2, y2, conf, class_id]
NMSEvetHayır
Son işlemNMS güven filtresiYalnızca güven filtresi

Segmentasyon, poz ve OBB görevleri için YOLO26, her bir algılamaya göreve özgü veriler ekler — yukarıdaki çıktı biçimleri tablosuna bakınız.

Nerede N şudur yığın boyutu ve nc sınıf sayısıdır (örneğin, 80 için COCO).

Uçtan uca modellerle, son işlem çok daha basit hale gelir — örneğin, ONNX 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!

Tek-Çoklu Başlığa Geçiş

Geleneksel YOLO biçimine ihtiyacınız varsa (örneğin, mevcut NMS son işleme kodunu yeniden kullanmak için), şu ayarı yaparak istediğiniz zaman tek-çoklu başlığa geçebilirsiniz: end2end=False:

Geleneksel NMS çıkış 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 Aktarım Biçimi Uyumluluğu

Çoğu dışa aktarım biçimi, aşağıdakiler dahil olmak üzere kullanıma hazır uçtan uca çıkarım özelliğini destekler: ONNX, TensorRT, CoreML, OpenVINO, TFLite, TF.js ve MNN.

Aşağıdaki biçimler uçtan uca özelliğini desteklemez ve otomatik olarak tek-çok başlığına geri döner: NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX ve Edge TPU.

Uçtan uca desteklenmediğinde ne olur?

Bu formatlardan birine aktarım NMS ığınızda, Ultralytics "birden çok" başlığına geçer ve bir uyarı kaydeder — manuel müdahaleye gerek yoktur. Bu, tıpkı YOLOv8 veya YOLO11'de olduğu gibi.

TensorRT INT8

TensorRT uçtan uca desteği sunar, ancak bu otomatik olarak devre dışı bırakılmış ... ile dışa aktarırken int8=True TensorRT .3.0 veya daha eski sürümlerde

Doğruluk ve Hız Arasındaki Denge

Uçtan uca algılama, doğruluk üzerinde asgari düzeyde etki yaratarak önemli dağıtım avantajları sağlar:

MetrikUçtan uca (varsayılan)Tek-Çoklu + NMSend2end=False)
CPU Hızı%43'e kadar daha hızlıTemel Çizgi
mAP~0,5 mAPYOLO11 ile aynı veya daha iyi
İşlem SonrasıYalnızca güven filtresiTam NMS
Dağıtım KarmaşıklığıMinimalNMS gerekir

Çoğu pratik uygulamada, ~0,5 mAP Aralarındaki fark önemsizdir, özellikle de hız ve kolaylık açısından sağladığı avantajlar göz önüne alındığında. Eğer en yüksek doğruluk sizin için en önemli öncelikse, her zaman şu komutu kullanarak tek-çoklu başlığa geri dönebilirsiniz: end2end=False.

Tüm model boyutları (n, s, m, l, x) için ayrıntılı karşılaştırma sonuçlarını görmek üzere YOLO26 performans ölçütlerine göz atın.

YOLOv8 YOLO11'den geçiş

Mevcut bir projenizi YOLO26'ya yükseltecekseniz, sorunsuz bir geçiş sağlamak için işte size kısa bir kontrol listesi:

  • Ultralytics / CLI : Herhangi bir değişiklik yapmanıza gerek yok — sadece model adını şu şekilde güncelleyin: yolo26n.pt (veya yolo26n-seg.pt, yolo26n-pose.pt, yolo26n-obb.pt)
  • Özel son işleme kodu: Yeni çıktı biçimlerini desteklemek için güncelleme — (N, 300, 6) tespit amacıyla, ayrıca [konu] için göreve özgü veriler segmentasyon, poseve OBB. Ayrıca kutu formatındaki değişikliğe de dikkat edin: xywh için xyxy
  • Dışa aktarma komut satırları: Hedef formatınız için yukarıdaki format uyumluluğu bölümüne bakın
  • TensorRT INT8: Uçtan uca destek için TensorRT 10.3.0'dan yüksek olduğunu kontrol edin
  • FP16 dışa aktarımları: Tüm çıktıların FP16 formatında olmasını istiyorsanız, şu komutla dışa aktarın: end2end=False — bkz. output0 neden FP32 olarak kalıyor?
  • iOS CoreML: Uçtan uca işleme 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 otomatik olarak "birden çok" moduna geçer; bu nedenle cihaz içi iş NMS dahil edin

SSS

end2end=True ve nms=True ayarlarını birlikte kullanabilir miyim?

Hayır. Bu seçenekler birbirini dışlar. Eğer nms=True süreç boyunca uçtan uca bir modelde export, otomatik olarak şu şekilde ayarlanacaktır: nms=False bir uyarı ile. Uçtan uca yönlendirici, yinelenen verilerin filtrelenmesini zaten dahili olarak gerçekleştiriyor; bu nedenle harici NMS .

Ancak, end2end=False ile birlikte nms=True geçerli bir yapılandırmadır — geleneksel NMS dışa aktarma NMS entegre eder. Bu, CoreML çünkü bu sayede Xcode'daki Önizleme işlevini doğrudan algılama modeliyle birlikte kullanabilmenizi sağlar.

Uçtan uca modellerde max_det parametresi neyi kontrol eder?

max_det parametre (varsayılan: 300), teke tek başlığın görüntü başına verebileceği maksimum algılama sayısını belirler. Bu değeri, çı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

YOLO26'nın varsayılan kontrol noktalarının şu verilerle eğitildiğini unutmayın: max_det=300. Bu değeri artırabilirsiniz, ancak bire bir başlık, eğitim sırasında 300 adede kadar net algılama sağlayacak şekilde optimize edilmiştir; bu nedenle, bu sınırın ötesindeki algılamaların kalitesi daha düşük olabilir. Görüntü başına 300'den fazla algılamaya ihtiyacınız varsa, daha yüksek bir değerle yeniden eğitim yapmayı düşünün max_det değer.

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

Evet, bu, algılama için beklenen uçtan uca çıktı biçimidir: yığın boyutu 1'den başlayıp 300'e kadar algılama, her biri 6 değer içeren [x1, y1, x2, y2, confidence, class_id]. Güven eşiğine göre filtreleme yapmanız yeterlidir — NMS yoktur.

Diğer görevlerde çıktı biçimi farklılık gösterir:

GörevÇıkış Ş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ı ve bir prototip maske tensor
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 edebilirim?

Bunu, Ultralytics Python kullanarak ya da dışa aktarılan ONNX 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, çıktı biçimini kontrol edin — uçtan uca algılama modellerinin çıktısı (1, 300, 6), geleneksel modeller ise (1, nc + 4, 8400). Diğer görev şekilleri için bkz. Çıktı biçimleri SSS.

Segmentasyon, poz ve OBB görevleri için uçtan uca destek sunuluyor 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 desteği sunar. end2end=False Yedek çözüm, tüm görevlerde de kullanılabilir.

Her görev, temel algılama çıktısını göreve özgü 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)


📅 0 gün önce oluşturuldu ✏️ 0 gün önce güncellendi
raimbekovm

Yorumlar