![](https://img.haomeiwen.com/i7691822/9d6472f037bd1757.png)
准备好图像样本和标注文件后,需对样本集进行划分,生成训练集、验证集和测试集
我的目录结构:
1、原数据所在目录
--data # 图片数据
——0.jpg
——1.jpg
--data_label # 图片数据对应的标签
——0.txt
——1.txt
2、分割后的目标数据
——floatRData
——images
——train
——val
——test
——labels
——train
——val
——test
将样本按 training : validation : testing = 8:1:1,实现在images和labels同级目录下创建文件夹train,val,test,将按比例生成的数据存放到相应的位置。
# conding:utf-8
import sys,os
import math
import random
import shutil
root_path = sys.path[0]
values_path = root_path+"/data"
values_list = os.listdir(values_path)
# 生成训练集、测试集、验证集,放文件的位置
target_path = 'floatRData/images'
target_label_path = 'floatRData/labels'
target_path_list = [target_path,target_label_path]
print(len(values_list))
print(values_list)
train_and_val = random.sample(values_list,int(math.floor(len(values_list)*0.9)))
print(f'训练集和验证集:{train_and_val}')
#train_and_val.sort()
train_list = random.sample(train_and_val,int(math.floor(len(train_and_val)*8/9)))
print(len(train_list))
print(f'训练集:{train_list}')
val_list = list(set(train_and_val).difference(set(train_list)))
print(len(val_list))
print(f'验证集:{val_list}')
test_list = list(set(values_list).difference(set(train_and_val)))
print(len(test_list))
print(f'测试集:{test_list}')
def create_set(input_list_name, folder_name):
# 创建相应的文件夹
for target_g_path in target_path_list:
folder_name_path = target_g_path + "/" + folder_name
if not os.path.exists(folder_name_path):
os.mkdir(folder_name_path)
# 将数据和标签数复制到指定的位置
for file in eval(input_list_name):
# 1.数据写入
# 数据源所在文件夹
source_path = root_path + "/data"
full_target_file_name = os.path.join(source_path, file) # 把文件的完整路径得到
# 写入到指定的文件
target_folder_path = os.path.join(target_path,folder_name)
shutil.copy(full_target_file_name, target_folder_path)
# 2.数据标签写入
source_path = root_path + "/data_label"
file = file.strip().split('.')[0] + '.txt'
full_target_file_name = os.path.join(source_path, file) # 把文件的完整路径得到
target_folder_path = os.path.join(target_label_path, folder_name)
shutil.copy(full_target_file_name, target_folder_path)
key_name = ['train', 'val', 'test']
for folder_name in key_name:
list_name = folder_name + "_list"
##txt_name = folder_name + ".txt"
create_set(list_name, folder_name)
- random.sample(list,n): 从list中随机截取n个元素,以list形式返回,不改变原有list;
- math.floor(x):返回x的向下取整值;
- set():创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等;
- set().difference(set):求差集;
- eval():执行一个字符串表达式,并返回表达式的值.
网友评论