GÖREV KAYDI

GÖREV KAYDI

KAYIT AÇIK

ATILIM UAV · YER KONTROL İSTASYONU

GÖREV KAYDI / DETAY

Arşiv

CANLI · OKUMA MODU

Yazılım

mAP, Precision, Recall: Model Metrikleri Gerçekte Nasıl Okunur?

mAP, Precision, Recall: Model Metrikleri Gerçekte Nasıl Okunur?

AP'nin eğri altındaki alan olarak gösterildiği precision-recall eğrisi

ŞEK. 01

KAYIT KÜNYESİ

Kategori

Yazılım

TARİH

TÜM KAYITLAR

Eğitim bitti ve terminal son satırını yazdı: mAP50 0.950. Takımda kısa süreli bir kutlama koptu. Ertesi hafta aynı modeli sahada uçurduk ve hedeflerden birine ne yaptıysak kilitlenemedik.

Bu çelişki bize bir refleks kazandırdı: metriğe güvenmeyi bırakmak. Ama yanlış tepki bu. Metrik yalan söylemiyordu; biz ona yanlış soruyu soruyorduk. mAP50 0.950 "model sahada iyi çalışıyor" demiyor. "Bu görüntülerde, bu doğrulama setinde, 0.50 IoU eşiğinde, tüm güven eşikleri boyunca ortalaması alındığında precision bu kadar" diyor. Bu iki cümle arasındaki mesafe, uçuş günüyle ofisteki bir gün arasındaki mesafe kadar geniş.

Bu yazıda tespit metriklerini formülleriyle birlikte açıyoruz: hangi sayı neyi ölçüyor, her biri sizi ne zaman yanıltıyor ve kendi doğrulama setimizde neye dikkat ediyoruz.

Ö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 çizer. Kutu doğru yerde mi? İşte IoU'nun (Intersection over Union, kesişimin birleşime oranı) ölçtüğü şey bu:

IoU = Alan(tahmin ∩ ground truth) / Alan(tahmin ∪ ground truth)

IoU 0 ile 1 arasında değişir. 1 tam örtüşme, 0 ise hiç örtüşme yok demektir. Tipik olarak 0.50 gibi bir eşik seçer ve tahminleri üç gruba ayırırsınız:

Kısaltma

Adı

Ne anlama gelir

TP

True Positive (doğru pozitif)

Doğru sınıf ve IoU ≥ eşik

FP

False Positive (yanlış pozitif)

Yanlış sınıf, ya da IoU < eşik, ya da hiç nesne yokken üretilmiş bir kutu

FN

False Negative (yanlış negatif)

Gerçekten orada olan ama modelin bulamadığı nesne

Bu listede eksik olana dikkat edin: TN (True Negative) yok. Tespitte "arka planı doğru şekilde tespit etmemek" sayılamaz, çünkü bir görüntü nesne olmayan sınırsız sayıda kutu barındırır. Accuracy'nin tespitte kullanılmamasının nedeni de bu: paydası tanımsız.

Precision ve recall: birbirini iten iki soru

TP/FP/FN üçlüsünden iki metrik çıkar. Her biri tek cümlelik bir soruyu yanıtlar:

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ı

İkisi genelde birbirinin aleyhine çalışır. Modeli cesaretlendirirseniz (düşük güven eşiği) recall yükselir, precision düşer. Daha temkinli yaparsanız tersi olur.

Hangisinin daha ağır bastığı göreve bağlı. Bizim SUAS görevimizde tablo şöyle:

Hata türü

Sahada nasıl görünür

Maliyet

FP (yanlış tespit)

Olmayan bir hedefe otonom bırakış yapmak

Yüksek: doğrudan puan kaybettirir

FN (kaçırılan hedef)

Hedefin üzerinden bırakış yapmadan geçmek

Orta: tur tekrarlanabilir

Yani bizim için precision, recall'dan biraz daha pahalı. Otonom bırakış kararı geri alınamıyor. Bu tercih, aşağıda anlattığımız güven eşiğini 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 taradığınızda bir eğri elde edersiniz: precision-recall (PR) eğrisi. Eğri sol üst köşeye ne kadar yaklaşırsa o kadar iyi.

