好的工具可以让工作完成的事半功倍,非常完美。
1、通过代码把各种把已经分好类别的按比例划分未训练集、测试集:
# ratio是测试集的比例
def split_train_test(path,ratio):
#列出当前文件从夹下的所有文件名称,包括文件跟文件夹
dirs = os.listdir(path)
train_path = os.path.join(path, 'train')
test_path = os.path.join(path, 'val')
if not os.path.isdir(train_path):
#已存在的目录新建会报错
os.mkdir(train_path)
if not os.path.isdir(test_path):
os.mkdir(test_path)
for dir in dirs:
train_dir = os.path.join(train_path,dir)
test_dir = os.path.join(test_path,dir)
os.mkdir(train_dir)
os.mkdir(test_dir)
files = os.listdir(os.path.join(path,dir))
np.random.shuffle(files)
test_num = int(len(files)*ratio)
test_files = files[:test_num]
train_files = files[test_num:]
# 使用copy比copyfile更好。copyfile的原参数是必须未文件全路径,而copy里面也是copyfile,其src可以是路径,
# 其文件名会自动添加。
for file in test_files:
# shutil.copyfile(os.path.join(path,dir,file),os.path.join(test_dir,file))
shutil.copy(os.path.join(path,dir,file),os.path.join(test_dir,file))
for file in train_files:
# shutil.copyfile(os.path.join(path,dir,file),os.path.join(train_dir,file))
shutil.copy(os.path.join(path,dir,file),os.path.join(train_dir,file))
2、使用glob获取路径下的文件:
glob是可以获取指定路径下的所有文件,并返回文件名的路径,其作用跟os.walk()功能差不多。如下:
q其适合使用在使用深度进行数据粗分类的工作上,因为需要把分好类的图片拷贝shutil.copy()、裁剪shutil.move到另一个文件夹上时用。如果只想获取指定路径下的文件名,不想带有路径则可以使用os.walk()