| import shutil |
| import os |
| import random |
| import time |
| """ |
| given a folder with class as subfolders |
| split the data into train, val, test |
| for each class folder, take train, val, test ratio of images |
| """ |
|
|
|
|
| source_path = "dataset_balanced_augmented" |
| dest = "dataset_split" |
| if os.path.exists(dest): |
| shutil.rmtree(dest) |
| os.makedirs(dest, exist_ok=True) |
| dest_train_folder = os.path.join(dest, 'train') |
| dest_val_folder = os.path.join(dest, 'val') |
| dest_test_folder = os.path.join(dest, 'test') |
|
|
| train_ratio, val_ratio, test_ratio = 0.7, 0.2, 0.1 |
| for folder in [dest_train_folder, dest_val_folder, dest_test_folder]: |
| if os.path.exists(folder): |
| raise FileExistsError(f"folder {folder} already exists. Please remove the folder or rename") |
| else: |
| os.makedirs(folder) |
|
|
|
|
| for class_folder in os.listdir(source_path): |
| train_img_ls = [] |
| val_img_ls = [] |
| test_img_ls = [] |
| new_train_folder = os.path.join(dest_train_folder, class_folder) |
| new_val_folder = os.path.join(dest_val_folder, class_folder) |
| new_test_folder = os.path.join(dest_test_folder, class_folder) |
| for folder in [new_train_folder, new_val_folder, new_test_folder]: |
| if os.path.exists(folder): |
| raise FileExistsError(f"folder {folder} already exists. Please remove the folder or rename") |
| else: |
| os.makedirs(folder) |
|
|
| class_folder_path = os.path.join(source_path, class_folder) |
| total_num = len(os.listdir(class_folder_path)) |
| train_num, val_num, test_num = int(total_num*train_ratio), int(total_num*val_ratio), int(total_num*test_ratio) |
| print ('-------------------------------------') |
| print ('total num', total_num) |
| print ("train num", train_num) |
| print ("val num", val_num) |
| print ("test num", test_num) |
| |
| all_img_set = set([os.path.join(class_folder_path, imge_name) for imge_name in os.listdir(class_folder_path)]) |
| tmp = random.sample(all_img_set, int(train_num)) |
| train_img_ls.extend(tmp) |
| for i in tmp: |
| all_img_set.remove(i) |
| print ('total num after train', len(all_img_set)) |
| tmp = random.sample(all_img_set, int(val_num)) |
| val_img_ls.extend(tmp) |
| for i in tmp: |
| all_img_set.remove(i) |
| print ('total num after val or approximate test number', len(all_img_set)) |
| test_img_ls.extend(list(all_img_set)) |
| for i in train_img_ls: |
| shutil.copy(i, new_train_folder) |
| for i in val_img_ls: |
| shutil.copy(i, new_val_folder) |
| for i in test_img_ls: |
| shutil.copy(i, new_test_folder) |
| time.sleep(2) |
|
|