İçeriğe geç

Teknik Yazılar

Veri Seti ve Model Eğitimi··7 dk okuma

mAP, Precision, Recall: Model Metriklerini Doğru Okumak

Terminalde mAP50 0.950 yazıyordu. Sahada model iki hedeften birini kaçırıyordu. İkisi de doğruydu — çünkü aynı şeyi ölçmüyorlardı.

Eğitim bitti, terminal son satırı yazdı: mAP50 0.950. Takımda kısa bir sevinç oldu. Ertesi hafta sahada aynı modelle uçtuk ve hedeflerden birini bir türlü tutturamadık.

Bu çelişki bizde bir refleks yarattı: metriğe güvenmemek. Ama doğru tepki bu değil. Metrik yalan söylemiyordu; biz ona yanlış soruyu soruyorduk. mAP50 0.950, “model sahada iyi çalışır” demiyor. “Bu doğrulama setindeki bu görüntülerde, IoU 0.50 eşiğiyle, tüm güven eşikleri boyunca ortalama precision şu” diyor. Aradaki fark, uçuş günü ile ofis günü arasındaki fark kadar büyük.

Bu yazıda tespit metriklerini formülleriyle birlikte açıyoruz: hangi sayı neyi ölçüyor, hangi durumda yanıltıyor, ve bizim kendi doğrulama setimizde nereye dikkat ettiğimiz.

Önce IoU: bir tespit ne zaman “doğru” sayılır?

Sınıflandırmada doğruluk basittir — etiket ya tutar ya tutmaz. Tespitte ise model bir de kutu çiziyor. Kutu doğru yerde mi? Bunu IoU (Intersection over Union, kesişim/birleşim oranı) ölçer:

IoU = Alan(tahmin ∩ gerçek) / Alan(tahmin ∪ gerçek)

IoU 0 ile 1 arasındadır. 1 kusursuz örtüşme, 0 hiç örtüşmeme demektir. Bir eşik seçersiniz — tipik olarak 0.50 — ve tahminleri üç gruba ayırırsınız:

Kısaltma Adı Ne demek
TP True Positive Doğru sınıf ve IoU ≥ eşik
FP False Positive Yanlış sınıf, ya da IoU < eşik, ya da hiç nesne yokken üretilen kutu
FN False Negative Gerçekte var olan ama modelin bulamadığı nesne

Dikkat: bu listede TN (True Negative) yok. Tespitte “doğru bulunmayan arka plan” sayılamaz, çünkü bir görüntüde sonsuz sayıda nesne olmayan kutu vardır. Bu yüzden accuracy (doğruluk) tespitte kullanılmaz — paydası tanımsızdır.

Precision ve recall: birbirini iten iki soru

TP/FP/FN üçlüsünden iki metrik türetilir. İkisi de tek cümlelik bir soruya karşılık gelir:

Precision = TP / (TP + FP)     → "Bulduklarımın kaçı gerçekten doğru?"
Recall    = TP / (TP + FN)     → "Var olanların kaçını bulabildim?"
F1        = 2 · (P · R) / (P + R)   → ikisinin harmonik ortalaması

Bu ikisi genelde birbirinin aleyhine çalışır. Modeli daha cesur yaparsanız (düşük güven eşiği) recall artar, precision düşer. Daha temkinli yaparsanız tersi olur.

Hangisinin ağır bastığı göreve göre değişir. Bizim SUAS görevimizde ayrım şöyle:

Hata tipi Sahadaki karşılığı Maliyeti
FP (yanlış tespit) Olmayan hedefe otonom bırakma Yüksek — puanı doğrudan kaybettirir
FN (kaçırılan hedef) Hedefin üzerinden bırakmadan geçme Orta — tur tekrarlanabilir

Yani bizim için precision, recall’dan biraz daha pahalı. Otonom bırakma kararı geri alınamıyor. Bu tercih, ileride anlatacağımız güven eşiği seçimini doğrudan belirledi.

PR eğrisi, AP ve mAP

Precision ve recall tek bir sayı değil; güven eşiğinin fonksiyonu. Eşiği 0.99’dan 0.01’e doğru kaydırdıkça bir eğri elde edersiniz: precision-recall (PR) eğrisi. Sol üst köşeye ne kadar yaklaşırsa o kadar iyi.

AP (Average Precision), bu eğrinin altında kalan alandır. COCO protokolü — Ultralytics’in de kullandığı yöntem — bunu 101 noktalı interpolasyonla hesaplar: recall ekseni {0, 0.01, …, 1.00} olarak örneklenir, her noktada o recall’a karşılık gelen maksimum precision alınır ve ortalaması integre edilir.

