Dataset & Labeling
Panduan pengumpulan data, labeling, QA, dan split dataset untuk model vision RoboCup
Dataset & Labeling
Kualitas model vision sangat ditentukan data. Model bagus tidak akan stabil jika dataset sempit, label tidak konsisten, atau split bocor.
Taxonomy Kelas
Mulai dari label sederhana yang benar-benar dipakai di pertandingan:
| Class | Definisi | Catatan |
|---|---|---|
ball | Bola oranye yang terlihat sebagian/utuh | Tetap label saat partial occlusion |
goal | Tiang/area gawang yang relevan | Hindari label ambigu di background |
robot | Robot lawan/teammate | Tidak perlu bedakan tim di awal |
line | Garis putih lapangan | Opsional jika pakai semantic segm |
Definisi kelas harus ditulis sejak awal agar annotator berbeda tetap menghasilkan label yang konsisten.
Data Collection Protocol
Checklist minimal saat ambil data:
- Variasi jarak (dekat, sedang, jauh).
- Variasi angle kamera (tilt/pan berbeda).
- Variasi lighting (indoor terang, indoor redup, shadow).
- Variasi blur (robot diam vs walking).
- Variasi occlusion (bola tertutup sebagian).
Target awal yang realistis:
2,000-3,000images total untuk baseline YOLO.- Minimal
400+instance per kelas utama.
Labeling Rules (Bounding Box)
Aturan praktis:
- Bounding box mengikuti objek seketat mungkin.
- Objek < 30% terlihat tetap boleh dilabel jika masih identifiable.
- Jangan label objek yang benar-benar ambiguous.
- Konsisten antara annotator (gunakan guideline tertulis + contoh).
Contoh struktur dataset:
dataset/
├── images/
│ ├── train/
│ ├── val/
│ └── test/
└── labels/
├── train/
├── val/
└── test/dataset.yaml Example
Purpose: Menjelaskan struktur file konfigurasi dataset untuk training YOLO. Inputs: lokasi dataset dan daftar kelas. Outputs: file YAML yang dipakai saat training. Steps:
- Set
pathke root dataset. - Isi
train,val,testrelatif terhadappath. - Pastikan
ncsama dengan jumlahnames. Pitfalls:trainatauvalsalah path membuat training gagal. Validation: training membaca dataset tanpa warning kelas.
path: /data/robocup_vision_dataset
train: images/train
val: images/val
test: images/test
nc: 4
names: ["ball", "goal", "robot", "line"]Split Policy dan Leakage Prevention
Default split:
70%train20%val10%test
Rules:
- Jangan campur frame berurutan dari video yang sama ke train dan test.
- Pisahkan sesi perekaman berdasarkan waktu/lokasi jika memungkinkan.
- Simpan test set tetap (frozen) untuk komparasi eksperimen.
QA Checklist
Sebelum training:
- Tidak ada file gambar tanpa label (kecuali memang negative sample).
- Tidak ada label di luar image boundary.
- Tidak ada kelas typo (
bal,goals, dst). - Distribusi kelas tidak timpang ekstrem.
Distribusi cepat bisa dicek dengan skrip sederhana:
from collections import Counter
from pathlib import Path
counter = Counter()
for p in Path("dataset/labels/train").glob("*.txt"):
for line in p.read_text().splitlines():
cls = int(line.split()[0])
counter[cls] += 1
print(counter)Imbalance Mitigation
Jika kelas minor terlalu sedikit:
- Tambah data khusus kelas minor.
- Gunakan augmentation terarah (brightness, blur, scale).
- Oversample image yang berisi kelas minor.
Link ke Training
Setelah dataset rapi, lanjut ke training pipeline:
Acceptance Criteria
- Dataset policy tertulis dan dipahami tim.
- Label audit acak 100 sampel, error < 5%.
- Split train/val/test sudah fixed dan reproducible.