Senjata dataset kecil: bagaimana mosaic, mixup, HSV, flip, dan scale bekerja on-the-fly di Ultralytics; kapan justru harus dikurangi (mosaic=0.5/0); naikkan imgsz untuk objek kecil; plus eksperimen mengukur dampak augmentasi ke mAP

Setelah evaluasi di episode 11 menunjukkan model yang belum memuaskan, senjata pertama yang harus kalian coba bukanlah hyperparameter — melainkan data augmentation.
Augmentasi adalah transformasi acak pada gambar training sehingga satu gambar terasa seperti puluhan variasi. Di YOLO, augmentasi sudah berjalan otomatis dengan default yang cukup pintar — tapi "otomatis" tidak berarti "optimal untuk kasusmu". Episode ini membongkar apa yang sebenarnya terjadi di balik layar, augmentasi mana yang menolong, mana yang justru menyiksa model, dan cara membuktikannya dengan eksperimen.
Ingat diagram training di episode 9: setiap batch melewati pipeline augmentasi sebelum masuk model. Tidak ada file baru disimpan — gambar asli tetap utuh di disk, transformasi lahir dan mati di memori tiap epoch.
Keuntungan desain ini: regularisasi tanpa biaya storage, dan kombinasi transformasi praktis tak terbatas — model tidak pernah melihat dua batch identik.
Transformasi paling aman dan paling sering bermanfaat:
| Parameter | Default | Efek | Kapan Disetel |
|---|---|---|---|
degrees | 0.0 | Rotasi ±derajat | Aerial/drone: 5–10; natural image biasanya 0 |
translate | 0.1 | Geser objek ±10% | Umumnya biarkan |
scale | 0.5 | Zoom in/out ±50% | Biarkan; objek multi-ukuran sangat diuntungkan |
shear | 0.0 | Distorsi miring | Jarang perlu |
fliplr / flipud | 0.5 / 0.0 | Flip horizontal/vertikal | fliplr hampir selalu aman; flipud hanya jika orientasi tak bermakna (satelit) |
Satu catatan krusial: semua transformasi geometri juga mentransformasi label box secara konsisten — box ikut digeser, di-scale, dan di-flip. Inilah kenapa augmentasi level-framework jauh lebih aman daripada augmentasi manual yang lupa memutar anotasinya (bug klasik dataset buatan sendiri).
hsv_h=0.015 # hue ±1.5% (geser rona)
hsv_s=0.7 # sat ±70% (intensitas warna)
hsv_v=0.4 # value ±40% (kecerahan)Simulasinya sederhana namun dampaknya besar: model belajar bahwa "helm kuning" tetap helm meski pencahayaan berubah dari pagi cerah sampai sore mendung. Untuk deployment outdoor, HSV adalah pertahanan utama dari perubahan cuaca/jam operasional. Untuk citra medis di mana warna = informasi klinis, kurangi drastis atau nol-kan.
Dua augmentasi komposit yang menjadi tanda tangan keluarga YOLO:
Empat gambar acak ditempel menjadi satu canvas, lalu dipotong sebagai input. Efeknya ganda: objek muncul dalam skala dan konteks beragam dalam satu gambar, plus ukuran batch efektif terasa lebih kaya. Mosaic adalah alasan utama YOLO kuat pada dataset kecil.
Dua gambar dicampur blend transparan beserta labelnya. Lebih agresif — berguna saat overfitting nyata, tapi bisa membuat konvergensi awal lambat. Default mixup=0.0 (nonaktif) itu bijak; aktifkan 0.1–0.3 hanya kalau bukti menunjukkan overfitting.
Mosaic punya efek samping: distribusi gambar hasil tempelan ≠ gambar asli di dunia nyata. Ultralytics mengaturnya elegan lewat parameter close_mosaic (default 10): 10 epoch terakhir mosaic dimatikan, sehingga model beradaptasi lagi dengan distribusi asli sebelum finalisasi. Jika kalian matikan fitur ini, sering mAP turun beberapa poin tanpa sadar penyebabnya.
Ironis tapi nyata: dataset sangat kecil bisa terluka oleh augmentasi terlalu kuat — gambar asli sudah langka, dan mosaic menjauhkannya makin jauh dari kondisi nyata:
model.train(
data="proyek-helm/data.yaml",
epochs=80,
mosaic=0.5, # default 1.0 → kurangi probabilitas
mixup=0.0,
degrees=0.0,
copy_paste=0.0,
)Pedoman praktis:
| Kondisi Dataset | Strategi |
|---|---|
| < 500 gambar/kelas | Mosaic 0.5–1.0, mixup 0, hindari rotasi |
| 500–5.000 | Default Ultralytics umumnya optimal |
| > 5.000 atau domain spesifik | Turunkan bertahap, biarkan close_mosaic bekerja |
Augmentasi tidak bisa menambal masalah fundamental: objek 20 piksel di gambar 640 piksel hanya tersisa beberapa piksel setelah downsampling backbone. Solusinya bukan augmentasi — melainkan imgsz:
yolo detect train model=yolo26s.pt data=data.yaml imgsz=1280 batch=-1Dua hal wajib ingat: (1) VRAM & waktu naik ~4× saat imgsz didobel — sesuaikan batch; (2) imgsz training dan inference harus konsisten — mismatch diam-diam merusak akurasi. Topik objek kecil lanjut sampai teknik SAHI & P2 head di episode 23.
Teori tanpa angka tidak berharga. Eksperimen A/B sederhana pada dataset episode 8:
from ultralytics import YOLO
configs = {
"default": dict(mosaic=1.0, hsv_v=0.4),
"ringan": dict(mosaic=0.3, hsv_v=0.2, scale=0.3),
"tanpa": dict(mosaic=0.0, hsv_h=0.0, hsv_s=0.0, hsv_v=0.0, fliplr=0.0),
}
for name, aug in configs.items():
print(f"\n=== RUN: {name} ===")
model = YOLO("yolo26n.pt")
model.train(data="proyek-helm/data.yaml", epochs=30, seed=42,
name=f"aug_{name}", patience=30, **aug)Setelah ketiganya selesai, bandingkan results.csv atau langsung val best.pt masing-masing:
for run in aug_default aug_ringan aug_tanpa; do
yolo val model="runs/detect/$run/weights/best.pt" data=proyek-helm/data.yaml name="val_$run"
donePola hasil yang biasanya muncul pada dataset kecil: tanpa overfit cepat (train loss rendah, val stagnan), default stabil, ringan kadang menang tipis. Angka pastinya milik dataset kalian — dan pengalaman membaca eksperimen beginilah yang membuat keputusan augmentasi berikutnya terasa instan.
Note
Satu variabel per eksperimen! Mengubah mosaic + mixup + HSV sekaligus lalu mAP naik tidak memberitahu kalian penyebabnya. Ilmu datanya sederhana: kontrol, ubah satu, ukur.
Rangkuman episode ini:
close_mosaic mengembalikan distribusi asli di epoch akhir — jangan dimatikan begitu saja.imgsz (training=inference), bukan augmentasi.Di episode 13 kita dalami transfer learning level lanjut: layer freezing — strategi freeze=10 vs freeze=23 vs full fine-tune, kapan masing-masing menang, dan teknik two-stage training untuk dataset terbatas. Sampai jumpa!