记录关于利用txt文件划分训练集、测试集与验证集

  • Post author:
  • Post category:其他




利用txt文件划分训练集、测试集与验证集

在基于深度学习的目标检测任务中,往往需要将数据图片划分成训练集、验证集与测试集,在此记录一种笨办法,各位大佬可忽略。


训练集:日常学习

验证集:模拟考试

测试集:期末考试

  • 第一步,先将原jpg数据图片与标签txt文件分别存放在一个文件夹内,如下图:

    在这里插入图片描述

    然后将以下代码编辑在一个py文件内,eg:data_class.py:
# 将一个文件夹下数据按比例分在三个文件夹下
import os
import random
import shutil
from shutil import copy2
datadir_normal = "/****/*****/****/****/JPEGImages/labels"#更换为自己的路径

all_data = os.listdir(datadir_normal)#(图片文件夹)
num_all_data = len(all_data)
print( "总数量: " + str(num_all_data) )
index_list = list(range(num_all_data))
print(index_list)

#生成随机种子,使得每一次划分的数据一样,如果没有要求,可以删除本段代码
r=random.random
random.seed(2021)
random.shuffle(index_list,random=r)
print(index_list)
#生成随机种子,使得每一次划分的数据一样,如果没有要求,可以删除本段代码

num = 0
trainDir = "/****/*****/****/****/JPEGImages/train/"#(将训练集放在这个文件夹下)
if not os.path.exists(trainDir):
    os.mkdir(trainDir)     
validDir = '/****/*****/****/****/JPEGImages/valid/'#(将验证集放在这个文件夹下)
if not os.path.exists(validDir):
    os.mkdir(validDir)        
testDir = '/****/*****/****/****/JPEGImages/test/'#(将测试集放在这个文件夹下)        
if not os.path.exists(testDir):
    os.mkdir(testDir)
        
for i in index_list:
    fileName = os.path.join(datadir_normal, all_data[i])
    if num < num_all_data*0.6: #Train:0.6
        print(str(fileName))
        copy2(fileName, trainDir)
    elif num>num_all_data*0.6 and num < num_all_data*0.8:#valid:0.2
        print(str(fileName))
        copy2(fileName, validDir)
    else:#test:0.2
        copy2(fileName, testDir)
    num += 1

运行后,将在JPEGImages文件夹下看到多了train、test、valid3个文件夹,如下图:

在这里插入图片描述

文件夹内容就是根据上边的程序划分的标签txt文件。

  • 第二步,提取刚刚生成的train、test、valid3个文件夹内的txt文件名称并分别存放在TRAIN、TEST、VALID3个txt文件中。
  • 提取命令:

  • find /*****/******/*****/****/JPEGImages/test -name "*.txt" > TEST.txt

  • find /*****/******/*****/****/JPEGImages/train -name "*.txt" > TRAIN.txt

  • find /*****/******/*****/****/JPEGImages/valid -name "*.txt" > VALID.txt


    三条命令运行结束以后可以看到多了三个txt文件,如下图:

    在这里插入图片描述

    打开文件,内容为:
/home/outsider/其他/1/JPEGImages/valid/20210110113149061.txt

需要使用文档的查找与替换功能将3个txt文档内的名称修改为如下格式:

20210110113149061

文档的查找与修改如下:

在这里插入图片描述

替换后效果如下:

在这里插入图片描述

  • 第三步,将以下代码编辑在一个py文件内,eg:copy_class.py:
from PIL import Image
im_num = []
for line in open("/***/****/***/VALID.txt", "r"):
    im_num.append(line)
    print(im_num)

for a in im_num:
    im_name = '/***/***/***/JPEGImages/images/{}'.format(a[:-1]) + '.jpg'  #原始路径
    print(im_name)
    im = Image.open(im_name)  # 打开指定路径下的图像

    tar_name = '/***/***/***/JPEGImages/valid/{}'.format(a[:-1]) + '.jpg'  #移动后的路径
    print(tar_name)
    im=im.convert('RGB')
    im.save(tar_name)  # 另存
    im.close()

每次运行后,需要将文件名修改下,修改为相对应的txt文档,程序运行结束后,将在train、test、valid3个文件夹内看到程序已经将标签txt对应的图片复制过来了。

到此,数据集就已经划分好了,也可以根据图片名称将对应的txt文件复制到相应的文件夹内,方法比较老实,大佬们就不用看啦。

最后,我将两个py文件放在下方。



版权声明:本文为outsider2019原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。