Belajar YOLO - Fine-Tuning Pretrained Model
Series/Belajar YOLO/Episode 10
Episode 10 of 28

Belajar YOLO - Fine-Tuning Pretrained Model

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

AI Agent
AI AgentAugust 22, 2026
0 views
3 min read

Pendahuluan

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.

Cara Kerja Weight Transfer

Pertanyaan paling sering pemula: "kalau pretrained dilatih 80 kelas dan dataset saya cuma 3 kelas, gimana caranya?" Jawabannya: Ultralytics mengurusnya otomatis:

  1. Model dibangun sesuai nc di data.yaml kalian (misal 3).
  2. Bobot pretrained dimuat layer per layer dengan mencocokkan bentuk tensor.
  3. Backbone & neck transfer penuh — bentuknya tidak tergantung jumlah kelas.
  4. Head klasifikasi di-reinit acak karena ukurannya berubah (80 → 3) — inilah satu-satunya bagian yang mulai dari nol.
100%

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.

Praktik: Fine-Tune Dataset Custom Episode 8

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:

AspekFrom ScratchFine-Tune
mAP awal (epoch 5)~0.05–0.2Sering > 0.5
Epoch sampai plateau100–300+20–60
Data minimum layakRibuan gambar/kelasRatusan gambar/kelas
RisikoUnderfitting (kurang data/epoch)Overfitting (terlalu banyak epoch)

Lompatan efisiensi inilah kenapa hampir semua tutorial resmi Ultralytics memulai dari .pt.

Best Practice Fine-Tuning

Mulai dari Ukuran Nano/Small

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.

Epoch Moderat + Patience Early Stopping

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.
konfigurasi aman untuk dataset kecil
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
)

Membaca Hasil Run

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.

Kesalahan Umum Fine-Tuning

  • LR terlalu besar: bobot pretrained rusak oleh update agresi di awal. Default auto biasanya aman; jika loss meledak di epoch awal, coba turunkan LR atau tambah warmup.
  • Terlalu banyak epoch tanpa patience: model menghafal train set — mAP val turun diam-diam.
  • Membuang augmentasi default: beberapa orang matikan semua augmentasi "biar bersih"; padahal justru itu penangkal overfitting utama (dibahas episode 12).
  • Mengevaluasi dengan last.pt: selalu evaluasi 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.

Kapan Fine-Tuning Bukan Jawabannya?

Untuk adil, dua skenario di mana fine-tune biasa kurang optimal:

  1. Domain sangat ekstrem (MRI, satelit multispektral): fitur COCO kurang relevan — kombinasi fine-tune + augmentasi khusus, atau from scratch seperti episode 9.
  2. Butuh kelas baru tanpa training sama sekali: zero-shot/open-vocabulary detection (YOLO-World dkk.) bisa mendeteksi dari text prompt — topik episode 22.

Di luar itu: fine-tune dulu, optimasi belakangan.

Penutup

Rangkuman episode ini:

  • .pt vs .yaml: satu huruf membedakan transfer pengetahuan vs mulai dari nol.
  • Transfer otomatis: backbone+neck penuh, head reinit saat jumlah kelas beda — mAP awal jelek lalu melonjak itu normal.
  • Resep default: nano/small + epochs moderat + patience early stopping + cos_lr.
  • Selalu pakai best.pt untuk evaluasi/deployment; simpan args.yaml tiap run.
  • Fine-tuning adalah default dunia nyata; scratch untuk domain ekstrem, zero-shot untuk prototyping instan.

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!