在做深度学习或者其他学习需要的时候,要求我们将数据集划分为训练集和验证集,一般来说按照9:1,8:2的比例划分训练集和验证集都是可以的。
我们基于random.sample函数来实现对数据的划分。
假设我们数据摆放如下:
images里面存放的 是训练的图片,labels里面存放的是图片的标签信息,如TXT,xml等信息。
我们最终做成的结果如下:
在每一个文件夹里都存在一个train文件和val文件,val里存放的文件来源是从train里面随机抽取出来的。train与val里面的数据没有交集。
实现思路:
我的图片的命名是:XXX.jpg,标签的命名是:XXX.txt。
那么我们读取图片的名字XXX,存在一个列表里面。然后在这个列表里面用for循环,遍历,然后创建图片的标签的路径,如
# 要移动的图片的完整路径
path_img=os.path.join(input1,flie_name+'.jpg')
# 对应要移动图片的标签的完整路径
path_lab=os.path.join(input2,flie_name+'.txt')
然后使用移动函数将数据移动到val文件夹中:
# 移动图片到图片的新路径
shutil.move(path_img,save1)
# 移动对应的标签到标签的新路径
shutil.move(path_lab,save2)
在随机生成列表的过程中我们设置了随机种子,保证数据的可重复实现。
完整代码如下:
import os
import random
import shutil
def moveFile(input1,input2,save1,save2):
pathDir = os.listdir(input1) # 取图片的原始路径
random.seed(1)
filenumber = len(pathDir) # 原文件个数
rate = 0.1 # 抽取的验证集的比例,占总数据的多少
picknumber = int(filenumber * rate) # 按照rate比例从文件夹中取一定数量图片
sample = random.sample(pathDir, picknumber) # 随机选取需要数量的样本图片
print(sample)
list_len=len(sample)
print(list_len)
list=[]
for i in range(len(sample)):
list.append(sample[i].split('.')[0])
print(list)
for flie_name in list:
path_img=os.path.join(input1,flie_name+'.jpg')
shutil.move(path_img,save1)
path_lab=os.path.join(input2,flie_name+'.txt')
shutil.move(path_lab,save2)
if __name__ == '__main__':
input_path1='./train1200/images/train'
input_path2= './train1200/labels/train'
save_img='./train1200/images/val'
save_lab='./train1200/labels/val'
if not os.path.exists(save_lab):
os.makedirs(save_lab)
if not os.path.exists(save_img):
os.makedirs(save_img)
moveFile(input_path1,input_path2,save_img,save_lab)