AP (Average Precision), bu eğrinin altında kalan alandır. Ultralytics'in de kullandığı COCO protokolü bunu 101 noktalı interpolasyonla hesaplar: recall ekseni {0, 0.01, ..., 1.00} noktalarında örneklenir, her noktada o recall'a karşılık gelen maksimum precision alınır ve ortalama 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. Modelimizin iki sınıfı var, dolayısıyla mAP iki AP'nin aritmetik ortalaması; bu ayrıntı önemli, birazdan geri döneceğiz.



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

mAP50 ile mAP50-95 arasındaki fark

Yukarıdaki tanımda IoU eşiğini 0.50'de sabitledik. Bu mAP50. mAP50-95 ise IoU eşiğini 0.50'den 0.95'e 0.05'lik adımlarla tarayarak (10 farklı eşik) elde ettiğiniz mAP değerlerinin ortalamasıdır:

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

Pratikte ikisini ayıran şey şu:

Metrik

Neyi ölçer

Ne zaman bakılır

mAP50

"Nesneyi kabaca doğru yerde buldun mu?"

Nesne var/yok kararının yeterli olduğu bul-ve-geç işlerinde

mAP50-95

"Kutunun sınırları ne kadar isabetli?"

Hassas konumlandırma, ölçüm, takip ya da bırakış noktası hesabı gerektiğinde

mAP75

Orta yol; katı, ama 0.95 kadar acımasız değil

Diğer iki metrik arasındaki farkın nereden geldiğini kovaladığınızda

mAP50 her zaman mAP50-95'ten yüksektir. Aradaki fark büyükse, modeliniz nesneyi buluyor ama kutuyu üzerine düzgün oturtamıyordur. Bu fark tipik olarak küçük nesnelerde açılır: birkaç piksellik kayma, küçük bir kutuda IoU'yu oransal olarak çok daha fazla düşürür.

Bir uyarı: mAP50'yi tek başına raporlamak sayıyı olduğundan iyi gösterir. mAP50 için 0.950 değerini, yalnızca havadan görüntülerden oluşan kendi doğrulama setimizde ölçtük ve bu sayıyı her zaman "yalnızca havadan doğrulama setinde" kaydıyla yazıyoruz. Kaydı düşürdüğünüzde okuyucu bunu genel yetenek iddiası sanır.

Confusion matrix'i okumak

Doğrulamanın sonunda Ultralytics (nc+1) × (nc+1) boyutunda bir confusion matrix (karışıklık matrisi) çizer; burada nc sınıf sayısı, fazladan gelen satır/sütun ise background'dur. O fazladan satır, sınıflandırma probleminde olduğu gibi bir sınıf değil; eşleşmemiş tahminleri ve kaçırılan ground truth nesnelerini toplayan bir gider.

Hücre

Ne anlama gelir

Ne yapmalı

Köşegen (sınıf i → sınıf i)

Doğru tespitler

Yapılacak bir şey yok

Sınıf i → sınıf j (köşegen dışı)

Sınıf karışması

Etiket kalitesini ve sınıflar arası görsel benzerliği kontrol edin

background → sınıf i sütunu

Arka planı nesne sandı (FP)

Hard negative örnek ekleyin, eşiği yükseltin

sınıf i → background satırı

Gerçek nesneyi kaçırdı (FN)

Örnek sayısına, çözünürlüğe ve tiling'e bakın

Önemli bir ayrıntı: PR eğrisinin aksine confusion matrix tek bir güven eşiğinde çizilir; Ultralytics'te varsayılan olarak 0.25 (2026 itibarıyla). Yani matris "model bu eşikte ne yapıyor" sorusunu yanıtlar, mAP ise tüm eşikler boyunca bir özettir. İkisi çeliştiğinde önce eşiğe bakın.



Confusion matrix okuma rehberi

Güven eşiği: dengeyi seçen sizsiniz

