Pelatihan deteksi tidak berbeda cetakannya dari klasifikasi: mini-batch, zero_grad, backward, step. Yang baru adalah cara mengukur hasilnya — dua angka akurasi kelas dan IoU rata-rata harus dibaca bersama, lalu diperinci menjadi Average Precision per kelas. Bagian ini menjalankan keduanya: src/latih.py melatih dan menyimpan checkpoint, src/evaluasi.py memuatnya kembali lalu menghitung metrik mengikuti definisi chapter Metrik Object Detection .

Siklus Pelatihan dan Checkpoint #

Inti src/latih.py mengikuti pola baku dengan dua penyesuaian khas deteksi:

python src/latih.py — inti siklus latih
loader = DataLoader(
    TensorDataset(torch.tensor(X_latih),
                  torch.tensor(kelas_latih),
                  torch.tensor(normalisasi_target(kotak_latih))),
    batch_size=32, shuffle=True, num_workers=0,
    generator=torch.Generator().manual_seed(BENIH),
)

model = DetektorMini()
opt = torch.optim.Adam(model.parameters(), lr=3e-3)
for ep in range(1, EPOCH + 1):
    model.train()
    for Xb, kb, tb in loader:
        opt.zero_grad()
        logit, kotak_pred = model(Xb)
        loss, _, _ = loss_gabungan(logit, kotak_pred, kb, tb)
        loss.backward()
        opt.step()

Fungsi normalisasi_target membagi koordinat piksel dengan 32 sebelum masuk loss — target berada di rentang 0..1 yang sejalan dengan keluaran sigmoid kepala kotak, alih-alih nilai mentah 0..32 yang membuat MSE mudah jenuh. Generator DataLoader berbenih 7 menjaga urutan kocokan batch tetap sama antar eksekusi, melengkapi benih inisialisasi model. Setelah pelatihan selesai, simpan_checkpoint menulis state_dict ke /tmp/dl_deteksi_demo/model.pt (84.709 byte) — pola penyimpanan yang dibahas pada chapter Penyimpanan dan Pemuatan Model .

bash
python3 src/latih.py

Output yang Dihasilkan:

text
== konfigurasi latih ==
gambar latih      : 480 (benih 11)
gambar validasi   : 120 (benih 22)
epoch / batch     : 60 / 32
learning rate     : 3e-3 (Adam), lambda kotak 20
epoch  20: loss batch akhir 0.0057 | iou validasi 0.706
epoch  40: loss batch akhir 0.0052 | iou validasi 0.699
epoch  60: loss batch akhir 0.0023 | iou validasi 0.734

== hasil validasi ==
akurasi kelas     : 1.000
iou rata-rata     : 0.734
checkpoint        : /tmp/dl_deteksi_demo/model.pt (84709 byte)
muat ulang benar  : True

Loss batch akhir turun ke 0.0023 dan akurasi kelas mencapai 1.000 — klasifikasi tuntas. IoU validasi bergerak 0.706, 0.699, lalu 0.734; ia bukan garis menurun mulus karena koordinat kotak memang tugas regresi yang lebih peka terhadap pembulatan posisi.

Dua pengaturan pelatihan juga layak dibedah. Learning rate 3e-3 dipilih lebih tinggi daripada angka baku 1e-3 karena model (20231 parameter) dan dataset (480 gambar) sama-sama kecil — pembelajaran cepat tanpa risiko meleset jauh; ukuran model dan data selalu menjadi pertimbangan pemilihan learning rate sebagaimana dibahas pada chapter Learning Rate . Pencatatan tiap 20 epoch memberi tiga titik amatan yang cukup untuk melihat kecenderungan tanpa membanjiri terminal; perhatikan bahwa IoU sempat turun tipis dari 0.706 ke 0.699 sebelum naik ke 0.734 — fluktuasi kecil seperti ini normal pada regresi koordinat dan bukan tanda pelatihan gagal.

Evaluasi Per Kelas dan Average Precision #

Skrip src/evaluasi.py memuat checkpoint lalu menghitung tiga lapis metrik pada 120 gambar validasi. Sebuah deteksi dinyatakan true positive bila kelasnya benar dan IoU dengan ground truth mencapai ambang 0.5; deteksi lalu diurutkan menurut skor keyakinan, dan AP dihitung sebagai luas kurva precision-recall:

bash
python3 src/evaluasi.py

Output yang Dihasilkan:

text
== evaluasi pada 120 gambar validasi (benih 22) ==
ambang IoU untuk TP : 0.5

kelas    jumlah iou rata2 iou>=0.5 [email protected]
kecil        41     0.602    0.780  0.608
sedang       40     0.778    1.000  1.000
besar        39     0.829    1.000  1.000
mAP                                 0.869

iou rata-rata seluruh gambar : 0.734
akurasi kelas                : 1.000
deteksi skor tertinggi       : gambar 70, kelas kecil, skor 1.000, iou 0.424
deteksi iou terendah         : gambar 47, kelas asli kecil, iou 0.232

Tabel per kelas memperlihatkan pola yang sama dengan pratinjau Bagian 1: kelas besar dan sedang nyaris sempurna (AP 1.000), sedangkan kelas kecil tertinggal (AP 0.608, IoU rata-rata 0.602). Penyebabnya geometris, bukan kegagalan belajar. Geser satu piksel pada kotak 8x8 meninggalkan irisan 7x8 sehingga IoU masih 0.78; geseran sama pada kotak 4x4 hanya menyisakan irisan 3x4 sehingga IoU jatuh ke 0.60. Objek kecil menghukum kesalahan posisi lebih besar — temuan klasik dunia deteksi yang juga menjadi alasan detektor nyata memakai peta fitur beresolusi tinggi.

Baris “deteksi skor tertinggi” memberi pelajaran kedua: gambar 70 diprediksi dengan skor 1.000 namun IoU-nya hanya 0.424, jadi keyakinan model tidak sama dengan ketepatan kotak — dua hal yang diukur metrik berbeda dan perlu dilaporkan terpisah.

Model terlatih, metrik terbaca. Bagian terakhir memuat checkpoint dan menghadapkan model pada gambar yang sama sekali belum pernah dilihat.