Menilai model secara jujur: mode val Ultralytics, bedah mAP50 vs mAP50-95, precision/recall per kelas, membaca confusion matrix dan PR curve untuk menemukan kelas lemah serta kesalahan umum model hasil fine-tune

Model fine-tune dari episode 10 sudah menghasilkan angka. Tapi angka saja tidak bercerita — evaluasi yang benar yang memberitahu apakah model layak deploy atau masih perlu dikerjakan.
Ini skill yang membedakan praktisi serius dari penggemar: pemula berhenti di "mAP 0.85, lumayan!", sementara engineer bertanya — mAP di IoU berapa? Kelas mana yang lemah? Model salahnya ke arah mana? Apakah val set-nya benar-benar mewakili produksi? Episode ini melatih pertanyaan-pertanyaan itu dengan alat resmi Ultralytics.
val: Evaluasi TerstandarUltralytics menyediakan evaluasi satu perintah:
yolo val model=runs/detect/train/weights/best.pt data=proyek-helm/data.yamlHasil lengkap (tabel per kelas + artefak grafik) tersimpan di runs/detect/val/. Penting: evaluasi harus pada split val yang tidak pernah disentuh training — kalau bocor, semua angka jadi bohong.
Keduanya bukan metrik yang sama — dan selisihnya adalah informasi:
| Metrik | Definisi | Makna Praktis |
|---|---|---|
| mAP50 | AP rata-rata @ IoU ≥ 0.5 | "Apakah box kira-kira kena?" — toleran |
| mAP50-95 | Rata-rata AP pada IoU 0.5–0.95 | "Seberapa presisi box?" — ketat |
Model dengan mAP50 = 0.90 tapi mAP50-95 = 0.45 punya deteksi yang kena tapi longgar — box konsisten lebih besar/kecil dari objek. Untuk use case hitung kendaraan itu mungkin cukup; untuk robot gripper atau pengukuran dimensi, fatal. Gunakan mAP50-95 sebagai KPI utama, mAP50 sebagai sanity check.
Angka agregat menyembunyikan drama per kelas. Tabel output val seperti ini:
Class Images Instances Box(P R mAP50 mAP50-95)
all 40 120 0.883 0.758 0.841 0.612
person 40 60 0.921 0.900 0.933 0.701
helm 40 35 0.944 0.743 0.862 0.654
no-helm 40 25 0.785 0.630 0.728 0.481Cara membacanya:
File confusion_matrix.png otomatis tersimpan tiap run. Matriks ini menjawab pertanyaan yang tidak bisa dijawab angka agregat: kesalahan spesifiknya apa?
Contoh pola klasik dataset helm:
Prediksi →
helm no-helm background
Aktor ↓ helm 26 2 7
no-helm 4 16 5Tiga diagnosis berbeda dari satu matriks:
background gemuk → banyak false positive: model "melihat" objek di tempat kosong. Solusi: tambah background images (txt kosong), naikkan conf threshold.background gemuk di baris kelas → missed detection: objek ada tapi tak terdeteksi — biasanya ukuran kecil, blur, atau pencahayaan ekstrem.Tip
Confusion matrix Ultralytics default memakai conf=0.25. Jika aplikasi kalian berjalan di threshold lain (misal 0.5), jalankan ulang val dengan conf=0.5 agar matriks mencerminkan perilaku produksi — bukan perilaku default.
Dua grafik lain yang otomatis tersimpan:
conf yang memaksimalkan F1 — pakai angka itu sebagai titik awal threshold produksi kalian, bukan asumsi.Metrik bilang berapa, mata kalian bilang kenapa. Ambil sampel gambar val, jalankan prediksi, dan periksa visual:
from ultralytics import YOLO
model = YOLO("runs/detect/train/weights/best.pt")
model.predict(source="proyek-helm/images/val/", conf=0.25,
save=True, name="inspeksi")
# buka runs/detect/inspeksi/ — bandingkan prediksi vs label sebenarnyaYang dicari saat inspeksi manual: box yang konsisten bergeser (annotation bias?), objek tertentu yang selalu gagal (variasi belum terwakili?), deteksi ganda pada objek sama (threshold/NMS issue).
Rangkuman episode ini:
yolo val / .val() adalah evaluasi standar — selalu pada split val yang bersih.Di episode 12 kita masuk senjata rahasia dataset kecil: data augmentation — bagaimana mosaic, mixup, HSV, dan flip bekerja di balik layar Ultralytics, kapan justru harus dikurangi, dan eksperimen nyata mengukur dampak augmentasi ke mAP. Sampai jumpa!