mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1659 words
8 minutes
Mengenal Metrics pada Ultralytics YOLO
2026-05-05

sebelumnya, ane menulis postingan ini untuk kebutuhan pribadi, lebih luasnya untuk semua teman-teman seperjuangan yang mungkin baru belajar machine learning tepatnya object detection. sekaligus karena dosen ane meminta ane untuk memahami metric metric ini. dan juga sebelumnya ane meminta maaf jika ada kesalahan dan mohon untuk dikoreksi di komentar.

mari kita kenalan dengan metrics pada ultralytics yolo. ada banyak metrics yang perlu kita ketahui sebelum melakukan training atau evaluasi pada model yolo. berikut adalah beberapa metrics yang perlu kita ketahui:

IoU (Intersection over Union)#

IoU adalah metrik yang digunakan untuk mengukur akurasi posisi/geometri, seberapa baiknya predicted bounding box dari model cocok dengan ground truth bounding box. IoU dihitung dengan membagi luas area irisan (intersection) antara predicted bounding box dan ground bounding box dengan luas area gabungan (union) keduanya.

IoU=Area of Overlap(intersection)Area of Union\text{IoU} = \frac{\text{Area of Overlap(intersection)}}{\text{Area of Union}}

Nilai IoU berkisar antara 0 dan 1, di mana semakin besar nilainya, semakin baik kecocokannya. Lalu, nilai IoU ini digunakan untuk menentukan apakah sebuah prediksi dianggap benar atau tidak, dengan kata lain ambang batas IoU (threshold) biasanya ditetapkan pada nilai tertentu (misalnya 0.5) untuk memutuskan apakah sebuah bounding box prediksi dianggap sebagai true positif atau false positif.

berikut merupakan ilustrasi yang saya buat

Intersection over Union (IoU) - Threshold: 0.5 Ground Truth (Aktual) Prediction (Prediksi) Intersection (Irisan) GT Pred True Positive (TP) IoU = 0.60 IoU ≥ 0.5 (Valid) GT Pred False Positive (FP) IoU = 0.08 IoU < 0.5 (Meleset) *Prediksi tanpa GT juga = FP GT ❌ Tidak Terdeteksi False Negative (FN) IoU = 0 Objek Terlewat

kalau buat true negative gimana? ya dia si bounding box yang bener-bener nggak ada objectnya.

dan berikut merupakan code snippet untuk menghitung IoU dari dokumentasi resminya:

import torch
from ultralytics.utils.metrics import box_iou
# Define ground truth and prediction boxes: [x1, y1, x2, y2]
ground_truth = torch.tensor([[100, 100, 200, 200]])
predicted = torch.tensor([[110, 110, 210, 210]])
# Calculate the Intersection over Union score
iou_score = box_iou(ground_truth, predicted)
print(f"IoU Score: {iou_score.item():.4f}")
# Output: IoU Score: 0.6806

pertanyaan dari rekan saya
pengaruh nya apa kalau treshold diset lebih rendah/tinggi?

kalau treshold dibuat lebih rendah maka semakin banyak object yang terdeteksi tapi juga meningkatkan jumlah false positives

kalau treshold dibuat lebih tinggi, jumlah False Positives akan menurun. Model menjadi lebih “pemilih”, sehingga hanya deteksi dengan tingkat kecocokan sangat tinggi yang diterima.

jadi harus seimbang antara precision dan recall, maka dari itu dipilih angka 0.5 sevagai standar

kaitannya dengan pembahasan selanjutnya? treshold rendah meningkatkan recall (menemukan semua objek) tetapi menurunkan precision (banyak salah tebak). Sebaliknya, treshold tinggi meningkatkan precision tetapi menurunkan recall. (bakal tak bahas lagi di tip masing masing metric)

Precision (Presisi)#

Precision mengukur seberapa banyak prediksi yang benar dari keseluruhan prediksi yang dibuat oleh model. Dengan kata lain, precision menjawab pertanyaan: Dari semua tebakan yang dibuat model, seberapa banyak yang benar-benar akurat?

Rumus perhitungan Precision adalah sebagai berikut:

Precision=True PositivesTrue Positives+False Positives\text{Precision} = \frac{\text{True Positives}}{\text{True Positives} + \text{False Positives}}

