Fondasi object detection: perbedaan classification, detection, dan segmentation; anatomi bounding box, IoU, dan confidence; metrik mAP, precision/recall, serta FPS — ditutup praktik visualisasi anotasi bounding box

Di episode 0 kita sudah menyiapkan environment: Python, Ultralytics, dan opsi GPU. Sekarang kita mulai dari konsep paling fundamental sebelum menyentuh YOLO itu sendiri — object detection.
Kenapa episode ini wajib? Karena seluruh series ini akan berbicara dalam istilah bounding box, IoU, confidence score, dan mAP. Jika kalian langsung loncat ke training tanpa memahami ini, setiap hasil evaluasi nanti hanya akan jadi angka yang tidak bermakna. Analoginya seperti belajar menyetir tanpa tahu arti lampu lalu lintas — mesinnya jalan, tapi kalian tidak paham apa yang sedang terjadi.
Tiga task vision ini sering dikacaukan. Padahal output-nya sangat berbeda:
| Task | Pertanyaan yang Dijawab | Output |
|---|---|---|
| Classification | Apa objek di gambar ini? | Satu label + probabilitas |
| Object Detection | Objek apa saja, di mana letaknya? | Daftar bounding box + label + confidence |
| Instance Segmentation | Bentuk presisi tiap objek bagaimana? | Mask piksel-per-piksel per instance |
Analogi dunia nyata: classification seperti menjawab "ini foto kucing", detection seperti berkata "ada dua kucing — satu di pojok kiri bawah, satu di tengah", sedangkan segmentation menggambar siluet persis mengikuti bentuk tubuh masing-masing kucing.
YOLO dikenal sebagai model detection, tapi ekosistem modernnya mendukung ketiganya (kita bahas multi-task ini di episode 5). Detection adalah sweet spot-nya: lebih informatif daripada classification, jauh lebih murah secara komputasi dibanding segmentation.
Bounding box adalah kotak yang membungkus objek. Dalam format YOLO, satu box direpresentasikan oleh empat angka plus class ID:
<class_id> <x_center> <y_center> <width> <height>
2 0.481250 0.613194 0.234375 0.411111Perhatikan dua hal penting:
Warning
Kesalahan klasik pemula: mencampur format koordinat. VOC/COCO pakai pojok atau piksel absolut, YOLO pakai center + normalized. Sebelum menyalahkan model saat training gagal, cek dulu apakah konversi format dataset kalian benar — kita bedah tuntas di episode 8.
Setiap prediksi YOLO disertai confidence (0–1): seberapa yakin model bahwa kotak tersebut benar-benar berisi objek dari kelas tertentu. Saat inference, prediksi dengan confidence di bawah threshold (default conf=0.25) dibuang. Menyetel threshold ini adalah trade-off klasik:
IoU mengukur seberapa tepat prediksi box tumpang-tindih dengan ground truth:
IoU = luas irisan kedua box / luas gabungan kedua boxNilainya 0–1: IoU = 1 berarti sempurna tumpang tindih. Konvensi industri menyebut deteksi "benar" jika IoU ≥ 0.5 (biasa ditulis mAP50).
IoU juga menjadi dasar Non-Maximum Suppression (NMS) — mekanisme membuang box duplikat pada objek yang sama. Menariknya, YOLO26 menghapus NMS sepenuhnya dari pipeline-nya (NMS-free end-to-end) — salah satu inovasi yang kita bahas di episode 3 dan 26.
Dua metrik paling mendasar untuk menilai kualitas deteksi:
TP / (TP + FP))TP / (TP + FN))Keduanya saling menekan. Naikkan confidence threshold → precision naik, recall turun. Turunkan threshold → recall naik, precision turun. PR curve menggambarkan trade-off ini, dan area di bawah kurvanya menjadi dasar mAP.
mAP adalah metrik utama leaderboard object detection:
Saat kalian lihat klaim "YOLO26n mencapai 40.9 mAP di COCO", angka itu merujuk mAP50-95. Kita akan praktik membaca metrik ini dari hasil training nyata di episode 11.
Akurasi bukan segalanya — kecepatan adalah alasan YOLO ada. FPS mengukur berapa frame yang bisa diproses per detik; aplikasi real-time (CCTV, drone, mobil otonom) umumnya butuh minimal 25–30 FPS. Nama YOLO sendiri — You Only Look Once — berasal dari trik kecepatannya: melihat gambar sekali dalam satu forward pass, berbeda dengan metode two-stage era lamanya yang harus memproses ribuan region secara berulang.
Mari solidkan pemahaman dengan kode kecil: menggambar bounding box format YOLO di atas gambar menggunakan OpenCV.
import cv2
img = cv2.imread("street.jpg")
h, w = img.shape[:2]
with open("street.txt") as f:
for line in f:
cls, xc, yc, bw, bh = map(float, line.split())
x1 = int((xc - bw / 2) * w)
y1 = int((yc - bh / 2) * h)
x2 = int((xc + bw / 2) * w)
y2 = int((yc + bh / 2) * h)
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(img, f"class {int(cls)}", (x1, y1 - 6),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
cv2.imwrite("annotated.jpg", img)Kode ini memaksa kalian membayangkan setiap langkah: parsing angka normalized, konversi ke piksel absolut, lalu menggambar rectangle. Persis logika yang nanti dilakukan renderer hasil YOLO secara otomatis.
Tip
Selalu visualisasi anotasi dataset kalian SEBELUM training. Sembilan dari sepuluh dataset custom memiliki anotasi rusak — box meleset, class ID salah — yang hanya kelihatan kalau digambar di atas gambar. Ini bisa menghemat puluhan jam training sia-sia.
Yang harus kalian bawa dari episode ini:
class_id x_center y_center width height, semuanya normalized.Di episode 2 kita akan menelusuri sejarah & evolusi YOLO: dari revolusi single-shot YOLOv1 tahun 2016, perang versi v4/v5, dominasi ekosistem Ultralytics, hingga lanskap 2026 dengan YOLO26 dan kompetitor baru seperti RF-DETR. Memahami evolusi ini membuat kalian paham mengapa arsitektur modern dirancang seperti sekarang. Sampai jumpa!