Jalur default dunia nyata: fine-tuning pretrained YOLO — cara weight transfer bekerja otomatis saat jumlah kelas berbeda, best practice epochs & patience early stopping, dan praktik fine-tune pada dataset custom

Episode 9 kita menempuh jalan panjang: training from scratch. Sekarang jalur yang akan kalian pakai di 95% project nyata — fine-tuning pretrained model.
Perbedaannya satu huruf, dampaknya raksasa: yolo26n.**yaml** (bobot acak) vs yolo26n.**pt** (bobot COCO). Dengan .pt, model sudah "tahu" apa itu tepi, tekstur, roda, wajah, dan ribuan konsep visual lain dari jutaan gambar COCO. Tugas kita tinggal mengarahkan pengetahuan itu ke domain baru. Konvergensi yang butuh ratusan epoch dari nol bisa selesai dalam belasan epoch.
Pertanyaan paling sering pemula: "kalau pretrained dilatih 80 kelas dan dataset saya cuma 3 kelas, gimana caranya?" Jawabannya: Ultralytics mengurusnya otomatis:
nc di data.yaml kalian (misal 3).Analogi: merekrut koki berpengalaman hotel bintang lima untuk warung mie ayam. Teknik dasarnya (memotong, mengontrol api, komposisi rasa — backbone) langsung terpakai. Yang perlu dipelajari ulang hanya menu spesifik warung ini (head).
Note
Karena head mulai acak, mAP validasi beberapa epoch pertama biasanya jelek lalu melonjak cepat. Jangan panik dan jangan buru-buru menghentikan run — itu perilaku normal transfer learning, bukan tanda gagal.
Satu-satunya perubahan dari skrip episode 9 adalah sumber bobot:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # .pt = mulai dari ilmu COCO
model.train(
data="proyek-helm/data.yaml",
epochs=50,
imgsz=640,
batch=-1,
patience=10,
)Jalankan keduanya (atau ingat-ingat hasil latihan episode 9) dan bandingkan:
| Aspek | From Scratch | Fine-Tune |
|---|---|---|
| mAP awal (epoch 5) | ~0.05–0.2 | Sering > 0.5 |
| Epoch sampai plateau | 100–300+ | 20–60 |
| Data minimum layak | Ribuan gambar/kelas | Ratusan gambar/kelas |
| Risiko | Underfitting (kurang data/epoch) | Overfitting (terlalu banyak epoch) |
Lompatan efisiensi inilah kenapa hampir semua tutorial resmi Ultralytics memulai dari .pt.
Kembali ke prinsip episode 7: dataset custom (ratusan–ribuan gambar) jarang sanggup memanfaatkan kapasitas model besar. yolo26n.pt atau yolo26s.pt + data bagus hampir selalu mengalahkan yolo26x.pt + data tipis. Scale-up hanya setelah metrik validasi stagnan.
Dua parameter yang bekerja berpasangan:
epochs=50..100 sebagai batas atas realistis untuk dataset kecil-menengah.patience=10..20: training berhenti otomatis jika mAP validasi tidak membaik sebanyak N epoch — pengaman anti-overfitting sekaligus penghemat waktu GPU.model.train(
data="proyek-helm/data.yaml",
epochs=80,
patience=15, # stop jika 15 epoch tanpa improvement
imgsz=640,
batch=-1,
cos_lr=True, # learning rate melengkung turun halus di akhir
)Struktur output sama persis dengan episode 9 (runs/detect/train/). Yang beda pola kurvanya: loss validasi naik lagi di akhir sambil train loss terus turun = tanda overfitting; kalau patience bekerja, run berhenti sebelum parah. Ambil selalu weights/best.pt — bukan last.pt.
best.pt; last.pt bisa jadi snapshot dari fase overfit.Tip
Simpan args.yaml dari tiap run (otomatis tersimpan di folder run). Saat eksperimen bertambah, file inilah yang menyelamatkan kalian dari pertanyaan "run kemarin pakai config apa?". Kebiasaan ini menjadi dasar experiment tracking di episode 17 dan 25.
Untuk adil, dua skenario di mana fine-tune biasa kurang optimal:
Di luar itu: fine-tune dulu, optimasi belakangan.
Rangkuman episode ini:
.pt vs .yaml: satu huruf membedakan transfer pengetahuan vs mulai dari nol.patience early stopping + cos_lr.best.pt untuk evaluasi/deployment; simpan args.yaml tiap run.Di episode 11 kita belajar menilai hasil kerja secara jujur: evaluasi model dengan mode val — membedah mAP50 vs mAP50-95, membaca confusion matrix dan PR curve, serta teknik menemukan kelas lemah yang menyeret performa keseluruhan. Sampai jumpa!