-
Notifications
You must be signed in to change notification settings - Fork 16
/
split_trainval.py
50 lines (44 loc) · 1.65 KB
/
split_trainval.py
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
import argparse
import glob
import os
import random
import mmengine
def main():
folder = '/path_to_data/NWPU-RESISC45'
save_folder = 'datainfo/NWPU'
mmengine.mkdir_or_exist(save_folder)
split_trainval_ratio = 0.7
# split_trainval_ratio = 0.5
select_n_classes = 1000
# get the subfolder list
subfolders = glob.glob(folder + '/*')
subfolders = [f for f in subfolders if os.path.isdir(f)]
# select n classes
random.shuffle(subfolders)
subfolders = subfolders[:select_n_classes]
cls_names = [os.path.basename(f) for f in subfolders]
train_split = []
val_split = []
for i, f in enumerate(subfolders):
img_files = glob.glob(f + '/*.jpg')
img_files = [os.path.basename(os.path.dirname(file_img)) + '/' + os.path.basename(file_img) for file_img in img_files]
# shuffle the image file list
random.shuffle(img_files)
# split the train and val
split = int(len(img_files) * split_trainval_ratio)
train_files = img_files[:split]
val_files = img_files[split:]
train_split.extend(train_files)
val_split.extend(val_files)
# save the train and val list to file
with open(save_folder + '/train.txt', 'w') as f:
f.write('\n'.join(train_split))
with open(save_folder + '/val.txt', 'w') as f:
f.write('\n'.join(val_split))
with open(save_folder + '/cls_names.txt', 'w') as f:
f.write('\n'.join(cls_names))
print(f'train: {len(train_split)}, val: {len(val_split)}')
# print the class names with \" and \"
print(', '.join([f'\"{cls_name}\"' for cls_name in cls_names]))
if __name__ == '__main__':
main()