AP  = ∫₀¹ p(r) dr  ≈  (1/101) · Σ  p_interp(r),   r ∈ {0.00, 0.01, ..., 1.00}

mAP = (1/N) · Σ AP_i        (N = sınıf sayısı)

mAP (mean Average Precision) ise AP’nin sınıflar üzerinden ortalamasıdır. Bizim modelimizde iki sınıf var, dolayısıyla mAP iki AP’nin aritmetik ortalaması — bu detay önemli, birazdan döneceğiz.

Güven eşiğinin PR eğrisi üzerindeki etkisi

mAP50 ile mAP50-95 farkı

Yukarıdaki tanımda IoU eşiğini 0.50 aldık. Bu mAP50’dir. mAP50-95 ise IoU eşiğini 0.50’den 0.95’e 0.05 adımlarla kaydırıp (10 farklı eşik) elde edilen mAP değerlerinin ortalamasıdır:

mAP50-95 = (1/10) · Σ mAP@IoU_t,   IoU_t ∈ {0.50, 0.55, ..., 0.95}

Aradaki fark pratikte şudur:

Metrik Neyi ölçer Ne zaman bakılır
mAP50 “Nesneyi kabaca doğru yerde buldun mu?” Tespit-ve-git görevleri; nesne var/yok kararı yeterliyse
mAP50-95 “Kutunun sınırları ne kadar isabetli?” Hassas konumlandırma, ölçüm, takip veya bırakma noktası hesabı gerekiyorsa
mAP75 Orta yol; sıkı ama 0.95 kadar acımasız değil İki metrik arasındaki uçurumun nereden geldiğini ararken

mAP50 her zaman mAP50-95’ten yüksektir. İkisi arasındaki uçurum büyükse modeliniz nesneyi buluyor ama kutuyu tam oturtamıyor demektir. Küçük nesnelerde bu fark tipik olarak açılır: birkaç pikselik kayma, küçük bir kutuda IoU’yu oransal olarak çok daha fazla düşürür.

Bir uyarı: tek başına mAP50 raporlamak, sayıyı olduğundan iyi gösterir. Biz kendi aerial-only doğrulama setimizde mAP50 için 0.950 ölçtük ve bu sayıyı hep “aerial-only doğrulama setinde” kaydıyla yazıyoruz. Kaydı düşmezseniz, okuyan kişi bunu genel bir yetenek iddiası sanıyor.

Confusion matrix’i okumak

Ultralytics, doğrulama sonunda (nc+1) × (nc+1) boyutunda bir karışıklık matrisi çizer — nc sınıf sayısı, fazladan bir satır/sütun ise background (arka plan). Bu ekstra satır sınıflandırma problemlerindeki gibi bir sınıf değil; eşleşmeyen tahminleri ve kaçırılan gerçek nesneleri tutan bir tahliye kanalı.

Hücre Anlamı Ne yapmalı
Köşegen (sınıf i → sınıf i) Doğru tespitler
Sınıf i → sınıf j (köşegen dışı) Sınıf karıştırma Etiket kalitesini ve sınıflar arası görsel benzerliği kontrol et
background → sınıf i sütunu Arka planı nesne sandı (FP) Zor negatif örnek ekle, eşiği yükselt
sınıf i → background satırı Gerçek nesneyi kaçırdı (FN) Örnek sayısı, çözünürlük, tiling’e bak

Önemli bir ayrıntı: karışıklık matrisi, PR eğrisinin aksine tek bir güven eşiğinde çizilir — Ultralytics’te varsayılan 0.25 (2026 itibarıyla). Yani matris size “bu eşikte model ne yapıyor” sorusunun cevabını verir, mAP ise tüm eşiklerin özetidir. İkisi çeliştiğinde önce eşiğe bakın.

Karışıklık matrisi okuma rehberi

Güven eşiği: dengeyi siz seçiyorsunuz

Model tek bir eşikle gelmez. val ile predict varsayılanlarının farklı olması da buradan kaynaklanır ve sık kafa karıştırır (2026 itibarıyla):

from ultralytics import YOLO

model = YOLO("runs/detect/train/weights/best.pt")
metrics = model.val(data="suas.yaml", imgsz=1280, split="val")

print(metrics.box.map)     # mAP50-95
print(metrics.box.map50)   # mAP50
print(metrics.box.map75)   # mAP75
print(metrics.box.mp)      # ortalama precision
print(metrics.box.mr)      # ortalama recall
print(metrics.box.maps)    # sınıf başına mAP50-95
Argüman val varsayılanı predict varsayılanı Notu
conf 0.001 0.25 val’de kasıtlı olarak çok düşük: PR eğrisinin tamamı çıksın diye
iou 0.7 0.7 Bu NMS eşiği; gerçek kutuyla eşleştirme eşiği değil
max_det 300 300 Görüntü başına maksimum tespit

