Klasifikasi menjawab “apa yang ada di gambar”; deteksi objek menjawab satu pertanyaan lebih tajam: “di mana objek itu berada”. Proyek ini membangun sistem deteksi utuh — dataset berlabel bounding box, model CNN dua kepala yang memprediksi kelas sekaligus kotak, pelatihan dengan loss gabungan, evaluasi IoU dan Average Precision, sampai deteksi pada gambar yang belum pernah dilihat. Angka akhirnya konkret: akurasi kelas 1.000 dan IoU rata-rata 0.789 pada enam gambar uji baru.

Seluruh kode berjalan di CPU tanpa unduhan dataset: gambar 32x32 dibangkitkan sintetis dari benih tetap, sehingga 480 gambar latih, 120 gambar validasi, dan 60 gambar uji selalu identik antar eksekusi. Pelatihan 60 epoch selesai dalam hitungan detik.

Prasyarat #

Sebelum masuk ke pengerjaan, pastikan materi berikut sudah dikuasai:

Perilaku Akhir yang Dituju #

Program terdiri atas lima skrip di src/: data_deteksi.py membangkitkan gambar dan label sekaligus utilitas IoU, model.py mendefinisikan DetektorMini, latih.py melatih lalu menyimpan checkpoint ke /tmp/dl_deteksi_demo/model.pt, sedangkan evaluasi.py dan deteksi.py memuat checkpoint untuk menghitung metrik dan mendeteksi gambar baru. Setelah pelatihan selesai, sesi deteksi berjalan sebagai berikut:

bash
python3 src/latih.py
python3 src/deteksi.py

Output yang Dihasilkan (keluaran deteksi.py; keluaran lengkap latih.py dibahas pada Bagian 3):

text
== deteksi pada 6 gambar baru (benih 77) ==
no kelas asli prediksi    skor kotak prediksi         kotak asli         iou
 0 kecil      kecil      1.000 ( 22.6, 18.7, 3.7, 3.8)   (23,18, 4, 4) 0.574
 1 sedang     sedang     0.999 ( 10.2, 23.6, 6.0, 6.1)   (11,24, 6, 6) 0.689
 2 kecil      kecil      1.000 ( 17.4,  7.9, 4.2, 4.2)   (17, 8, 4, 4) 0.768
 3 besar      besar      1.000 ( 20.7, 10.1, 8.3, 8.2)   (21,10, 8, 8) 0.911
 4 besar      besar      1.000 (  9.3, 11.1, 8.2, 8.1)   ( 9,11, 8, 8) 0.872
 5 besar      besar      1.000 (  5.1,  2.8, 8.2, 8.2)   ( 5, 3, 8, 8) 0.922

iou rata-rata : 0.789
kelas benar   : 6/6

Model mengenali seluruh kelas dengan benar dan menempatkan kotak dengan IoU 0.574 sampai 0.922. Perhatikan pola pada kolom IoU: objek besar (8x8 piksel) mencapai 0.87-0.92, sedangkan objek kecil (4x4) berhenti di 0.574-0.768 — kesenjangan ini kita bedah penyebabnya pada Bagian 3 dan 4.

Struktur Berkas #

text
deteksi-objek-pada-gambar/
├── _index.md
├── bagian/                      # empat tahap pengerjaan
│   ├── menyiapkan-dataset-dan-label/
│   ├── memilih-model-deteksi/
│   ├── melatih-dan-mengevaluasi/
│   └── menjalankan-deteksi/
├── data/
│   └── generate_data.py         # bangkit ulang dataset dari benih
├── src/
│   ├── data_deteksi.py          # pembangkit gambar + utilitas IoU
│   ├── model.py                 # class DetektorMini + loss gabungan
│   ├── latih.py                 # pelatihan + checkpoint
│   ├── evaluasi.py              # IoU per kelas dan [email protected]
│   └── deteksi.py               # deteksi 6 gambar baru
└── tests/
    ├── test_data.py             # uji pembangkit dan label
    └── test_iou.py              # uji geometri IoU

Seluruh berkas pada src/, tests/, dan data/ dapat diunduh dari bagian Berkas Sumber di bawah halaman ini dan setiap bagian pengerjaan.

Tahapan Pengerjaan #

Proyek dikerjakan dalam empat bagian berurutan, dan setiap bagian menghasilkan kode yang benar-benar dapat dijalankan:

  1. Bagian 1 — Menyiapkan Dataset dan Label: membangkitkan gambar sintetis berlabel kelas dan bounding box.
  2. Bagian 2 — Memilih Model Deteksi: merancang CNN dua kepala dengan loss gabungan.
  3. Bagian 3 — Melatih dan Mengevaluasi: menjalankan pelatihan lalu membaca IoU dan Average Precision.
  4. Bagian 4 — Menjalankan Deteksi: memuat checkpoint dan mendeteksi gambar baru.

Mulailah dari Bagian 1 karena format label yang ditetapkan di sana menjadi kontrak yang dipegang model, loss, dan evaluasi hingga akhir proyek.