感谢学姐的教学,本次的代码的目标是,手动制作好训练样本后,根据一定的比例,从训练样本中选出一部分数据作为验证样本,主要用到的库有os、random,以及shutil。os用来处理路径信息,shutil则用来根据路径以及random设置的比例对数据进行移动。
需要注意的是,训练集的创建需要按格式创建,即每种类别单独建立一个文件夹,然后所有类别的文件夹放于‘Train’文件夹下:
D:\Anaconda3\data\yangmiao_data为底层文件夹,验证集‘Val’无需事先创建,代码中会自动创建
Train文件夹中存放有各个类别的文件夹,文件夹命名则为标签值
图片数据的命名规则最好做到规范化
主要代码及注释如下:
1 导入库
import os
from os.path import join
# 用来对图片名进行随机提取
import random
# 用来移动图片
import shutil
2 定义移动数据的函数
函数的输入为底层文件夹名称;
以文件夹(图片标签)为单位进行循环,每次从一个文件夹(标签)中移动制定数量图片,并创建对应的验证文件夹;
用random.sample函数来选取移动的对象;
用shutil.move函数来移动选取的数据。
def image_move(imagedir):
train_dir = join(imagedir, 'Train')
train_labels = os.listdir(train_dir)
for train_label in train_labels:
print('正在处理的类型: {}'.format(train_label))
train_labelpath = join(train_dir, train_label)
# 获取单个类别的所有文件名
image_names = os.listdir(train_labelpath)
# 获取文件数量
train_numbers = len(image_names)
# 设置验证集与训练集的百分比,用int()是向下取整数,比如int(1.6)=1
val_numbers = int(train_numbers * 0.2)
# val_numbers计算出验证集中图片的数量
# 用random.sample进行随机提取,从训练集文件名提取指定数量的文件名存入验证集中,此处仅保存文件名
val_names = random.sample(image_names, val_numbers)
# 将验证集图片保存到对应的文件夹中,且文件夹名称为标签值
val_labelpath = join(imagedir, 'Val', train_label)
if not os.path.exists(val_labelpath):
os.makedirs(val_labelpath)
for val_name in val_names:
train_imagepath = join(train_labelpath, val_name)
val_imagepath = join(val_labelpath, val_name)
shutil.move(train_imagepath, val_imagepath)
print('验证集路径: {}, 验证集数量: {}'.format(val_labelpath, val_numbers))
return
3 函数运行
注意r的用法,用在路径前面,表示固定字符串,不会出现\t、\n等有歧义的情况
if __name__ == '__main__':
image_dir = r'D:\Anaconda3\data\yangmiao_data'
image_move(image_dir)