File size: 2,698 Bytes
a080b32 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# split_data.py
import os
import shutil
import random
import math
# --- KONFIGURASI ---
# 1. Ganti 'original_dataset' dengan nama folder tempat Anda mengekstrak data Kaggle
SOURCE_DIR = 'dataset'
# 2. Ini adalah folder tujuan tempat 'train' dan 'valid' akan dibuat
TARGET_DIR = 'data'
# 3. Rasio pembagian (0.8 berarti 80% untuk training)
TRAIN_RATIO = 0.8
# --- SCRIPT UTAMA ---
print(f"Memulai proses split data dari folder '{SOURCE_DIR}'...")
# Hapus folder target jika sudah ada untuk memulai dari awal
if os.path.exists(TARGET_DIR):
shutil.rmtree(TARGET_DIR)
# Buat struktur folder target (train dan valid)
train_path = os.path.join(TARGET_DIR, 'train')
valid_path = os.path.join(TARGET_DIR, 'valid')
os.makedirs(train_path, exist_ok=True)
os.makedirs(valid_path, exist_ok=True)
# Dapatkan daftar semua folder kelas di direktori sumber
try:
class_folders = [f for f in os.listdir(SOURCE_DIR) if os.path.isdir(os.path.join(SOURCE_DIR, f))]
if not class_folders:
raise FileNotFoundError
except FileNotFoundError:
print(f"!!! ERROR: Folder '{SOURCE_DIR}' tidak ditemukan atau kosong.")
print("Pastikan Anda sudah mengekstrak dataset Kaggle ke dalam folder tersebut.")
exit()
print(f"Ditemukan {len(class_folders)} kelas: {class_folders}")
# Loop melalui setiap folder kelas
for cls in class_folders:
source_class_path = os.path.join(SOURCE_DIR, cls)
# Buat subfolder kelas di dalam train dan valid
train_class_path = os.path.join(train_path, cls)
valid_class_path = os.path.join(valid_path, cls)
os.makedirs(train_class_path, exist_ok=True)
os.makedirs(valid_class_path, exist_ok=True)
# Dapatkan semua file gambar untuk kelas ini
images = [f for f in os.listdir(source_class_path) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
# Acak urutan gambar
random.shuffle(images)
# Hitung titik pembagian
split_point = math.floor(len(images) * TRAIN_RATIO)
# Bagi daftar gambar menjadi train dan valid
train_images = images[:split_point]
valid_images = images[split_point:]
print(f" Kelas '{cls}': {len(train_images)} train, {len(valid_images)} valid")
# Salin file-file ke folder tujuan
for img in train_images:
shutil.copy(os.path.join(source_class_path, img), os.path.join(train_class_path, img))
for img in valid_images:
shutil.copy(os.path.join(source_class_path, img), os.path.join(valid_class_path, img))
print("\n--- Proses split data selesai! ---")
print(f"Folder '{TARGET_DIR}' dengan struktur 'train' dan 'valid' telah berhasil dibuat.") |