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.
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
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 torchfrom 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 scoreiou_score = box_iou(ground_truth, predicted)
print(f"IoU Score: {iou_score.item():.4f}")# Output: IoU Score: 0.6806pertanyaan 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:
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:
TIPkalau 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 modelmodel = YOLO("yolo26n.pt")
# Validate the model on the COCO8 dataset to calculate metricsmetrics = model.val(data="coco8.yaml")
# Access and print the mean Precision (P) score# The results dictionary contains keys for various metricsprint(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:
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:
TIPkalau 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 modelmodel = YOLO("yolo26n.pt")
# Validate the model on the COCO8 dataset# The results object contains metrics like Precision, Recall, and mAPmetrics = model.val(data="coco8.yaml")
# Access and print the mean recall score for box detectionprint(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:
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 modelmodel = YOLO("yolo26n.pt")
# Validate the model on a dataset (metrics are computed automatically)# This returns a validator object containing precision, recall, and mAPmetrics = model.val(data="coco8.yaml")
# Print the Mean Average Precision (mAP50-95), which correlates with F1 performanceprint(f"mAP50-95: {metrics.box.map}")
# Access precision and recall arrays to manually inspect the balanceprint(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):
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
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 diganti dengan nilai Precision maksimum yang ada di sebelah kanannya. Dalam notasi matematika:
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 () 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:
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 Ultralyticsx = np.linspace(0, 1, 101) # 101-point interpap = np.trapezoid(np.interp(x, mrec, mpre), x) # Integrasi areamAP (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:
Dimana:
- = jumlah kelas
- = 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 truthmetrics = 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:
| Kasus | GT (Objek) | Prediksi | TP | FP | FN | Precision | Recall | F1-Score |
|---|---|---|---|---|---|---|---|---|
| Kasus 1 | 100 | 95 | 95 | 0 | 5 | 1.00 (100%) | 0.95 (95%) | 0.974 |
| Kasus 2 | 100 | 105 | 100 | 5 | 0 | 0.952 (95.2%) | 1.00 (100%) | 0.975 |
| Kasus 3 | 100 | 105 | 95 | 10 | 5 | 0.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:
- Recall:
- F1-Score:
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:
- Recall:
- F1-Score:
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:
- Recall:
- F1-Score:
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.
If this article helped you, please share it with others!
Some information may be outdated