Bir model tek bir eşikle gelmez. val ile predict varsayılanları arasındaki fark da buradan doğar ve düzenli olarak 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)      # mean precision
print(metrics.box.mr)      # mean recall
print(metrics.box.maps)    # per-class mAP50-95
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)      # mean precision
print(metrics.box.mr)      # mean recall
print(metrics.box.maps)    # per-class mAP50-95

Parametre

val varsayılanı

predict varsayılanı

Not

conf

0.001

0.25

val'de kasıtlı olarak çok düşük; böylece PR eğrisinin tamamı çıkar

iou

0.7

0.7

Bu NMS eşiği, ground truth eşleştirme eşiği değil

max_det

300

300

Görüntü başına maksimum tespit sayısı

val'in conf=0.001 kullanması bilinçli: eğrinin düşük precision bölgesine kadar uzanmasını ister. Bu yüzden doğrulama çıktısındaki precision/recall sayılarını uçuş konfigürasyonunuzun performansı sanmayın. Uçuşta conf=0.25 kullanıyoruz; o eşikteki gerçek precision/recall, PR eğrisi üzerindeki tek bir noktadır, tabloda basılan satır değil.

Ultralytics kendiliğinden F1'i maksimize eden eşiği de arar; kaynaktaki ilgili satır şu:

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

Yani sınıflar üzerinden ortalaması alınan F1 eğrisi hafifçe yumuşatılır ve tepe noktası bulunur. F1_curve.png çıktısındaki bu tepe iyi bir başlangıç noktası, ama F1, precision ile recall'a eşit ağırlık verir. FP'nin daha pahalı olduğu bizimki gibi bir görevde eşiği F1 optimumunun biraz üzerinde seçmek akılcı olur.

Sık düşülen tuzaklar: metriğin sizi yanılttığı dört durum

1. Küçük doğrulama seti. 40 nesne barındıran bir sette 2 tespitlik fark mAP'yi birkaç puan oynatabilir. Bu gürültüyü gerçek bir iyileşme sanmak, aslında hiçbir işe yaramayan bir değişikliği kalıcılaştırmanın en kolay yolu. 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 iyi temsil edilen sınıf 0.98, seyrek olan 0.62 alıyorsa mAP 0.80 çıkar ve o tek sayıya bakmak ikinci sınıfın çöktüğüne dair hiçbir ipucu vermez. 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 bazında bakmayı alışkanlık hâline getirdik.

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

4. Yanlış alan. Doğrulama seti göreve benzemiyorsa metrik başka bir problemi ölçüyordur. İlk veri setimizde ağırlık, web'den toplanmış yer seviyesi görüntülerindeydi; oysa görev, yüzlerce metre yukarıdan aşağı bakan bir kameradan geliyor. Bu yüzden doğrulama setini yalnızca havadan görüntülerden kurduk. Sayı düştü, ama anlamı yükseldi.

Dördü de tek bir cümleye iniyor: mAP aynı zamanda veri setinizin ne kadar zor olduğunu ölçer. Kolay bir set seçerseniz kolay bir sayı alırsınız.

Pratik özet

  • Tek bir sayı raporlamayın. mAP50, mAP50-95 ve sınıf bazında AP'yi birlikte yazın; ilk ikisi arasındaki fark, kutu isabetiniz hakkında bedava bilgi verir.

  • Kaydı metriğin yanına yazın. "Yalnızca havadan görüntülerden oluşan doğrulama setinde mAP50 0.950" ile "mAP50 0.950" farklı iddialardır. İkincisini yazmayın.

  • Doğrulama setini oturuma göre bölün, kareye göre değil. Aynı uçuştan gelen kareler asla hem train'e hem val'e düşmemeli.

  • 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 optimumunun biraz üstü daha güvenli.

  • mAP yükseldiğinde önce sette kaç nesne olduğuna bakın. Küçük bir sette gördüğünüz iyileşme genelde gürültüdür.

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

©2026 ATILIM UAV TEAM

©2026 ATILIM UAV TEAM