Ultralytics YOLO'da NMS IoU eşiğini ayarlama
Ultralytics YOLO'da NMS IoU eşiğini ayarla: tahminde neden varsayılan değer artık 0.5, iou ile conf değerlerini ne zaman değiştirmeli ve YOLO26 ile NMS'yi ne zaman atlamalısın.
Jing Qiu12 dakikalık okuma
IoU eşiği, algılayıcının üst üste binen iki kutuyu ne zaman aynı nesne olarak değerlendireceğini belirler. Ultralytics YOLO'da maksimum olmayan bastırma (NMS), en yüksek güven değerine sahip kutuyu tutar ve aynı sınıftan olup bu kutuyla iou değerinden daha fazla örtüşen diğer tüm kutuları siler. Eşiği çok yüksek ayarlarsan tek bir nesne iki kutuyla gösterilir; çok düşük ayarlarsan yan yana duran iki nesneden biri kaybolur.
8 Kasım 2026'da yayımlanan Ultralytics 8.4.208 sürümünden itibaren tahmin ve izleme varsayılan olarak 0.7 yerine iou=0.5 değerini kullanırken doğrulama 0.7 değerini kullanmaya devam ediyor. Bu kılavuzda nelerin, neden değiştiğini; eşiğin conf ile nasıl etkileşime girdiğini; her iki değerin kendi kameran için nasıl ayarlanacağını ve YOLO26'nın uçtan uca başlığıyla NMS'nin ne zaman tamamen devre dışı bırakılacağını açıklıyoruz.
Ultralytics YOLO artık varsayılan olarak IoU 0.5 değerinde tahmin ve izleme yapıyor#
iou değerini belirtmediğinde ve NMS uygulandığında, tahmin modu ile izleme modu artık 0.5 değerini kullanıyor. Açıkça belirttiğin herhangi bir değer öncelikli olduğundan, iou değerini zaten ayarlayan işlem hatları eskisi gibi çalışır. Tahmin ayarları başvurusu, yeni varsayılanı conf=0.25 değerinin yanında listeliyor.
iou ayarlanmadığında şu iş akışlarında 0.5 değeri kullanılır:
- Yeniden kullanılan tahmin ediciler ve açıkça belirtilen
iou=Nonedâhil olmak üzere Python ve CLI ile tahmin ve izleme. - Tahmin edicinin değerini devralan nesne sayımı, kuyruk yönetimi ve TrackZone gibi Çözümler.
- NMS'nin gömülü olduğu yeni dışa aktarımlar (
nms=True). Daha önce dışa aktardığın bir model, dışa aktarma sırasındaki varsayılan değerini korur. - Ultralytics Platform'da, çıkarım belgeleri dağıtılmış uç noktalardaki IoU kaydırıcısını ve
ioualanını 0.5 değeriyle listeliyor. - Mobil paketler: Ultralytics YOLO iOS paketi 8.9.20 sürümünde varsayılan olarak 0.5 değerini kullanıyor; Flutter eklentisi de 0.7.2 sürümünde aynı değeri kullanıyor. Uygulama mağazalarındaki varsayılanlar, yüklenen sürüme bağlıdır.
İki ayar bilerek 0.7 değerinde kalıyor: yayımlanmış mAP değerlerinin değişmemesi için doğrulama ve ölçüm kapsamına alınmayan, maskeleri yoğun biçimde üst üste binen SAM, SAM 2, SAM 3 ve FastSAM tahmin edicileri.

