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('程序执行完毕');
View Code

 

posted @ 2015-07-28 11:44  菜鸡一枚  阅读(1327)  评论(0)    收藏  举报