最近做图像分类,数据集的整理真的好费时间,找到一个代码,非常好使,推荐给大家。

实现的功能是,将一个文件夹下的每个子文件夹的一半数据分割出来并保存,生成相应的train.txt,test.txt。

自己弄数据集,真是非一般的体验呀。虽然说这样算是正在意义上经历一个完整的项目,被迫学习了很多数据处理的问题。但是搞数据真是太蛋疼了。

想了很多方法,但最后发现其实自己整理的数据,最合理的分配训练集和测试集的方法。就是先把数据全部整到一起,然后按一定比例从中随机选出训练集和测试集(这两个肯定是不能重复的),比如这里的25%作为测试集,75%作为训练集。

编写这个程序一开始,主要是有些函数不知道怎么用。编这程序是发现了即使是matlab编写程序都要用disp输出一些信息,这样更方便查看程序运行进度。其余就是新学习了一些函数,再把之前编写的程序合起来。

clear;close all;clc;

%%

%程序实现的功能

%1、把指定路径的数据(已按类别放置在不同的文件夹中),随机的把其中的75%的划分为训练集,25%划分为测试集

%2、训练集按类别放在指定路径的train文件夹中,测试集按类别放在指定路径的val文件夹中

%3、在train和val文件夹的同级文件夹按照caffe需求生成对应的train.txt和val.txt的label

%%

%程序中用到的之前不清楚的函数如下

%1)disp:用来在界面上显示一些必要的信息,方便查看程序进度。disp(' ')可以起到在界面上换行显示的作用

%2)str2double:带起之前一直使用的str2num,matlab的提示是这样函数效率更高。而且这两个函数输出的数据类型都是double类型。

%3)randperm(n):生成一个1到n直接的随机数列

%4)copyfile(a,b):把文件a复制到路径b,路径b带有最后的\符号

%

%

%

%%

disp('程序开始执行');

%%%%%%需要更改的参数(即两个路径)%%%%%%%%%%%%%%%%%%%%%%%%%%

pathSource='G:\遥感数据库\1\AID';%AID文件夹下有30个文件夹

pathDestination='G:\遥感数据库\deal';%保存分割后数据集以及train.txt和test.txt

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%在目标路径创建train、val文件夹