Gerçek bir tahminin çalıştırıldığı Ultralytics Platform'daki depo güvenliği modelinin Predict sekmesi. IoU kaydırıcısı artık 0.5 değerinden başlıyor.
Eski 0.7 varsayılan değeri tahmine neden uygun değildi?#
Bu sürümden önce iou, tahmin ve doğrulama için ortak tek bir varsayılan değere sahipti. PR #27084 uyarınca, bu değer Aralık 2022'de ilgisiz bir veri yükleyici PR'ı kapsamında yapılan tek satırlık bir yapılandırma değişikliğiyle 0.6'dan 0.7'ye çıkarıldı; mobil uygulamalar da daha sonra yalnızca tutarlılık sağlamak amacıyla bu değeri benimsedi.
Bu iki modun görevleri farklıdır:
- Doğrulama, kutuların sıralanmış listesini 0.001 güven değerine kadar değerlendirir. Yinelenen bir kutu genellikle gerçek kutunun altında sıralanır ve çok az kayba yol açar; bastırılan gerçek bir nesne ise her eşikte geri çağırma oranını düşürür. Esnek bir eşik, örtüşen aday kutuları değerlendirme için korur.
- Tahmin,
conf=0.25eşiğinde kutulardan oluşan son bir küme döndürür. NMS'nin geçirdiği her yinelenen kutu; çıktında, sayımında veya uyarında görünen bir yanlış pozitiftir. Eşik 0.7 olduğunda, aynı sınıftan ve %70'e kadar örtüşen iki kutunun ikisi de kalır.
conf, tam da bu nedenle zaten ayrı varsayılan değerlere sahipti: tahmin için 0.25, doğrulama için 0.001. iou de artık aynı yaklaşımı izliyor.
Ölçüm sonuçları ne gösterdi?#
PR #27084, RTX PRO 6000 kullanılarak COCO val2017 üzerinde farklı NMS eşiklerinde alınan tespit F1 skorlarını bildiriyor. F1, kesinlik ve geri çağırmayı özetler; aşağıdaki değerler sınıf başına ortalama olarak yüzde cinsinden verilmiştir:
| Model | IoU 0.45 değerinde F1 (%) | IoU 0.5 | IoU 0.7 |
|---|---|---|---|
| YOLO11n | 56.2 | 56.2 | 55.3 |
| YOLO11x | 69.7 | 69.8 | 69.2 |
| YOLO26n | 56.8 | 56.8 | 56.2 |
| YOLO26x | 71.8 | 71.7 | 71.1 |
Her model 0.45 veya 0.5 değerinde, 0.7 değerine kıyasla daha yüksek skor alıyor; 0.5 değeri de tablodaki her modelin en iyi sonucuna eşit ya da en fazla 0.1 uzaklıkta. COCO val2017 sınıf başına ortalamasındaki farklar bir puanın altında; kendi kameranda farkın büyüklüğü, aynı sınıftan kutuların ne sıklıkta örtüştüğüne bağlı.
Daha düşük IoU eşiği yinelenen kutuları ve yakın komşuları nasıl etkiler?#
NMS, örtüşmeyi kesişimin birleşime oranı ile ölçer: iki kutunun ortak alanının, bu kutuların birleşik alanına oranı. Kutuları güven değerine göre sıralar, en iyisini tutar ve aynı sınıftan olup bu kutuyla IoU değeri eşiği aşan diğer tüm kutuları siler. Ardından işlem, sonraki kalan kutu için tekrarlanır.
Bu tek değerin iki yönlü etkisi vardır:
- Daha düşük
iou, daha fazla örtüşen kutuyu siler. Tek bir nesneye ait yinelenen kutular daha çabuk kaybolur; ancak tampon tampona duran arabalar, taşıma bandındaki paketler veya kuyruktaki insanlar gibi yoğun biçimde örtüşen iki gerçek nesne tek nesneye indirgenebilir. - Daha yüksek
iou, daha fazla örtüşen kutuyu tutar. Yakın komşular kalır, ancak tek bir nesneye ait neredeyse yinelenen kutular da kalır.
Academy nesne tespiti dersi, standart bus.jpg test görüntüsünde YOLO26n ile bu etkinin nasıl ortaya çıktığını gösteriyor:
iou | bus.jpg üzerindeki kutular | Etki |
|---|---|---|
| 0.3 | 5 | Katı: örtüşen kutular bastırılır |
| 0.5 | 5 | Varsayılan |
| 0.95 | 8 | Esnek: neredeyse yinelenen kutular kalır |
Bu görüntüde 0.5'ten 0.3'e inmek kutu sayısını değiştirmiyor; 0.95'e çıkmak ise üç kutunun daha geçmesine izin veriyor. Kendi görüntülerindeki etki farklı olacaktır; bu nedenle kendi karelerinde birkaç eşiği test et.
İlgili iki ayar daha aynı çıktıyı şekillendirir. agnostic_nms=True, sınıflar arasındaki örtüşen kutuları da bastırır; bu, bir nesne araba ve kamyon gibi iki etiket aldığında işe yarar. max_det varsayılan olarak görüntü başına tespit sayısını 300 ile sınırlar; bu nedenle çok yoğun sahnelerde bu değeri yükseltmen gerekebilir.
YOLO'da güven ile IoU eşiği: Her birini ne zaman değiştirmeli?#
conf ile iou farklı soruları yanıtlar. conf, bir kutunun tutulacak kadar güvenilir olup olmadığını; iou ise tutulan iki kutunun aslında tek bir nesne olup olmadığını sorar. Sorunun zayıf veya asılsız kutularsa önce conf değerini, sorun örtüşmeyse yalnızca iou değerini değiştir. YOLO26'daki güven skoru kalibre edilmiş bir olasılık değil, sıralama skorudur; bu yüzden her iki değeri de sezgilerine göre değil, doğrulama verilerine göre seç.
Hangi ayarı değiştireceğini seçmek için çıktındaki belirtiyi kullan:
- Aynı nesne iki kutuyla gösteriliyor.
ioudeğerini, örneğin 0.5'ten 0.4'e düşür. - Kalabalıkta iki komşudan biri kayboluyor.
ioudeğerini, örneğin eski varsayılan olan 0.7'ye yükselt. - Arka planda kutular görünüyor. Önce
confdeğerini yükselt;ioudeğerini değiştirmek yalnızca örtüşen kutuları etkiler. - Gerçek nesneler hiç tespit edilmiyor.
confdeğerini düşür; model hiç yanıt vermiyorsa yaygın sorunlar kılavuzuna bak. - Sayımları raporluyorsun. Sayım kamerasından alınan karelerde her iki değeri de tarayıp sayım hatasının en düşük olduğu ikiliyi seç.
Kamera geometrisi, sahne kadar önemlidir. Yüksek ve tepeden bir açı, insanları ve araçları birbirinden ayırma eğilimindedir; böylece kutuları daha az örtüşür ve daha düşük bir eşik kullanmak daha uygun olur. Kuyruk, şerit veya koridor boyunca yerleştirilmiş alçak ve eğik açılı bir kamera, nesneleri üst üste bindirir; farklı nesnelere ait kutular %50'den çok örtüşebilir. Bu durumda iou değerini yeniden 0.7'ye yaklaştırmak gerçek tespitleri koruyabilir.

