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.")