www.pudn.com > Recogniztion_2.rar > Recognition.m


% 
% 文本文件sDataFile必须为以下格式: 
% Database D:\kk.h\study\人脸库\ORL\92x112\ 
% TrainSet 1 
% TestSet  2,3,4,5,6,7,8,9,10 
%  
% Database D:\kk.h\study\人脸库\ORL\92x112\ 
% TrainSet 1,2,3 
% TestSet  4,5,6,7,8,9,10 
%  
% Database D:\kk.h\study\人脸库\Yale\OriginRenamed\ 
% TrainSet 1 
% TestSet  2,3,4,5,6,7,8,9,10,11 
% ... 
% 即每三行为一次实验的数据,分别指定数据库路径,每个人训练样本序列和测试样本序列。所有人都参与训练和测试。 
% 该文件允许有空行,但路径文件名不能有空格。 
% 
% Author : kk.h 
% Date : 2004.5.2 
% Email : kkcocoon@163.com 
% SUN YAT-SEN UNIVERSITY  
% 
 
clear; 
clc; 
 
BTime = clock; 
 
% ----------------------------------------------------------------------------------------------------------- 
% 定义一些参数 
sDataFile = 'text\all.txt';         % 每一次循环实验的数据库序列以及相应的训练样本和测试样本 
sResultFile = 'text\all_LDA_C_M_Result.txt';   % 输出结果的文件 
Judge = 'LDA'; 
% ----------------------------------------------------------------------------------------------------------- 
% 读取数据文件,得到每一次循环实验的数据库序列以及相应的训练样本和测试样本 
pDataFile=fopen(sDataFile,'r'); 
 
% 循环读取sDataFile文件中所有的数据库序列。 
RepeatTimes = 1; 
while (~feof(pDataFile)) 
 
    sDatabase{RepeatTimes} = fscanf(pDataFile,'%s',1); 
 
    % 忽略文本文件中的空行 
     if (length(sDatabase{RepeatTimes})==0) 
         continue; 
     end 
     
    sTrainOrder{RepeatTimes} = fscanf(pDataFile,'%s',1); 
    sTestOrder{RepeatTimes} = fscanf(pDataFile,'%s',1); 
     
    RepeatTimes = RepeatTimes + 1; 
end; 
RepeatTimes = RepeatTimes - 1; 
fclose(pDataFile); 
 
% ----------------------------------------------------------------------------------------------------------- 
% 打开要写入的文件 
pResultFile = fopen(sResultFile,'w'); 
 
% 根据sDataFile的数据循环做实验,并把结果写入文本文件 
for i=1:RepeatTimes 
    % 读取训练样本 
    [TrainX,TrainClassRead,TrainImgSize,TrainReadTime] = ReadDB(sDatabase{i},sTrainOrder{i});  
     
    % 特征提取,求得变换矩阵TrainFace 
    [TrainFace,TrainProjectCoef,TrainClass,TrainTime]=FeatureExtract(TrainX,TrainClassRead,Judge,sDatabase{i},sTrainOrder{i}); 
 
    % 读取测试样本 
    [TestX,TestClass,TestImgSize,TestReadTime] = ReadDB(sDatabase{i},sTestOrder{i});  
 
    % 做变换,得到投影系数 
    TestProjectCoef = TrainFace'*TestX;   % 维数: (nxL)'*(nxN) = L x N 
 
    % 分类  
    [Success,ClassifyTime] = Classify(TrainProjectCoef,TrainClass,TestProjectCoef,TestClass); 
     
    % ----------------------------------------------------------- 
    % 输出结果 
    fprintf(pResultFile,'\r\n%s','------------------------------------------------------------'); 
    fprintf(pResultFile,'\r\n对数据库:%s',sDatabase{i}); 
    fprintf(pResultFile,'\r\n训练序列为:%s',sTrainOrder{i}); 
    fprintf(pResultFile,'\r\n测试序列为:%s',sTestOrder{i}); 
 
    fprintf(pResultFile,'\r\n训练时间:%.2f秒',TrainTime); 
    fprintf(pResultFile,'\r\n分类时间:%.2f秒',ClassifyTime); 
  
    fprintf(pResultFile,'\r\n\r\n训练样本数:%d',size(TrainX,2)); 
    fprintf(pResultFile,'\r\n变换矩阵保留的特征向量个数:%d',size(TrainProjectCoef,1)); 
    fprintf(pResultFile,'\r\n测试样本数:%d',size(TestX,2)); 
     
    %    fprintf(pResultFile,'\r\n识别成功率:%.2f%%\r\n\r\n',mean(Result(:,3))*100); 
    for k = 1:3 
        fprintf(pResultFile,'\r\n最近邻分类 %d 阶识别率:%.2f%%',k,mean(sum(Success(:,1:k),2))*100); 
    end; 
     
    Success1(i) = mean(Success(:,1))*100; 
end; 
 
fprintf(pResultFile,'\r\n%s\r\n','------------------------------------------------------------'); 
for (i=1:RepeatTimes) 
    fprintf(pResultFile,'%.2f%% ',Success1(i)); 
end 
fprintf(pResultFile,'\r\n%.2f%% ',mean(Success1)); 
 
% fprintf(pResultFile,'每个测试样本在特征脸上投影的系数和训练样本的投影系数的最近误差的平均误差:%.4f\r\n',mean(Result(:,2))); 
% fprintf(pResultFile,'最小误差:%.4f\r\n',min(Result(:,2))); 
% fprintf(pResultFile,'最大误差:%.4f\r\n',max(Result(:,2))); 
%  
% fprintf(pResultFile,'\r\n%s\r\n','以下数据格式为:'); 
% fprintf(pResultFile,'%s\r\n','测试样本人像编号 | 识别的训练样本人像编号 | 投影系数间的最近误差 | 是否识别成功'); 
%  
% for (i=1:TestCount) 
%     fprintf(pResultFile,'%3d | %3d | %6.4f | %d\r\n',TestClass(i),Result(i,1),Result(i,2),Result(i,3)); 
% end 
 
fclose(pResultFile); 
 
etime(clock,BTime)/60 
 
% 打开结果文本文件 
dos(sResultFile);