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.

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.

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