Matlab按视频分割数据为训练集测试集并生成label
发现按图片,随机抽取75%为训练集,25%为测试集。这样会造成同一个视频中可能相同位置的数据,即为训练集,又在测试集,那这样的数据虽然准确率比较高。但是没有价值,所哟想到了按视频分割数据为训练集和测试集。
这处理的数据是已经分割好的无冗余数据和冗余数据,然后测试数据,就是从无冗余数据中随机挑选出来的视频对应的图片。训练集中肯定有无冗余数据中挑选的75%视频对应的图片,而训练集中是否包含冗余数据,通过标识符,redundanceFlag来控制。
clear;close all;clc; %% %程序如何操作: %路径pathSimplify和pathRedundance分别为程序decreaseRedundantGray去冗余后的精简数据路径和冗余数据路径 %路径pathDestination为分类好的结果数据保存的路径 %% %下一步改进: % % %% %程序实现的功能 %1、把指定已经精简数据的路径(已按类别放置在不同的文件夹中),随机的把其中的75%的视频划分为训练集,25%划分为测试集 %2、精简数据的训练集按类别放在指定路径的train文件夹中,并把之前处理的冗余的数据添加到训练集train,精简数据测试集按类别放在指定路径的val文件夹中 %3、在train和val文件夹的同级文件夹按照caffe需求生成对应的train.txt和val.txt的label %% %程序中用到的之前不清楚的函数如下 %1) %2) %3) %4) % % % %% disp('程序开始执行'); tic; %%%%%%需要更改的参数(即两个路径)%%%%%%%%%%%%%%%%%%%%%%%%%% pathSimplify='C:\Users\Dy\Desktop\彩色视频真实数据\sjdr\decreaseRedundanceGrayAve2 0.16\simplify'; pathRedundance='C:\Users\Dy\Desktop\彩色视频真实数据\sjdr\decreaseRedundanceGrayAve2 0.16\redundance'; pathDestination='C:\Users\Dy\Desktop\彩色视频真实数据\sjfgsimple'; redundanceFlag=1; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %仿照程序decreaseRedundancy,先把简化后的数据读到到结构体fileInfoSimplify %把冗余的数据读取到结构体fileInfoRedundance dirList=dir(pathSimplify);%读取文件夹列表,这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个) countDir=length(dirList);%文件夹个数 for numDir=3:countDir%先读取数据文件夹pathSource下的子文件夹 if(length(dirList(numDir).name)>=2)%根据这个过滤掉在此文件夹可能存在的各种txt文件 continue; end fileList=dir([pathSimplify,'\',dirList(numDir).name]); countFile=length(fileList); for numFile=3:countFile%依次读取所有的文件名 %去除图片所属的视频序号 tempName=fileList(numFile).name; nameStart=strfind(tempName,'_'); nameEnd=strfind(tempName,'-'); tempVideoOrder=tempName(nameStart+1:nameEnd-1); %tempSize=size(tempPic);%读取的当前图片的size %要注意提取出来的子文件的名称再加1得到了结构体的数据信息,而numFile是从第3开始的,所以要减2 fileInfoSimplify(str2double(dirList(numDir).name)+1,numFile-2).name=tempName; fileInfoSimplify(str2double(dirList(numDir).name)+1,numFile-2).videonum=str2double(tempVideoOrder); end end disp(['读取简化后数据到结构体fileInfoSimplify中,共耗时: ',num2str(toc),' 秒']); if redundanceFlag %把冗余的数据读取到结构体fileInfoRedundance tic; dirList=dir(pathRedundance);%读取文件夹列表,这种方式读取会保留原文件.(在结构体中第一个)和上一层目录..(在结构体第二个) countDir=length(dirList);%文件夹个数 for numDir=3:countDir%先读取数据文件夹pathSource下的子文件夹 if(length(dirList(numDir).name)>=2)%根据这个过滤掉在此文件夹可能存在的各种txt文件 continue; end fileList=dir([pathRedundance,'\',dirList(numDir).name]); countFile=length(fileList); for numFile=3:countFile%依次读取所有的文件名 %去除图片所属的视频序号 tempName=fileList(numFile).name; nameStart=strfind(tempName,'_'); nameEnd=strfind(tempName,'-'); tempVideoOrder=tempName(nameStart+1:nameEnd-1); %tempSize=size(tempPic);%读取的当前图片的size %要注意提取出来的子文件的名称再加1得到了结构体的数据信息,而numFile是从第3开始的,所以要减2 fileInfoRedundance(str2double(dirList(numDir).name)+1,numFile-2).name=tempName; fileInfoRedundance(str2double(dirList(numDir).name)+1,numFile-2).videonum=str2double(tempVideoOrder); end end disp(['读取冗余数据到结构体fileInfoRedundance中,共耗时: ',num2str(toc),' 秒']); disp(' '); end tic; %从结构体fileInfoSimplify第一行,即子文件夹0中读取出视频列表 %根据读取的数据的特点,从子文件夹0中就可以读出所有的视频数 videoList(1)={0};%cell中第一项填充一个0方面后续的程序编写。 for numFile=1:size(fileInfoSimplify,2)%依次读取结构体第一行中的所有数据 %先进行判断,这是否为空,如果为空,那就不需要再进行判断了 if ~isempty(fileInfoSimplify(1,numFile).videonum) countVideo=length(videoList); for tempVideoNum=1:countVideo if videoList{tempVideoNum} == fileInfoSimplify(1,numFile).videonum continue; elseif tempVideoNum == countVideo %下面这种方式,对于cell的操作,每次videoList多生成一行 videoList=[videoList;fileInfoSimplify(1,numFile).videonum]; end end else break; end end videoList=videoList(2:end);%删除第一项,得到了要处理的视频序号 sumVideo=length(videoList);%统计得到video的总数量 numVideoList=randperm(sumVideo);%取到了随机分配的视频序号,对应于videoList中的视频 %先读取出所有的视频名称和视频总数,按75%和25%分别安排好训练集和测试集 %先读取pathSource文件夹下存在的子文件,保存子文件夹信息。方便后面处理。 %按照25%的测试集分割视频 partitionPosition=round(sumVideo/4);%这是通过四舍五入确定的分割位置。 disp(['共处理 ',num2str(sumVideo),' 个视频',' 在其中随机选取',num2str(partitionPosition), ... '个视频为测试集,','剩下的 ',num2str(sumVideo-partitionPosition),' 个视频为训练集']) disp(' '); disp('拷贝简化后的数据到测试集'); %在目标路径创建train、val文件夹 pathCreDirTrain=[pathDestination,'\','train','\']; mkdir(pathCreDirTrain); pathCreDirVal=[pathDestination,'\','val','\']; mkdir(pathCreDirVal); %先拷贝数据val并生成label %从结构体fileInfoSimplify中读取数据 fid = fopen([pathDestination,'\','val.txt'], 'w');%打开数据文件夹时,对应的文本文件 %直接先从结构体中找到对应的要拷贝的文件,这样应该更有效率 sumVal=0; for numDir=1:size(fileInfoSimplify,1)%找到对应的类别 %在val文件夹下面创建子文件夹 mkdir([pathCreDirVal,num2str(numDir-1),'\']); %找到随机分配视频的对应的图片,拷贝到文件夹val中 for numFile=1:size(fileInfoSimplify,2)%遍历所有类中的每一个图片 if ~isempty(fileInfoSimplify(numDir,numFile).videonum)%由于每个类中的数据量不一样,所以要先判断是否有数据 for i=1:partitionPosition if videoList{numVideoList(i)} == fileInfoSimplify(numDir,numFile).videonum sumVal=sumVal+1; copyfile([pathSimplify,'\',num2str(numDir-1),'\',fileInfoSimplify(numDir,numFile).name], ... [pathCreDirVal,num2str(numDir-1),'\',fileInfoSimplify(numDir,numFile).name]); fprintf(fid,'%s', [num2str(numDir-1),'/',fileInfoSimplify(numDir,numFile).name]);%输入:子文件/图片名称 fprintf(fid,'%s', ' ');%空格间隔符 fprintf(fid,'%d', (numDir-1));%加入label,即文件夹名称 fprintf(fid,'\n');%换行 break; end end else break; end end end fclose(fid);%关闭文本文件 fclose('all');%关闭所有连接,防止没关掉的情况 disp(['共选取 ',num2str(sumVal),' 个图片作为测试集']); disp(['拷贝简化后数据到测试集完毕,共耗时 ',num2str(toc),' 秒']); %拷贝简化和冗余数据集中剩余的视频图片到train文件夹中 tic; %分两步,先拷贝简化后数据中剩余视频到到train文件夹中 sumSimpleTrain=0; fid = fopen([pathDestination,'\','train.txt'], 'w');%打开数据文件夹时,对应的文本文件 for numDir=1:size(fileInfoSimplify,1)%找到对应的类别 %在Train文件夹下面创建子文件夹 mkdir([pathCreDirTrain,num2str(numDir-1),'\']); %找到随机分配视频的对应的图片,拷贝到文件夹Train中 for numFile=1:size(fileInfoSimplify,2)%遍历所有类中的每一个图片 if ~isempty(fileInfoSimplify(numDir,numFile).videonum)%由于每个类中的数据量不一样,所以要先判断是否有数据 for i=partitionPosition+1:sumVideo if videoList{numVideoList(i)} == fileInfoSimplify(numDir,numFile).videonum sumSimpleTrain=sumSimpleTrain+1; copyfile([pathSimplify,'\',num2str(numDir-1),'\',fileInfoSimplify(numDir,numFile).name], ... [pathCreDirTrain,num2str(numDir-1),'\',fileInfoSimplify(numDir,numFile).name]); fprintf(fid,'%s', [num2str(numDir-1),'/',fileInfoSimplify(numDir,numFile).name]);%输入:子文件/图片名称 fprintf(fid,'%s', ' ');%空格间隔符 fprintf(fid,'%d', (numDir-1));%加入label,即文件夹名称 fprintf(fid,'\n');%换行 break; end end else break; end end end disp(['从简化数据中选取了 ',num2str(sumSimpleTrain),' 个图片作为训练集']); disp(['拷贝简化后数据到训练集完毕,共耗时 ',num2str(toc),' 秒']); disp(['简化数据共有:',num2str(sumSimpleTrain+sumVal)]); disp(' '); sumRedundanceTrain=0; if redundanceFlag %拷贝冗余数据中挑选的数据到train文件夹下面作为训练集 tic; %分两步,先拷贝简化后数据中剩余视频到到train文件夹中 for numDir=1:size(fileInfoRedundance,1)%找到对应的类别 %找到随机分配视频的对应的图片,拷贝到文件夹Train中 for numFile=1:size(fileInfoRedundance,2)%遍历所有类中的每一个图片 if ~isempty(fileInfoRedundance(numDir,numFile).videonum)%由于每个类中的数据量不一样,所以要先判断是否有数据 for i=partitionPosition+1:sumVideo if videoList{numVideoList(i)} == fileInfoRedundance(numDir,numFile).videonum sumRedundanceTrain=sumRedundanceTrain+1; copyfile([pathRedundance,'\',num2str(numDir-1),'\',fileInfoRedundance(numDir,numFile).name], ... [pathCreDirTrain,num2str(numDir-1),'\',fileInfoRedundance(numDir,numFile).name]); fprintf(fid,'%s', [num2str(numDir-1),'/',fileInfoRedundance(numDir,numFile).name]);%输入:子文件/图片名称 fprintf(fid,'%s', ' ');%空格间隔符 fprintf(fid,'%d', (numDir-1));%加入label,即文件夹名称 fprintf(fid,'\n');%换行 break; end end else break; end end end fclose(fid);%关闭文本文件 fclose('all');%关闭所有连接,防止没关掉的情况 disp(['从冗余数据中选取了 ',num2str(sumRedundanceTrain),' 个图片作为训练集']); disp(['拷贝冗余后数据到训练集完毕,共耗时 ',num2str(toc),' 秒']); end disp(['训练集共有数据: ',num2str(sumRedundanceTrain+sumSimpleTrain)]); disp('程序执行完毕');

浙公网安备 33010602011771号