Örnek amaçlıdır. Kuyruk hâlindeki nesnelere eğik açıdan bakıldığında farklı nesnelere ait kutular yoğun biçimde örtüşür; daha yüksek IoU'nun gerçek komşuları koruduğu durum budur.
Kendi kameranda IoU eşiğini ayarla#
Bir görüntüde doğru görünen eşik, canlı kamerada başarısız olabilir. Dağıtım kamerasından, kullanacağın çözünürlük ve açıda birkaç düzine kareyle ayar yap ve sonuçları bir kişinin gözle saydığı değerlerle karşılaştır.
Kod kullanmadan ilk denemeyi yapmak için bu karelerden birkaçını Ultralytics Platform'daki YOLO26n model sayfasının Predict sekmesine yükle ve yinelenen kutuları ve kaçırılan komşuları görmek için güven ve IoU kaydırıcılarını hareket ettir. Ardından savunabileceğin değerleri seçmek için aşağıdaki taramayı çalıştır.
- Kareleri topla. Gerçek kameradan, en yoğun ve en sakin anları kapsayan kareleri kaydet. Bunları zaten Ultralytics Platform üzerinde etiketliyorsan, bir veri kümesi sürümünü referans kümen olarak kullan.
- Elle say. Her karedeki hedef nesnelerin gerçek sayısını not al veya eğitim yapmayı planlıyorsan hepsini etiketle.
confveioudeğerlerini birlikte tara. Her karenin sayımını senin sayımınla karşılaştıran aşağıdaki betiği çalıştır.- Ortalama hatanın en düşük olduğu ikiliyi seç, ardından hâlâ başarısız olduğu kareleri açıp incele: yinelenen kutular varsa
ioudeğerini düşür; birleşmiş komşular varsa yükselt. Aynı karede bir yinelenen kutu ile bir kaçırılan nesne birbirini götürebileceğinden sayım doğru görünebilir; bu nedenle çizilmiş kutuları da kontrol et ve seçtiğin ikiliyi ayar yapmadığın birkaç karede doğrula. - Modelin çalıştığı her yerde, gömülü NMS içeren dışa aktarımlar dâhil, her iki değeri de açıkça ayarla; böylece gelecekteki bir varsayılan değişikliği sonuçlarını değiştirmez.
from pathlib import Path
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # or your trained weights
hand_counts = {"frame_001.jpg": 12, "frame_002.jpg": 7} # your count per frame
frames = [str(Path("path/to/camera_frames") / name) for name in hand_counts]
for conf in (0.25, 0.35, 0.5):
for iou in (0.3, 0.4, 0.5, 0.6, 0.7):
errors = []
print(f"conf={conf} iou={iou}")
for r in model.predict(frames, conf=conf, iou=iou, classes=[0], stream=True, verbose=False):
name = Path(r.path).name
predicted, expected = len(r.boxes), hand_counts[name]
errors.append(abs(predicted - expected))
print(f" {name}: predicted {predicted}, hand count {expected}")
print(f" mean count error {sum(errors) / len(errors):.2f}")Ortalama mutlak hata, bir karedeki fazla sayımın başka bir karedeki eksik sayımı telafi etmesini önler. classes=[0] argümanı sayımı tek bir sınıfla sınırlar (COCO'da person); kendi sınıf dizinini kullan. Ardından ayarlanan değerleri izleme ve dışa aktarmada kullan:
# # İzleme, ilişkilendirmeden önce algılayıcının NMS eşiğini uygular
results = model.track("path/to/video.mp4", conf=0.35, iou=0.6, persist=True)
# # Her iki ayarlanmış eşikle NMS'yi yeni bir dışa aktarıma göm
model.export(format="onnx", nms=True, conf=0.35, iou=0.6)İzlemede kararlı bir eşik iki açıdan önemlidir. NMS'den geçen yinelenen bir kutu, aynı nesne için ikinci bir izleme kimliği başlatabilir; bastırılan bir komşu ise o karede ilişkilendirmeden çıkabilir. Tespit ve OBB için varsayılan TrackTrack izleyici, daha esnek kendi geçişiyle bu adayların bazılarını kurtarabilir. ByteTrack ve BoT-SORT hakkındaki izleme dersimiz, iou değerinden ayrı olan izleyicinin kendi eşleştirme eşiklerini ele alıyor.
Modeli Ultralytics Platform'daki özel bir uç noktadan mı sunuyorsun? Her istekte ayarladığın conf ve iou değerlerini açıkça gönder.
Doğrulamada IoU neden 0.7 değerinde kalıyor?#
model.val() ile doğrulama yapıyorsan hiçbir şey değişmedi: doğrulayıcı iou=0.7 değerini doldurmaya devam ediyor. Doğrulama, etiketlerle eşleştirme için örtüşen aday kutuları kullanılabilir durumda tutan esnek bir eşikle, çok düşük güven değerindeki kutuların sıralanmış tam listesi üzerinden çalışır. 0.7 değerini korumak, daha önce yayımladığın mAP sonuçlarının ve model tablolarımızdakilerin yeni çalıştırmalarla karşılaştırılabilir kalmasını da sağlar.
İlgili bir doğrulama ayrıntısı değişti. Karışıklık matrisi artık tahminleri etiketlerle 0.45 yerine mAP50'de kullanılan aynı IoU eşiği olan 0.5 değerinde eşleştiriyor. Bu, NMS değil eşleştirme eşiğidir: hangi kutuların doğru sayılacağına karar verir, hangilerinin kalacağına değil. Performans metrikleri kılavuzu, her metriğin nasıl hesaplandığını açıklıyor.
Doğrulama ayarı, uygulamanın kullandığı az sayıdaki kutuyu değil, düşük güvenli binlerce kutu üzerinden sıralanmış bir metriği optimize eder. Üretimde 0.7 değerini denemek istiyorsan bu değeri yukarıdaki kamera taramasına ekle ve sayım hatasının karar vermesini sağla.
YOLO26'yı NMS olmadan ne zaman kullanmalı?#
Ultralytics YOLO26 aynı anda iki başlığı eğitir. Bire çok başlık, her nesne için birkaç aday önerir ve NMS'ye ihtiyaç duyar; varsayılan olarak tahmin ve doğrulamada kullanılan başlık da budur. Bire bir başlık ise nesne başına tek bir tahmin üretmeyi öğrenir, dolayısıyla IoU bastırmasına ihtiyaç duymaz. Bu başlığı kullanmak için nms=False değerini belirt; uçtan uca tespit kılavuzunda gösterildiği gibi:
results = model.predict("image.jpg", nms=False) # # NMS'siz bire bir başlık
model.export(format="onnx", nms=False) # # çıktılar (N, 300, 6): xyxy, güven, sınıfnms=False ile algılayıcı herhangi bir IoU bastırması uygulamaz; dolayısıyla iou değerinin etkileyebileceği bir şey yoktur. Çıktıyı yalnızca conf, classes ve max_det filtreler. agnostic_nms=True kullanıldığında her aday yalnızca en yüksek skorlu sınıfını tutar; farklı kutular yine IoU bastırmasına tabi olmaz. TrackTrack gibi bir izleyici, yinelenen izleme başlangıçlarını yine kendi başına bastırabilir.
Karşılığında az miktarda doğruluk kaybı yaşanır. 640 pikselde, tek model ve tek ölçek ayarlarıyla COCO val2017 üzerinde YOLO26n, NMS ile 40.9 mAP50-95; uçtan uca 40.1 skor alıyor. YOLO26x ise sırasıyla 57.5 ve 56.9 skor alıyor; bu değerler YOLO26 model belgelerinde yer alıyor. Bunun karşılığında desteklenen bir dışa aktarım son tespitleri üretir, böylece hedef cihazda bastırmayı uygulaman veya ayarlaman gerekmez.

Örnek amaçlıdır. Park etmiş arabaların tepeden görünümü; her birinin üzerinde ayrı bir kutu var.
NMS'siz başlığı şu durumlarda seç:
- NMS'yi uygulamanın zor veya yavaş olduğu bir uç çalışma ortamına dağıtım yapıyorsan. Her biçim bunu desteklemez: bazıları bire çok çıktılara geri döner veya NMS gerektirir; bu nedenle dışa aktarma uyarılarını oku ve sonuçları hedef çalışma ortamında karşılaştır. Dağıtım hakkında bilgi için YOLO26'nın NMS'siz başlığının dağıtımı nasıl değiştirdiğine bak.
- Sahnelerin kalabalıksa ve kamera karelerinde hem yinelenen kutuları kaldırıp hem de komşuları koruyan tek bir
ioudeğeri yoksa. - Model ile kod arasındaki hareketli parça sayısını azaltmak istiyorsan ve çalışma ortamına özgü NMS yapılandırması kullanmak istemiyorsan.
Dağıtım kolaylığından çok mAP'nin son kesirli kısmı önemliyse veya bire bir başlığı olmayan YOLO11 ya da YOLOv8 kullanıyorsan varsayılan NMS yolunu koru.
Hangi başlığı dağıtırsan dağıt, modeli ürüne eklemeden önce lisansını kontrol et. Ultralytics YOLO modelleri AGPL-3.0 ve Ultralytics Enterprise License kapsamında sunulur; AGPL-3.0 yükümlülüklerini karşılayamayan özel mülk dağıtımlar için Enterprise License gerekir.
IoU ayarını kimler değiştirmeli?#
Varsayılan değere güveniyorsan ve sonuçların 0.7 değerinde doğru görünüyorsa, yükseltme sonrasında bunları yeniden kontrol et: daha az yinelenen kutu ve kalabalık, eğik açılı sahnelerde ara sıra kaybolan bir komşu bekle. Nesneleri sayıyorsan, bilinen birkaç karede yükseltme öncesi ve sonrası sayımları karşılaştır.
iou değerini zaten açıkça belirtiyorsan senin için hiçbir şey değişmez. Değeri bilerek hiç seçmediysen yeni varsayılan, ölçümlere dayalı bir başlangıç noktasıdır; kendi karelerinde yapacağın kısa bir tarama bu değeri koruyup korumaman gerektiğini gösterir. YOLO26 üzerinde yeni uç işlem hatları kuran ekipler önce nms=False değerini hedef çalışma ortamlarında test etmelidir. Kendi kamerandan alınan karelerde eşikleri test etmek için Ultralytics Platform'daki YOLO26n model sayfasını aç ve Predict'i seç. Sahnelerin kendi verilerinle eğitilmiş bir model gerektiriyorsa modeli Ultralytics Platform'da eğitebilir ve eğittiğin modelin sayfasındaki Predict sekmesinde test edebilirsin. Her çıkarım argümanı tahmin ayarları başvurusunda listeleniyor.
Sık sorulan sorular
Maksimum olmayan bastırmanın aynı sınıftan iki kutuyu tek bir nesne olarak değerlendirip güven değeri daha düşük olan kutuyu sildiği örtüşme eşiğidir. IoU, iki kutunun ortak alanının birleşik alanlarına oranıdır ve 0 ile 1 arasında değişir. Aynı terim, mAP50 için 0.5 gibi, bir tahminin değerlendirme sırasında doğru sayılması için etiketle ne kadar örtüşmesi gerektiğini de belirtir.
Ultralytics 8.4.208 sürümünden itibaren tahmin ve izleme varsayılan olarak 0.5, doğrulama ise 0.7 değerini kullanır. SAM ailesinin tahmin edicileri 0.7 değerini korur. Ultralytics Platform çıkarımı da varsayılan olarak 0.5 değerini kullanır; mevcut uç nokta dağıtımı ise yeniden dağıtım yapana kadar dağıtılmış çalışma ortamını korur.
Bir nesne iki kutuyla gösterildiğinde eşiği düşür; kalabalıklar, trafik kuyrukları veya yoğun raflarda olduğu gibi örtüşen iki nesneden biri kaybolduğunda yükselt. Sorunun örtüşme yerine zayıf veya asılsız kutularsa
confdeğerini ayarla. Her iki değeri de dağıtım kamerandan alınan karelerle ayarla.conf, güven değeri bir eşikten düşük olan kutuları eler; tahminde varsayılan eşik 0.25'tir.iou, NMS sırasında kalan kutulardan hangilerinin yinelenen kutular olduğuna karar verir. Biri modelin ne kadar emin olması gerektiğini, diğeri ne kadar örtüşmenin aynı nesne sayılacağını belirler.Yalnızca varsayılan NMS yolunda.
nms=Falseile YOLO26, IoU bastırması olmadan nesne başına tek tahmin üretmeyi öğrenen bire bir başlığını kullanır; bu nedenleiouetkisizdir. 640 pikselde, tek model ve tek ölçek ayarlarıyla COCO val2017 üzerinde bunun maliyeti, model boyutlarına bağlı olarak 0.6 ile 0.8 mAP50-95 puanıdır; bu değerler YOLO26 belgelerinde belirtiliyor.
Yazan
Yorumlar
Soru sor, sonuçlarını paylaş veya başka birine yardım et.










