深度学习数据集

在进行深度学习的数据训练之前,总是要先进行 数据集的划分,将数据集划分为训练集、测试集和验证集,即分为train、test和val三个文件夹。

在网上看了一些数据集划分的代码,90%是用不了,很多都是只划分了图像文件,根本不划分相应的标注文件,于是自己写了一个简单的脚本,同时将图片和标注都对应划分好

准备工作

在进行数据集划分之前,首先先建立好相应的文件夹,分为train、test和val三个文件。每个文件夹中,又包含image图像文件夹和annotation标注文件夹。

我的做法是,将数据集所有的数据都放入train里的对应文件中,图片放入train目录下的image文件夹,标注放入train目录下的annotation文件夹,然后通过代码,将train中的文件移入test和val文件夹。

只需设置好相应的文件夹路径,即可完成数据集的划分

划分比例的问题

不同数据量的数据集要划分的比例不同,我选用的数据集样本比较少,我就按照6:2:2的比例去划分。其他人可以自己随便设定,如果不需要val,那么只需要将数据集划分为两部分,删除对应的val部分的代码就行。比例在程序中都可以自己调

代码

import os
import random
import shutil

def moveFile(train_img_Dir, train_mask_Dir):
        img_pathDir = os.listdir(train_img_Dir)                    # 提取图片的原始路径
        filenumber = len(img_pathDir)
        # 自定义test的数据比例
        test_rate = 0.2                                            # 如0.2,就是20%的意思
        test_picknumber = int(filenumber*test_rate)                # 按照test_rate比例从文件夹中取一定数量图片
        # 自定义val的数据比例
        val_rate = 0.2
        val_picknumber = int(filenumber*val_rate)                  # 按照val_rate比例从文件夹中取一定数量图片
        # 选取移动到test中的样本
        sample1 = random.sample(img_pathDir, test_picknumber)      # 随机选取picknumber数量的样本图片
        print(sample1)
        for i in range(0, len(sample1)):
            sample1[i] = sample1[i][:-4]                           # 去掉图片的拓展名,移动标注时需要这个列表
        for name in sample1:
            src_img_name1 = train_img_Dir + name
            dst_img_name1 = test_img_Dir + name
            shutil.move(src_img_name1 + '.png', dst_img_name1 + '.png')     # 加上图片的拓展名,移动图片
            src_mask_name1 = train_mask_Dir + name
            dst_mask_name1 = test_mask_Dir + name
            shutil.move(src_mask_name1 + '.txt', dst_mask_name1 + '.txt')   # 加上标注文件的拓展名,移动标注文件
        # 选取移动到val中的样本
        img_pathDir = os.listdir(train_img_Dir)                    # 这时图片目录里的文件数目会变
        sample2 = random.sample(img_pathDir, val_picknumber)       # 但是抽出来的数目,还是用之前算的
        print(sample2)
        for i in range(0, len(sample2)):
            sample2[i] = sample2[i][:-4]
        for name in sample2:
            src_img_name2 = train_img_Dir + name
            dst_img_name2 = val_img_Dir + name
            shutil.move(src_img_name2 + '.png', dst_img_name2 + '.png')
            src_mask_name2 = train_mask_Dir + name
            dst_mask_name2 = val_mask_Dir + name
            shutil.move(src_mask_name2 + '.txt', dst_mask_name2 + '.txt')
        return

if __name__ == '__main__':
    # train 从train中移动
    train_img_Dir = '/home/rtx2080ti/Tianzhi/Tianzhi_Ship/output/train/img/'
    train_mask_Dir = '/home/rtx2080ti/Tianzhi/Tianzhi_Ship/output/train/mask/'
    # test路径:图片和标注目录
    test_img_Dir = '/home/rtx2080ti/Tianzhi/Tianzhi_Ship/output/test/img/'
    test_mask_Dir = '/home/rtx2080ti/Tianzhi/Tianzhi_Ship/output/test/mask/'
    # val路径:图片和标注文目录
    val_img_Dir = '/home/rtx2080ti/Tianzhi/Tianzhi_Ship/output/val/img/'
    val_mask_Dir = '/home/rtx2080ti/Tianzhi/Tianzhi_Ship/output/val/mask/'
    # 运行划分数据集函数
    moveFile(train_img_Dir, train_mask_Dir)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