Dimana:

  • True Positives (TP): Jumlah prediksi yang benar (model mendeteksi object dengan benar).
  • False Positives (FP): Jumlah prediksi yang salah (model mendeteksi object yang sebenarnya tidak ada, atau bounding box-nya tidak akurat).

Nilai Precision berkisar antara 0 hingga 1. Semakin tinggi nilai precision, semakin baik kemampuan model dalam menghindari prediksi yang salah.

Secara visual, precision dapat diilustrasikan sebagai berikut:

Precision (Presisi) "Dari semua tebakan yang dibuat model, seberapa banyak yang benar-benar akurat?" Ilustrasi Prediksi Model (Total: 5) Ground Truth Prediksi Model TP TP TP FP (Bukan Objek) FP (IoU < 0.5) Perhitungan Matematis Precision = TP / (TP + FP) = 3 / (3 + 2) = 0.60 Apa Artinya? • Model membuat total 5 tebakan (kotak biru). • Dari 5 tebakan tersebut, 3 benar (TP) dan 2 salah (FP). • Artinya, tingkat kepercayaan model adalah 60%.
TIP

kalau mau meningkatkan nilai precision, maka naikkan confidence treshold saat melakukan inference. resiko nya menurunkan recall.

berikut merupakan code snippet untuk mengukur precision dari dokumentasi resminya (yolo26)

from ultralytics import YOLO
# Load a pretrained YOLO26 model
model = YOLO("yolo26n.pt")
# Validate the model on the COCO8 dataset to calculate metrics
metrics = model.val(data="coco8.yaml")
# Access and print the mean Precision (P) score
# The results dictionary contains keys for various metrics
print(f"Mean Precision: {metrics.results_dict['metrics/precision(B)']:.4f}")

Recall (Sensitivity)#

Recall mengukur seberapa banyak object sebenarnya yang berhasil dideteksi oleh model dari keseluruhan object yang ada. Recall menjawab pertanyaan: Dari seluruh objek asli yang ada, seberapa banyak yang berhasil ditemukan?

Rumus perhitungan Recall adalah sebagai berikut:

Recall=True PositivesTrue Positives+False Negatives\text{Recall} = \frac{\text{True Positives}}{\text{True Positives} + \text{False Negatives}}

Dimana:

  • True Positives (TP): Jumlah prediksi yang benar.
  • False Negatives (FN): Jumlah object yang sebenarnya ada tetapi tidak terdeteksi oleh model.

Nilai Recall juga berkisar antara 0 hingga 1. Semakin tinggi nilai recall, semakin baik kemampuan model dalam menemukan object yang sebenarnya.

Berikut adalah ilustrasi untuk Recall:

Recall (Sensitivitas) "Dari seluruh objek asli yang ada, seberapa banyak yang berhasil ditemukan?" Ilustrasi Objek Asli (Total GT: 5) Ground Truth (Objek Asli) Prediksi Model TP TP TP FN (Terlewat) FN (Terlewat) Perhitungan Matematis Recall = TP / (TP + FN) = 3 / (3 + 2) = 0.60 Apa Artiny bang? • Ada total 5 objek asli (kotak hijau) di gambar. • Model berhasil menemukan 3 (TP) tapi melewatkan 2 (FN). • Artinya, kemampuan model meraup objek adalah 60%.
TIP

kalau mau meningkatkan nilai recall, maka turunkan confidence treshold saat melakukan deteksi. jadi bakal ngebuat model lebih “berani” menebak, sehingga objek samar lebih mungkin terdeteksi, meskipun resiko nya menurunkan precision (menambah false positive).

berikut merupakan code snippet untuk mengukur recall dari dokumentasi resminya (yolo26)

from ultralytics import YOLO
# Load a pretrained YOLO26 model
model = YOLO("yolo26n.pt")
# Validate the model on the COCO8 dataset
# The results object contains metrics like Precision, Recall, and mAP
metrics = model.val(data="coco8.yaml")
# Access and print the mean recall score for box detection
print(f"Mean Recall: {metrics.results_dict['metrics/recall(B)']:.4f}")

F1 Score#

F1 Score adalah ukuran gabungan dari Precision dan Recall. F1 Score memberikan nilai tunggal yang merupakan rata-rata harmonik dari Precision dan Recall. Hal ini berguna untuk mengevaluasi model secara keseluruhan, terutama ketika terdapat ketidakseimbangan dalam dataset.

Rumus F1 Score adalah sebagai berikut:

F1Score=2PrecisionRecallPrecision+RecallF1 Score = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}}

dari situ bisa dilihat kalau precision dan recall punya hubungan yang berbanding terbalik, ketika precision naik maka recall akan turun dan sebaliknya, hasil nya pun akan naik turun juga tergantung precision dan recall nya. hasil yang besar biasanya ada diantara keduanya.

Hasil dari F1 Score ini akan digunakan untuk menentukan Confidence Threshold, apa itu? jadi yolo itu akan memberikan skor (0-1) setiap deteksi. Misal di set Confidence Threshold 0.5, maka model hanya menampilkan objek yg ia yakini lebih dari 50% benar.

F1 score ini membantu kita untuk menemukan angka terbaik ini, jika nilai F1 mencapai puncak 0.6, maka pakai nilai ini saat aplikasi dijalankan supaya deteksi seimbang

berikut merupakan code snippet untuk menghitung f1 score dari dokumentasi resminya (yolo26)

from ultralytics import YOLO
# Load a pre-trained YOLO26 model
model = YOLO("yolo26n.pt")
# Validate the model on a dataset (metrics are computed automatically)
# This returns a validator object containing precision, recall, and mAP
metrics = model.val(data="coco8.yaml")
# Print the Mean Average Precision (mAP50-95), which correlates with F1 performance
print(f"mAP50-95: {metrics.box.map}")
# Access precision and recall arrays to manually inspect the balance
print(f"Precision: {metrics.box.p}")
print(f"Recall: {metrics.box.r}")

AP (Average Precision)#

AP adalah metrik yang menghitung area dibawah kurva precision recall. AP ini menghasilkan satu nilai tunggal yg merepresentasikan kemampuan model dlm menyeimbangkan precision dan recall pada berbagai treshold untuk satu kelas tertentu.

berbeda dengan F1 Score yang hanya mengambil satu titik optimal, AP menilai model di seluruh rentang confidence threshold.

Rumus nya adalah dengan mengintegrasikan Precision (P) sebagai fungsi dari Recall (R):

AP=01P(R)dRAP = \int_{0}^{1} P(R)dR
tambahan (saya belum paham betul, masih dalam tahap eksplorasi, setidaknya mau nulis apa yg udah didapat terlebih dahulu) 👉 klik disini

dalam praktekny, perhitungan ini menggunakan metode 101-point interpolation (salah satunya). untuk menghaluskan kurva

AP=1101×Pinterp(r) AP = \frac{1}{101} \times \sum P_{interp}(r)

mengapa perlu dihaluskan? karena jika kita memplot nilai Precision terhadap Recall setiap kali kita menurunkan confidence threshold, kurva aslinya tidak akan mulus. Kurva ini akan berbentuk zig-zag naik turun.

Precision biasanya turun saat Recall naik (karena kita membiarkan lebih banyak prediksi masuk, sehingga peluang false positive membesar). namun, kadang Precision bisa naik kembali jika prediksi berikutnya ternyata tepat mengenai sasaran (true positive).

karena bentuk zig-zag ini membuat perhitungan luas area integral menjadi rumit dan kurang stabil, kita melakukan interpolasi (mirip konsep seperti aproksimasi nya jumlah riemann yang pernah muncul di semester 1). Nilai Precision pada sebuah titik Recall RR diganti dengan nilai Precision maksimum yang ada di sebelah kanannya. Dalam notasi matematika:

Pinterp(R)=maxr~RP(r~)P_{interp}(R) = \max_{\tilde{r} \geq R} P(\tilde{r})

standar eval COCO tsb (yg biasanya digunakan beberapa model yolo) menggunakan 101-point interpolation tersebut, di mana ia mengambil nilai Precision di 101 titik Recall yang berjarak sama rata (0.00,0.01,0.02,...,1.000.00, 0.01, 0.02, ..., 1.00) lalu merata-ratakannya. scr matematis, ini sama dengan menghitung luas area balok di bawah kurva yang sudah dihaluskan

berikut merupakan ilustrasi SVG nya kurva zigzag serta yg interpolasi/dihaluskan:

Average Precision (AP) & Interpolated Precision-Recall Curve Membuktikan Luas Area di Bawah Kurva (Area Under Curve) 1.0 0.8 0.6 0.4 0.2 Precision (P) Recall (R) 0.0 0.1 0.3 0.7 0.9 1.0 Raw PR Curve (Zig-Zag) Interpolated Curve Menghitung Area (AP) Luas balok biru (Integral) merepresentasikan nilai AP. Rentang Recall (ΔR) | Max Precision 0.0 hingga 0.1 (0.1) | P = 1.00 0.1 hingga 0.3 (0.2) | P = 0.85 0.3 hingga 0.7 (0.4) | P = 0.65 0.7 hingga 0.9 (0.2) | P = 0.30 0.9 hingga 1.0 (0.1) | P = 0.10 Total Area (Average Precision): AP = Σ (ΔRecall × P_interp) = (0.1×1) + (0.2×0.85) + (0.4×0.65) ... + (0.2×0.3) + (0.1×0.1) AP = 0.60 (atau 60%) Konsep 101-Point Interpolation (Standar COCO): Alih-alih menggunakan blok kasar, YOLO merata-ratakan nilai Precision di 101 titik (R=0.00, R=0.01 ... R=1.00). Secara matematis, perhitunganny menghasilkan luas area yg sama (Area Under Curve) secara lebih presisi.

oada SVG tsb, dapat dilihat garis merah yang zig-zag (precision turun, tapi kadang naik lagi saat menebak dengan benar). garis biru tebal adalah hasil interpolasi: kita menarik garis datar dari titik puncak yg ada di sebelah kanannya untuk menutupi lembah yang zig-zag. Area balok biru di bawahnya itulah nilai eksak dari Average Precision (AP) untuk satu kelas.

berikut merupakan code snippet yg digunakan ultralytics untuk menghitung AP menggunakan NumPy:

# Contoh di internal Ultralytics
x = np.linspace(0, 1, 101) # 101-point interp
ap = np.trapezoid(np.interp(x, mrec, mpre), x) # Integrasi area

mAP (mean Average Precision)#

Average Precision (AP) hanya mengukur seberapa baik model mendeteksi satu kelas saja. Dalam dunia nyata, model deteksi objek harus bisa mendeteksi banyak objek sekaligus (misalnya: mobil, motor, orang).

mAP adalah nilai rata-rata dari AP dari semua kelas yang ada dalam dataset tersevut.

Jika kita memiliki 3 kelas:

  • Kelas ‘Person’: AP = 0.80
  • Kelas ‘Car’: AP = 0.70
  • Kelas ‘Bicycle’: AP = 0.60

Maka mAP = (0.80 + 0.70 + 0.60) / 3 = 0.70

Rumus lengkap mAP:

mAP=1Ni=1NAPimAP = \frac{1}{N}\sum_{i=1}^{N} AP_i

Dimana:

  • NN = jumlah kelas
  • APiAP_i = Average Precision untuk kelas ke-i

mAP sendiri sangat bergantung pada threshold IoU yg digunakan. oleh karena itu ada beberapa variasi mAP tergantung penggunaan threshold IoU nya.

  • ada yang menyebut mAP@50 (artinya mAP dengan threshold IoU 0.5)
  • ada yang menyebut mAP@50-95 (artinya mAP dengan threshold IoU dari 0.5 sampai 0.95 dengan interval 0.05)

berikut merupakan code snippet untuk mengukur mAP dari dokumentasi resminya (yolo26)

from ultralytics import YOLO
# Load the YOLO26 model (recommended for new projects)
model = YOLO("yolo26n.pt")
# Validate the model on a dataset to compute mAP
# This runs inference and compares predictions to ground truth
metrics = model.val(data="coco8.yaml")
# Print mAP@50-95 (map) and mAP@50 (map50)
print(f"mAP@50-95: {metrics.box.map:.3f}")
print(f"mAP@50: {metrics.box.map50:.3f}")

ibaratkan mAP ini sebagai rapot final kinerja si model terhadap dataset yang digunakan

mungkin cukup segitu yg bisa ane jabarkan, selebihnya bisa cek langsung pada dokumentasi resmi dari ultralytics nya


contoh kasus (dari dosen ane)#

kasus1jadi real objek ada 100 dari 100 itu ada 95 prediction dan keseluruhan tepat
kasus 2 objek 100, predict ada 105, dan 100 objeknya kena kotak
kasus 3, objek 100 predict 105 tapi yang benar cuma 95
mulai dari tp fp dan f1 score bonus

didapat model matematika dan jawaban sebagai berikut:

KasusGT (Objek)PrediksiTPFPFNPrecisionRecallF1-Score
Kasus 11009595051.00 (100%)0.95 (95%)0.974
Kasus 2100105100500.952 (95.2%)1.00 (100%)0.975
Kasus 3100105951050.905 (90.5%)0.95 (95%)0.927

pembahasan#

kasus 1: sedikit prediksi, tapi soal akurat mah gokil

  • analisis: model “pemalu”. Ia hanya menebak jika ia benar-benar yakin.
  • TP: 95 (semua prediksi tepat mengenai objek).
  • FP: 0 (tidak ada kotak yang meleset).
  • FN: 5 (ada 100 objek, tapi 5 terlewat).
  • Precision: 95/(95+0)=1.095 / (95 + 0) = 1.0
  • Recall: 95/(95+5)=0.9595 / (95 + 5) = 0.95
  • F1-Score: F1=2×1.0×0.951.0+0.95=1.91.950.974F1 = 2 \times \frac{1.0 \times 0.95}{1.0 + 0.95} = \frac{1.9}{1.95} \approx 0.974

kasus 2: prediksi berlebih, semua objek tertangkap

  • analisis: model “agresif”. Ia menebak banyak tempat agar tidak ada objek yang terlewat.
  • TP: 100 (semua objek asli berhasil dideteksi).
  • FP: 5 (total 105 prediksi - 100 yang benar = 5 tebakan salah/halusinasi).
  • FN: 0 (tidak ada objek yang terlewat).
  • Precision: 100/(100+5)0.952100 / (100 + 5) \approx 0.952
  • Recall: 100/(100+0)=1.0100 / (100 + 0) = 1.0
  • F1-Score: F1=2×0.952×1.00.952+1.0=1.9041.9520.975F1 = 2 \times \frac{0.952 \times 1.0}{0.952 + 1.0} = \frac{1.904}{1.952} \approx 0.975

kasus 3: prediksi berlebih dan kurang akurat

  • analisis: model “kurang teliti”. Banyak menebak tapi banyak yang salah, dan masih ada yang terlewat.
  • TP: 95 (hanya 95 yang tepat sasaran).
  • FP: 10 (total 105 prediksi - 95 yang benar = 10 tebakan salah).
  • FN: 5 (ada 100 objek, tapi cuma 95 yang ketemu = 5 terlewat).
  • Precision: 95/(95+10)0.90595 / (95 + 10) \approx 0.905
  • Recall: 95/(95+5)=0.9595 / (95 + 5) = 0.95
  • F1-Score: F1=2×0.905×0.950.905+0.95=1.7191.8550.927F1 = 2 \times \frac{0.905 \times 0.95}{0.905 + 0.95} = \frac{1.719}{1.855} \approx 0.927

kesimpulan#

dari kasus 2 didapatkan F1 score tertinggi yaitu 0.975. model ini yg paling seimbang dalam konteks studi kasus ini karena berhasil mencapat Recall sempurna tanpa menjatuhkan Precision terlalu dalam, sedangkan untuk kasus 1 bagus jika kita butuh model yg “tidak pernah bohong” dengan precision 100% (FP minim) namun lemah dalam mendeteksi seluruh populasi objek (FN tinggi). lalu untuk kasus 3 adalah yang terburuk diantara ketiganya karena memiliki jumlah salah tebak (FP) dan objek yg telewat (FN) yg paling tinggi secara akumulatif


terimakasih kepada Bapak Dosen karena telah memberikan studi kasus ini, sehingga ane bisa belajar sekaligus share ilmu untuk temen-temen, terimakasih juga untuk ultralytics sudah membuat dokumentasi yang lengkap. disini juga ane menggunakan AI milik ultralytics guna mengkoreksi bilamana ada penjelasan yang kurang tepat.

terakhir saya berterimakasih pada band dan artis berikut karena telah menemani penulisan postingan ini: Alm. Nike Ardilla, Iklim, Slam, Exists, Alm. Poppy Mercury, Stings, Search, Anie Carera, Nor Zila Haji Aminuddin a.k.a Ella, etc.

Share

If this article helped you, please share it with others!

Mengenal Metrics pada Ultralytics YOLO
https://vermilion10-blog.pages.dev/posts/ultralytics-metrics/
Author
vermilion10
Published at
2026-05-05
License
CC BY-NC-SA 4.0

Some information may be outdated

Table of Contents