首页 > 其他分享 >图像分类训练集与测试集划分

图像分类训练集与测试集划分

时间:2023-12-01 21:01:02浏览次数:29  
标签:img 训练 train split 测试 图像 test txt root

  图片数据集划分的方式与方法有很多,比如先将图片转换为矩阵,再使用scikit-learn包去划分。为了使得数据集更灵活,本文介绍python实现图片分类数据集的划分。

  假设现在的数据集文件夹为flower_images,flower_images文件夹中有5类,每个类1000张。

使用自己的python代码:

splitdata.py

import os
import numpy as np
import shutil
import time

def split_data(path=None, train_ratio=0.8, new_root=None, pic_split=True, seed=7):
    if path==None or os.path.exists(path)==False:
        raise Exception('数据集路径错误')
    else:
        #创建文件夹
        # 使用os.makedirs()函数递归创建文件夹
        os.makedirs(new_root)#如果没有这个目录,会递归创建
        os.makedirs(new_root+'\\'+'train')#创建train
        os.makedirs(new_root + '\\'+'test')#创建test
        print('文件夹创建成功,分别为',new_root+'\\train'+" "+new_root+'\\test')

    #构建所有文件名的列表,dir为label
    filename = []
    dirs = os.listdir(root)
    print(dirs)#['Lilly', 'Lotus', 'Orchid', 'Sunflower', 'Tulip']
    for index,dir in enumerate(dirs):
        dir_path = root + '\\' + dir
        names = os.listdir(dir_path)
        for name in names:
            filename.append(dir_path + '\\' + name + ' ' + str(index))
    # 设置随机种子
    np.random.seed(seed=seed)#如果随机种子相同,随机的结果也相同
    #打乱文件名列表
    np.random.shuffle(filename)
    #划分训练集、测试集,默认比例4:1
    train = filename[:int(len(filename)*train_ratio)]
    test = filename[int(len(filename)*train_ratio):]

    #分别写入train.txt, test.txt
    with open('train.txt', 'w') as f1, open('test.txt', 'w') as f2,open('train_split.txt','w') as f1_split,open('test_split.txt','w') as f2_split:
        for i in train:
            f1.write(i + '\n')#原始的路径
            i_split=i.split(' ')
            train_img_path=i_split[0]
            train_img_cls=i_split[1]
            train_img_name=train_img_path.split('\\')[-1]
            shutil.copy2(train_img_path, new_root+'\\'+'train'+'\\'+train_img_name)
            f1_split.write(new_root+'\\'+'train'+'\\'+train_img_name+' '+train_img_cls+'\n')
        for j in test:
            f2.write(j + '\n')#原始的路径
            j_split = j.split(' ')
            test_img_path = j_split[0]
            test_img_cls = j_split[1]
            test_img_name = test_img_path.split('\\')[-1]
            shutil.copy2(test_img_path, new_root + '\\' + 'test'+'\\'+test_img_name)
            f2_split.write(new_root+'\\'+'test'+'\\'+test_img_name+' '+test_img_cls+'\n')


if __name__ == '__main__':
    start=time.time()#开始时间

    root = r"D:\BaiduNetdiskDownload\flower_images"#绝对路径,自己的图片数据集路径
    train_ratio=0.8#训练集的占比,自己设定
    root_list=root.split('\\')
    print(root_list)#['D:', 'BaiduNetdiskDownload', 'flower_images']
    new_root=None
    new_root='\\'.join(root_list[:-1])+'\\'+root_list[-1]+"_split"
    print(new_root)#D:\BaiduNetdiskDownload\flower_images_split
    split_data(root, train_ratio,new_root=new_root)

    end=time.time()#结束时间
    print(end-start)# 输出的结果将是以秒为单位的时间间隔

   运行后如下图,自己电脑用时8秒多,多了test.txt、test_split.txt、train.txt、train_split.txt,为什么是四个呢,根据自己的需要选择train.txt、test.txt或者train_split.txt、test_split.txt。

除此之外,还生成了flower_images_split文件夹,里面是对数据分成了两个文件夹train与test。

  train和test里面是混合的各类图片。

至于 test.txt、test_split.txt、train.txt、train_split.txt这四个文件里面内容格式,这里也给出截图。

   可以看到,内容为路径空格数字表示的类别。所以最后,如果是用原来的图片文件夹flower_images就使用train.txt、test.txt。如果是使用生成的图片文件夹flower_images_split,就使用train_split.txt、test_split.txt。

   小结:关于数据集之前已经给出了,网上也可以下载。

 

  若存在不足或者错误之处,欢迎评论与指正!

