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:
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
.
python3 src/latih.pyOutput yang Dihasilkan:
== 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 : TrueLoss 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:
python3 src/evaluasi.pyOutput yang Dihasilkan:
== 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.232Tabel 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.