Tri-Netra-AI / src /split_dataset.py
anannyavyas1's picture
Upload folder using huggingface_hub (part 2)
3366f95 verified
Raw
History Blame Contribute Delete
2.64 kB
import argparse
import random
import shutil
import sys
from pathlib import Path
root = Path(__file__).resolve().parents[1]
sys.path.append(str(root))
def split_dataset(source_dir, output_dir, train_ratio=0.7, val_ratio=0.15, test_ratio=0.15, seed=123):
source_dir = Path(source_dir)
output_dir = Path(output_dir)
random.seed(seed)
if not source_dir.exists():
raise FileNotFoundError(f'Source directory not found: {source_dir}')
if abs(train_ratio + val_ratio + test_ratio - 1.0) > 1e-6:
raise ValueError('Train, validation, and test ratios must sum to 1.0.')
for subset in ['train', 'val', 'test']:
subset_dir = output_dir / subset
subset_dir.mkdir(parents=True, exist_ok=True)
for class_dir in sorted(source_dir.iterdir()):
if not class_dir.is_dir():
continue
class_name = class_dir.name
images = [p for p in class_dir.iterdir() if p.is_file()]
random.shuffle(images)
n = len(images)
train_end = int(n * train_ratio)
val_end = train_end + int(n * val_ratio)
splits = {
'train': images[:train_end],
'val': images[train_end:val_end],
'test': images[val_end:],
}
for split_name, files in splits.items():
target_dir = output_dir / split_name / class_name
target_dir.mkdir(parents=True, exist_ok=True)
for file_path in files:
shutil.copy2(file_path, target_dir / file_path.name)
print(f'Successfully split dataset from {source_dir} into {output_dir}')
print('Train/val/test ratios:', train_ratio, val_ratio, test_ratio)
def parse_args():
parser = argparse.ArgumentParser(description='Split raw image dataset into train/val/test folders')
parser.add_argument('--source', required=True, help='Source folder containing class subfolders')
parser.add_argument('--output', default='dataset', help='Output folder to create train/val/test splits')
parser.add_argument('--train_ratio', type=float, default=0.7)
parser.add_argument('--val_ratio', type=float, default=0.15)
parser.add_argument('--test_ratio', type=float, default=0.15)
parser.add_argument('--seed', type=int, default=123)
return parser.parse_args()
def main():
args = parse_args()
split_dataset(
args.source,
args.output,
train_ratio=args.train_ratio,
val_ratio=args.val_ratio,
test_ratio=args.test_ratio,
seed=args.seed,
)
if __name__ == '__main__':
main()