标签:img,训练,train,split,测试,图像,test,txt,root
From: https://www.cnblogs.com/wancy/p/17868003.html

相关文章

  • 【ErikTse】2023-Codeforces新手训练营 第六期题解
    A.Wrath题目大意给你一个\(L\)数组和\(n\)个人,第\(i\)个人可以使用威力为\(L_i\)的闪电旋风劈击杀前面\(L_i\)人,问你最后能存活多少人?思路差分。开一个数组来标记当前威力的闪电旋风劈能击杀到的最远的人和使用技能的人,最远击杀的人所在的位置+1,自己的位置-1,这样算前缀和时所......
  • RGB转YCbCr——基于《基于MATLAB与FPGA的图像处理教程》
    YCbCr介绍YCbCr由Y、Cb、Cr组成。为一种数字信号1、Y:表示颜色的明亮度和浓度,也可叫灰度阶。(通过RGB转换YCBCR提取Y分量也可以得到灰度图像)2、Cb:表示颜色的蓝色浓度偏移量即RGB输入信号蓝色部分与RGB信号亮度值之间的差异。3、Cr:表示颜色的红色浓度偏移量即RGB输入信号红色部分......
  • 2、el-image设置error图像
    注意和2.0不同<el-table-columnlabel="人脸图像"align="center"prop="imageUrl"width="200px"><template#default="scope"><el-image:src=getImgUrl(scope.row.imageUrl)preview-telep......
  • 代码随想训练营第五十二天(Python)| 300.最长递增子序列、674. 最长连续递增序列、718.
    300.最长递增子序列classSolution:deflengthOfLIS(self,nums:List[int])->int:iflen(nums)<=1:returnlen(nums)#dp数组代表以nums[i]结尾的最长递增子序列长度为dp[i]dp=[1]*len(nums)res=1......
  • 软件测试/人工智能|Python函数与调用:解放编程力量的关键
    简介Python作为一门强大而灵活的编程语言,其函数机制为我们提供了一个重要的工具,使得代码更为模块化、可重用。在本文中,我们将深入探讨Python中函数的各个方面,包括什么是函数、内置函数、函数的定义和函数的调用,以及通过示例展示函数在实际编程中的应用。什么是函数?在Python中,......
  • Jmeter接口自动化测试 —— Jmeter下载安装及入门
    jmeter简介ApacheJMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。下载下载地址:ApacheJMeter-DownloadApacheJMeter安装由于Jmeter是基于Java的程序,所以我们要使用Jmeter就必须先安装Ja......
  • 【涨薪技术】0到1学会性能测试 —— LR录制回放&事务&检查点
    前言上一次推文我们分享了性能测试分类和应用领域,今天带大家学习性能测试工作原理、事务、检查点!后续文章都会系统分享干货,带大家从0到1学会性能测试,另外还有教程等同步资料,文末免费获取~01、LR工作原理​通常我们认为LoadRunner是由三部分组成:VuGen、Controller、AnalysisVu......
  • 代码随性训练营第五十一天(Python)| 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳
    309.最佳买卖股票时机含冷冻期classSolution:defmaxProfit(self,prices:List[int])->int:#dp[i][0]持有股票#dp[i][1]卖出股票那一天#dp[i][2]冷冻期#dp[i][3]保持卖出股票的状态dp=[[0]*4for_inrange(......
  • Jmeter 无法保存测试计划
    保存时cmd中的报错信息,如下2种:UncaughtExceptionjava.lang.IllegalAccessError:classcom.github.weisj.darklaf.ui.filechooser.DarkFilePaneUIBridge$DetailsTableModel(inunnamedmodule@0xd83da2e)cannotaccessclasssun.awt.shell.ShellFolder(inmodulejava.desk......
  • AOP-@Around环绕增强-理解问题-测试-记录
    来源自定义注解测试切面环绕时,接口测试返回空白。理解关键在于:环绕增强后走的是切面类中的方法,你不给返回值(习惯void)就是空白=-=。@Around它可以包围一个方法或函数的执行,并在执行前后提供额外的逻辑。使用@Around注解,你可以定义一个通知(advice),该通知在目标方法执行之前和......