人脸识别实验结论

1、关于MSE

      背景:看过文章《SRDA: An Efficient Algorithm for Large Scale Discriminant Analysis》之后呢,总感觉这个SRDA在使用ridge回归时,其方程公式22和MSE(minimum square error)算法非常相似,所以专门将SRDA与MSE进行了比较。

      先说说不同之处吧:SRDA中的投影向量 是利用LSQR一列一列来优化的, 而MSE呢,直接求解一个逆矩阵就可以了(X'*X+lambda*I)\X'*Y;(LSQR solves  Ax = b  or  min ||b - Ax||_2  if damp = 0,)

                               SRDA给每个特征都添加了1,MSE没有;

                               SRDA中的类标列数为c-1,而MSE的类标列数为c;

                               SRDA中的识别过程为 测试预测类标 与 训练预测类标之间的欧式距离,  而 MSE一般用测试预测类标 与 真实类标的欧式距离

                               MSE的类标一般为,[1,0,0,0,0,0,], 而SRDA的类标为由一个随机矩阵的QR分解求得!!!

     下面说说识别结果吧:

                               在用同样大小的lambda惩罚因子情况下,对于Isolet数据集,SRDA的识别率最好,其中SRDA_NCC_ridge: 10.88, SRDA_NN_ridge:10.88, SRDA_Laso(NN为10.49,NCC为10.84),

                                                                                                      而原始MSE为14.95,换成都是预测类标值后为11.23,而将类标换成SRDA方法生成的类标且用预测类标之间的距离度量时为11.03

    个人感觉,这个类标如SRDA这么定义没有必要,效果并不明显,不过可以试试吧!!!

    另外,值得说明的是,在求解 AX=B的问题上,LSQR和原始MSE的(X'*X+lambda*I)\X'*Y;结果基本上一样

    

norm(MSE_projection-eigvector,'fro')

ans =

   6.6695e-04

  这里,我们贴上我们测试过程中使用的主函数代码

      

% The main function of Cai deng
% http://www.cad.zju.edu.cn/home/dengcai/Data/ReproduceExp.html#SRDA
clc,clear;
clear all;
clear memory;
addpath('SLEP package');
addpath('data set');
%%----------- 这个主函数是专门调用论文中Isolet1等数据集而写 ----------%
fea_train = [];
gnd_train = [];
load Isolet1
fea_train = [fea_train;fea];
gnd_train = [gnd_train;gnd];
clear fea gnd
load Isolet2
fea_train = [fea_train;fea];
gnd_train = [gnd_train;gnd];
clear fea gnd
fea_test = [];
gnd_test = [];
load Isolet4
fea_test = [fea_test;fea];
gnd_test = [gnd_test;gnd];
clear fea gnd
load Isolet5
fea_test = [fea_test;fea];
gnd_test = [gnd_test;gnd];
clear fea gnd
sele_num = 20;                                            %  select training samples 
% % ***************** PCA降维 *********************
% options = [];
% options.PCARatio = 0.98;
% [~,~,~,new_data] = PCA(fea,options);
% fea = new_data;
% % ***********************************************

nnClass   = length(unique(gnd_train));                          % The number of classes;
num_Class = [];
for i = 1:nnClass
    num_Class = [num_Class length(find(gnd_train==i))];           % The number of samples of each class
end
 
Train_Ma  = [];
Train_Lab = [];
Test_Ma   = fea_test;
Test_Lab  = gnd_test;
for j = 1:nnClass
    idx     = find(gnd_train==j);   
%     randIdx = 1:num_Class(j);  % select the first sele_num training samples
    randIdx=randperm(num_Class(j));  % radomly select the sele_num training samples
%--------------------------------------------------------------------
    Train_Ma  = [Train_Ma; fea_train(idx(randIdx(1:sele_num)),:)];   % Random select select_num samples per class for training
    Train_Lab = [Train_Lab;gnd_train(idx(randIdx(1:sele_num)))];
end
Train_Ma = Train_Ma';
Train_Ma = Train_Ma./repmat(sqrt(sum(Train_Ma.^2)),[size(Train_Ma,1) 1]);
Test_Ma  = Test_Ma';
Test_Ma  = Test_Ma./repmat(sqrt(sum(Test_Ma.^2)),[size(Test_Ma,1) 1]);

%% ---------- Training SRDA with L2-regularization --------------%
tic;
options = []; 
options.ReguType = 'Ridge';
options.ReguAlpha = 1;        % 这个是L2 的约束项 ridge regression
model = SRDAtrain(Train_Ma',Train_Lab, options); 
TimeTrain = toc;
tic;
%-------------Use nearest center classifer ------ % 
accuracy = SRDApredict(Test_Ma', Test_Lab, model); 
TimeTest = toc;
disp(['SRDA,',num2str(sele_num),' Training, Errorrate: ',num2str((1-accuracy)*100),'  TrainTime: ',num2str(TimeTrain),'  TestTime: ',num2str(TimeTest)]); 
% -------- use NN to classify the samples -------------%
feaTrain = SRDAtest(Train_Ma', model);
feaTest  = SRDAtest(Test_Ma', model);
D = EuDist2(feaTest,feaTrain,0);
[dump,idx] = min(D,[],2);
predictlabel = Train_Lab(idx);
errorrate = (length(find(predictlabel-Test_Lab))/length(Test_Lab))*100;
disp(['SRDA,',num2str(sele_num),' Train, NN Errorrate: ',num2str(errorrate)]);

%% Training SRDA with L1-regularization (use LARs), (Sparse LDA)  
options = [];
options.ReguType = 'Lasso';
options.LASSOway = 'LARs';
options.ReguAlpha = 0.01;
options.LassoCardi = 50:10:200;
model_Lasso = SRDAtrain(Train_Ma',Train_Lab, options); 
%-------------Use nearest center classifer ------ % 
accuracy_Lasso = SRDApredict(Test_Ma', Test_Lab, model_Lasso); 
for i = 1:length(model_Lasso.LassoCardi)
%   disp(['Sparse SRDA,',num2str(sele_num),' Train, Cardi=',num2str(model_Lasso.LassoCardi(i)),' NC Errorrate: ',num2str((1-accuracy_Lasso(i))*100)]);
end
Lasso = min((1-accuracy_Lasso)*100);
% ----- Use nearest neighbor classifer ----- %
feaTrain = SRDAtest(Train_Ma', model_Lasso);
feaTest  = SRDAtest(Test_Ma', model_Lasso);
for i = 1:length(model_Lasso.LassoCardi)
    D = EuDist2(feaTest{i},feaTrain{i},0);
    [dump,idx] = min(D,[],2);
    predictlabel = Train_Lab(idx);
    errorrate(i) = (length(find(predictlabel-Test_Lab))/length(Test_Lab))*100;
%     disp(['Sparse SRDA,',num2str(sele_num),' Train, Cardi=',num2str(model_Lasso.LassoCardi(i)),' NN Errorrate: ',num2str(errorrate(i))]);
end
Lasso_NN = min(errorrate)
Lasso

% 因为感觉这个就跟MSE特别像 所以 试一下 MSE的识别率
addpath('G:\机器学习\代码和数据集\看论文编写代码\MSE');
lambda = 1;
[MSE_projection,Y_Class,Y] = MSE(Train_Ma',Train_Lab,lambda);
Predict_train = Train_Ma'*MSE_projection;
Predict_test = Test_Ma'*MSE_projection;
count = 0;
for i = 1:size(Test_Ma,2)
    temp = Predict_test(i,:);
    for j = 1:size(Y_Class,1)
        res(j) = norm(temp-Y_Class(j,:));
    end
    [rr,dd] = min(res);
    if dd == Test_Lab(i);
        count = count + 1;
    end
end
error_MSE = (1 - count/size(Test_Ma,2))*100
D = EuDist2(Predict_test,Predict_train,0);
[dump,idx] = min(D,[],2);
predictlabel_test = Train_Lab(idx);
errorrate_MSE = (length(find(predictlabel_test-Test_Lab))/length(Test_Lab))*100


% [MSE_projection2,Y2] = MSE_2(Train_Ma',Train_Lab,lambda);
% Train_Ma = [ones(1,size(Train_Ma,2));Train_Ma];
% Test_Ma = [ones(1,size(Test_Ma,2));Test_Ma];
% Predict_train2 = Train_Ma'*MSE_projection2;
% Predict_test2 = Test_Ma'*MSE_projection2;
% D = EuDist2(Predict_test2,Predict_train2,0);
% [dump,idx] = min(D,[],2);
% predictlabel_test2 = Train_Lab(idx);
% errorrate_MSE2 = (length(find(predictlabel_test2-Test_Lab))/length(Test_Lab))*100
%%  --- 调用LSQR 来 求解 这个 Ax=b的问题
options.ReguAlpha = 1;
[eigvector, istop] = lsqr2(Train_Ma',Y, options.ReguAlpha, 20);
Predict_train_LSQR = Train_Ma'*eigvector;
Predict_test_LSQR = Test_Ma'*eigvector;
D = EuDist2(Predict_test_LSQR,Predict_train_LSQR,0);
[dump,idx] = min(D,[],2);
predictlabel_test = Train_Lab(idx);
errorrate_MSE_LSQR = (length(find(predictlabel_test-Test_Lab))/length(Test_Lab))*100

  

 

转载于:https://www.cnblogs.com/Jerry-PR/articles/5289213.html

### 人脸识别实验报告示例 以下是一个关于人脸识别实验的示例模板,结合了耶鲁大学数据集的使用[^1]、PCA算法实现[^1]、概率人脸嵌入(PFEs)方法的应用[^2]以及人脸对齐技术[^3]的相关内容。 --- #### 实验背景 人脸识别是一项重要的计算机视觉任务,广泛应用于安全监控、身份验证等领域。本实验基于耶鲁大学的人脸数据集进行研究[^1],该数据集包含15个人的11种不同表情和姿态的图像,图像大小为320×243像素,总大小约为6M。实验旨在通过PCA算法实现人脸特征提取,并结合概率人脸嵌入(PFEs)方法提高识别性能[^2]。 --- #### 实验目标 1. 使用PCA算法对人脸图像进行降维处理。 2. 应用概率人脸嵌入(PFEs)方法改进人脸识别算法。 3. 比较传统方法与改进方法的性能差异。 --- #### 数据预处理 在实验中,首先需要对耶鲁大学数据集进行预处理,包括人脸检测与对齐。以下是基于Dlib库实现人脸对齐的代码示例[^3]: ```python import dlib from skimage import io # 加载Dlib的人脸检测器和关键点检测器 detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat') # 加载图片 img = io.imread('path_to_image') # 使用检测器获取人脸框 faces = detector(img) # 对每个检测到的人脸框使用预测器获取特征点 for face in faces: shape = predictor(img, face) # 对人脸进行仿射变换等对齐操作 aligned_face = align_face(img, shape) ``` --- #### PCA算法实现 PCA(主成分分析)是一种常用的降维技术,用于提取人脸图像的主要特征。以下是PCA算法的实现步骤: 1. 将所有图像转换为一维向量。 2. 计算图像向量的协方差矩阵。 3. 对协方差矩阵进行特征值分解,选取前k个最大的特征值对应的特征向量作为主成分。 4. 将原始图像投影到主成分空间,得到低维特征表示。 以下是PCA算法的Python实现示例: ```python from sklearn.decomposition import PCA # 假设X是人脸图像的矩阵形式,每行代表一张图像 pca = PCA(n_components=50) # 保留50个主成分 X_pca = pca.fit_transform(X) # 得到降维后的特征 ``` --- #### 概率人脸嵌入(PFEs)方法 为了进一步提高识别性能,实验引入了概率人脸嵌入(PFEs)方法[^2]。该方法将每个人脸图像表示为隐空间中的高斯分布,其中均值表示最可能的特征值,方差表示特征值的不确定性。通过利用不确定性信息,可以自然地推导出用于匹配和融合PFE的概率解。 以下是PFEs方法的核心思想: - 高斯分布的均值:表示人脸特征的中心位置。 - 高斯分布的方差:表示特征值的不确定性。 - 不确定性信息可用于风险控制识别系统,提升匹配精度。 --- #### 实验结果与分析 通过对耶鲁大学数据集实验测试,PCA算法能够有效提取人脸的主要特征,但其性能受限于线性假设。引入PFEs方法后,识别准确率显著提升,特别是在处理光照变化和姿态变化较大的图像时表现出更强的鲁棒性[^2]。 --- #### 结论实验展示了PCA算法和概率人脸嵌入(PFEs)方法在人脸识别中的应用效果。实验结果表明,结合PFEs方法可以显著提高人脸识别的性能,尤其是在复杂环境下的识别能力。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值