pathCreDirTrain=[pathDestination,'\','train','\'];

mkdir(pathCreDirTrain);

pathCreDirVal=[pathDestination,'\','val','\'];

mkdir(pathCreDirVal);

%读取文件夹列表,这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个)

dirSourceList=dir(pathSource);

countSourceList=length(dirSourceList);%文件夹个数

%拷贝数据到目标路径

for numDirList=3:countSourceList

%if(length(dirSourceList(numDirList).name)>=2)%根据这个过滤掉在此文件夹可能的train.txt、val.txt、count.txt文件

%continue;

%end

fileName=dir([pathSource,'\',dirSourceList(numDirList).name]);%读取子文件夹中的图片

%统计子文件夹中的文件个数

fileSum=length(fileName);

fileNum=fileSum-2;%为了生成对应于读取的从3开始的文件,只能先减去2,然后生成随机数后加上2

disp(' ');%加入一个空格,作为在界面显示中一个类似于换行的工具

%在程序中增加一些输出信息,方便查看数据内容

disp(['原始数据子文件夹',num2str(dirSourceList(numDirList).name),'中有图片:',num2str(fileNum)]);

%由于matlab读取文件的规则,在文件列表中肯定最前面会有.和..这两个文件

%所以想到先生成fileSum-2范围内的随机数,然后再各项加2,就为真正要找的随机数

numFileList=randperm(fileNum);

numFileList=numFileList+2;

partitionPosition=round(fileNum/2);%这是通过四舍五入确定的分割位置。这是划分数据的比例,2是按一半划分,如果是4的话,'先拷贝val(前25%)后拷贝train(后75%)'

%在程序中增加一些输出信息,方便查看数据内容

% disp(['先拷贝val(前25%)后拷贝train(后75%)']);

%%

%拷贝测试集数据val

%在程序中增加一些输出信息,方便查看程序执行进度

disp(['在val文件夹下创建子文件夹',num2str(dirSourceList(numDirList).name)]);

disp(['拷贝',num2str(partitionPosition),'张图片到val文件夹下子文件夹',num2str(dirSourceList(numDirList).name),'中']);

%不知道这种拷贝东西到别的地方,是先拷贝数据量比较多的部分,还是数据量比较少的部分,这有什么讲究。

%在目标val文件夹中,创建对应的子文件夹

pathCreValDir=[pathCreDirVal,dirSourceList(numDirList).name,'\'];

mkdir(pathCreValDir);

%在程序中增加一些输出信息,方便查看程序执行进度

disp(['复制测试数据到val子文件夹',num2str(dirSourceList(numDirList).name),'中']);

%复制图片到指定路径

for picNum=1:partitionPosition%由于是要读取numFileList中生成的随机数据,所以从1开始

copyfile([pathSource,'\',dirSourceList(numDirList).name,'\',fileName(numFileList(picNum)).name], ...

pathCreValDir);

end

%%

%拷贝训练集数据train

%在程序中增加一些输出信息,方便查看程序执行进度

disp(['在train文件夹下创建子文件夹',num2str(dirSourceList(numDirList).name)]);

disp(['拷贝',num2str(fileNum-partitionPosition),'张图片到train文件夹下子文件夹',num2str(dirSourceList(numDirList).name),'中']);

%在目标train文件夹中,创建对应的子文件夹

pathCreTrainDir=[pathCreDirTrain,dirSourceList(numDirList).name,'\'];

mkdir(pathCreTrainDir);

%在程序中增加一些输出信息,方便查看程序执行进度

disp(['复制训练数据到Train子文件夹',num2str(dirSourceList(numDirList).name),'中']);

%复制图片到指定路径

for picNum=partitionPosition+1:fileNum%由于是要读取numFileList中生成的随机数据,所以从1开始

copyfile([pathSource,'\',dirSourceList(numDirList).name,'\',fileName(numFileList(picNum)).name], ...

pathCreTrainDir);

end

end

disp('数据拷贝完毕');

%%

%生成label

disp('开始生成label');

%考虑到最好写个程序,能够一步完整所有操作。所以在这程序下面加上生成label的功能

%在上面的程序中,已经有变量pathCreDirTrain(目标Train的路径)、pathCreDirVal(目标Val的路径)

%先生成train文件夹中的label

disp('开始生成trainlabel');

dirTrainList=dir(pathCreDirTrain);%读取文件夹列表,这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个)

countTrainList=length(dirTrainList);%文件夹个数

fid = fopen([pathDestination,'\','train.txt'], 'w');%打开train文件夹时,对应的文本文件

for numList=3:countTrainList%文件夹从3开始

if(length(dirTrainList(numList).name)>=2)%根据这个过滤掉在此文件夹可能的train.txt文件

continue;

end

fileName=dir([pathCreDirTrain,'\',dirTrainList(numList).name]);%读取子文件夹

fileSum=length(fileName);%统计子文件夹中的文件个数

for fileNum=3:fileSum%文件从3开始

fprintf(fid,'%s', [dirTrainList(numList).name,'/',fileName(fileNum).name]);%输入:子文件/图片名称

fprintf(fid,'%s', ' ');%空格间隔符

fprintf(fid,'%d', str2double(dirTrainList(numList).name));%加入label,即文件夹名称

fprintf(fid,'\n');%换行

end

end

fclose(fid);%关闭文本文件

fclose('all');%关闭所有连接,防止没关掉的情况

disp('trainlabel生成完毕');

%在上面的程序中,已经有变量pathCreDirTrain(目标Train的路径)、pathCreDirVal(目标Val的路径)

%先生成train文件夹中的label

disp('开始生成vallabel');

dirValList=dir(pathCreDirVal);%读取文件夹列表,这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个)

countValList=length(dirValList);%文件夹个数

fid = fopen([pathDestination,'\','val.txt'], 'w');%打开train文件夹时,对应的文本文件

for numList=3:countValList%文件夹从3开始

if(length(dirValList(numList).name)>=2)%根据这个过滤掉在此文件夹可能的train.txt文件

continue;

end

fileName=dir([pathCreDirVal,'\',dirValList(numList).name]);%读取子文件夹

fileSum=length(fileName);%统计子文件夹中的文件个数

for fileNum=3:fileSum%文件从3开始

fprintf(fid,'%s', [dirValList(numList).name,'/',fileName(fileNum).name]);%输入:子文件/图片名称

fprintf(fid,'%s', ' ');%空格间隔符

fprintf(fid,'%d', str2double(dirValList(numList).name));%加入label,即文件夹名称

fprintf(fid,'\n');%换行

end

end

fclose(fid);%关闭文本文件

fclose('all');%关闭所有连接,防止没关掉的情况

disp('vallabel生成完毕');

matlab划分训练集验证和测试集代码_数据集划分为训练集和测试集并生成标签--matlab代码...相关推荐

  1. python代码测试工具模块_详解Python中的测试工具

    当我们在写程序的时候,我们需要通过测试来验证程序是否出错或者存在问题,但是,编写大量的测试来确保程序的每个细节都没问题会显得很繁琐.在Python中,我们可以借助一些标准模块来帮助我们自动完成测试过程 ...

  2. 不确定规划及应用代码_性能测试划分之应用领域

    性能测试划分 性能测试划分有很多种,测试方法也有很多种,更确切的说是由于测试方法的不同决定了测试划分的情况,但在测试过程中性能测试的划分没有绝对的界限,常用的有压力测试.负载测试和并发用户测试等. 性 ...

  3. matlab利用conv函数验证卷积和的交换律_分配律和结合律,卷积和的代数运算服从交换律和分配律,但不服从结合律。...

    卷积和的代数运算服从交换律和分配律,但不服从结合律. 更多相关问题 高处作业人员在机械运行.物料传接.工具存放过程中,必须确保安全,防止()事故的发生. 正常机体蛋白质需要量为().每天机体合成的蛋白 ...

  4. matlab利用conv函数验证卷积和的交换律_分配律和结合律,【判断题】卷积运算满足三个基本代数运算规律:交换律、结合律和分配律。...

    "2P+PE"表示三孔插座,一孔接相线,一孔接工作零线,一孔接地,也就是接保护零线. 缺乏VitC有哪些症状? 贸易收支应记入国际收支平衡表的() 信用工具是在货币执行()职能基础 ...

  5. 开发环境 测试环境 定义_如何快速搭建ES开发测试环境?

    前段时间,工作需要,自己搭了一个ES测试环境,我把整个部署的过程都做了笔记,在这里也做个归档,有需要的朋友也可以看看. 两大件简介 要安装一个标配的ELK环境,其实应该还有 Logstash,但是由于 ...

  6. oracle 测试sql执行时间_通过错误的SQL来测试推理SQL的解析过程

    这是学习笔记的第 1977 篇文章 如果抛出一个问题,你是如何理解MySQL解析器的,它和Oracle解析器有什么差别?相信大多数同学都会比较迷茫,因为这个问题很难验证,要不是看源码,要不就是查看书上 ...

  7. dijkstra算法matlab代码_头脑风暴优化(BSO)算法(附MATLAB代码)

    BSO讲解https://www.zhihu.com/video/1252605855767736320 B站搜索:随心390,同步观看视频 各位小伙伴可在闲鱼搜索 优化算法交流地,即可搜索到官方闲鱼 ...

  8. qr分解java代码_[转载]【原创】基于Givens变换QR分解Matlab代码

    如果有任何问题.建议,或者更多资源.代码.视频,欢迎您访问专业的Matlab技术交流平台--Matlab技术论坛http://www.matlabsky.com Wish my dear girl,h ...

  9. java测试不成功_为什么我的Java布尔测试总是失败?

    我正在尝试进行布尔测试,以便如果其中一个胎压低于35或超过45,则系统会输出"不良充气". 在我的课堂上,我必须使用布尔值,这是我尝试过的.但是,返回的布尔值始终为true.我不明 ...

  10. c++ 测试串口速率_纳米软件案例之电流控制测试系统

    项目背景 西安某机电研究所电流控制测试系统软件需要用记录仪设置采样速率对电流数据进行采集,并能够进行数据实时显示.保存.为更好的分析实验现象,需要历史测试数据可查询并显示.目前采用的传统的手动测试,测 ...

最新文章

  1. 1.4 微生物对人类社会的影响
  2. stop words list
  3. mybatis使用Mapper时对参数处理的设计与实现
  4. Android App截包工具
  5. SAP Spartacus里的HTTPErrorInterceptor的设计原理
  6. 【Python】Conda的安装
  7. JavaOne 2015 –又一年,又向前迈进了一步
  8. 论文浅尝 | 利用开放域触发器知识改进事件检测
  9. 向量叉乘判断两向量之间是顺时针还是逆时针
  10. 在eclipse里如何快速定位到某一行?
  11. Mysql错误1366的解决办法:Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1
  12. Mybatis: 接口编程的实现
  13. 冯永昌:云计算与大数据时代的量化投资
  14. 关于苹果审核团队内部消息以及一些过审小方法
  15. PHP对接抖音开发平台接口
  16. 通过tcpdump+wireshark来抓包分析TCP长连接和短连接的区别
  17. 服务器系统补丁失败,Windows Server 2016安装累积更新补丁失败
  18. VB编程:UCase转大写,LCase转小写-4
  19. 光量子计算机的信息载体,如何使“孤傲”的光子改变彼此的量子态?
  20. angularjs指令中的compile与link函数详解

热门文章

  1. 学习笔记(5):2020华为HCIA/HCNA/数通/路由交换/实验/视频/教程/持续更新赠题库-HCIA数通IP地址编址及报头详解
  2. dependency报错
  3. 最新版ins安装包下载
  4. 查看tomcat目前用的jdk版本
  5. visio2016 两线相交去圆弧
  6. 敏捷项目管理之计划扑克游戏
  7. Photoshop英汉对照表
  8. ASCLL码表完整版
  9. 匹配区县代码_全国区县代码1
  10. App测试如何进行?手机app测试要点