val’in conf=0.001 kullanması bilinçlidir: eğri düşük precision bölgesine kadar uzansın ister. Bu yüzden doğrulama çıktısındaki precision/recall sayılarını uçuş ayarınızın performansı sanmayın. Uçuşta biz conf=0.25 kullanıyoruz; o eşikteki gerçek precision/recall, tablodaki satır değil, PR eğrisi üzerindeki tek bir noktadır.

Ultralytics ayrıca F1’i maksimize eden eşiği kendisi arar; kaynak kodda ilgili satır şu:

i = smooth(f1_curve.mean(0), 0.1).argmax()  # max F1 index

Yani sınıflar üzerinden ortalanan F1 eğrisi hafifçe yumuşatılıp tepe noktası bulunur. F1_curve.png çıktısındaki bu tepe iyi bir başlangıç noktasıdır — ama F1, precision ile recall’a eşit ağırlık verir. Bizim gibi FP’nin daha pahalı olduğu bir görevde, F1-optimal eşiğin biraz üstünü seçmek rasyoneldir.

Sık düşülen tuzak: metriğin yanıltıcı olduğu dört durum

1. Küçük doğrulama seti. 40 nesne içeren bir sette 2 tespit farkı, mAP’yi birkaç puan oynatabilir. Bu gürültüyü gerçek iyileşme sanmak, aslında hiçbir şey yapmayan bir değişikliği kalıcılaştırmanın en kolay yoludur. Sayıya bakmadan önce sette kaç nesne olduğuna bakın.

2. Dengesiz sınıflar. mAP, sınıfların AP’lerini eşit ağırlıkla ortalar — örnek sayısını umursamaz. İki sınıflı bir modelde bol örnekli sınıf 0.98, seyrek sınıf 0.62 alsa mAP 0.80 çıkar ve tek sayı bakıldığında ikinci sınıfın çöktüğü görünmez. Kendi ilk veri setimizde sınıflar arasında ciddi bir örnek sayısı dengesizliği vardı; bu yüzden metrics.box.maps ile sınıf başına bakmayı alışkanlık haline getirdik.

3. Sızıntılı doğrulama (data leakage). En sinsi olanı bu. Aynı videodan çıkarılmış ardışık kareleri rastgele train/val’e bölerseniz, doğrulama setindeki kare eğitimdekinin neredeyse kopyası olur. Model ezberler, mAP yükselir, saha performansı değişmez. Doğru bölme birimi kare değil, çekim seansı olmalı: aynı uçuştan gelen tüm kareler aynı tarafta kalmalı.

4. Yanlış domain. Doğrulama seti göreve benzemiyorsa metrik başka bir problemi ölçer. Bizim ilk veri setimizde web’den toplanmış yer seviyesi görselleri baskındı; oysa görev, yüzlerce metre irtifadan nadir bakan bir kameradan geliyor. Bu yüzden doğrulama setini sadece havadan çekimlerle kurduk. Sayı düştü, ama anlamı yükseldi.

Bu dördü aynı anda tek bir cümlede özetlenebilir: mAP, veri setinizin ne kadar zor olduğunu da ölçer. Kolay bir set seçerseniz kolay bir sayı alırsınız.

Pratik özet

  • Tek sayı raporlamayın. mAP50, mAP50-95 ve sınıf başına AP’yi birlikte yazın; ikisi arasındaki fark kutu isabetiniz hakkında bedava bilgi verir.
  • Metriğin yanına kaydını düşün. “Aerial-only doğrulama setinde mAP50 0.950” ile “mAP50 0.950” farklı iddialardır. İkincisini yazmayın.
  • Doğrulama setini seansa göre bölün, kareye göre değil. Aynı uçuşun kareleri hem train hem val’de olmasın.
  • Uçuş eşiğinizi F1 eğrisinden seçin, ama görevin hata maliyetine göre kaydırın. Yanlış tespitin pahalı olduğu bir görevde F1-optimalin biraz üstü daha güvenlidir.
  • mAP yükseldiğinde önce sette kaç nesne olduğuna bakın. Küçük sette gördüğünüz iyileşme, çoğu zaman gürültüdür.

Metrik, modelin karnesi değil; sorduğunuz sorunun cevabıdır. Soruyu iyi kurarsanız, uçuş gününde sürpriz azalır.

  • YOLO
  • metrikler
  • mAP
  • doğrulama
  • confusion matrix

Zor bir mühendislik probleminiz mi var?

Yapılabilir mi, ne kadar sürer, nasıl kurulur: konuşarak başlayalım.

Projenizi Konuşalım