基于LDA特征提取的人脸识别算法matlab仿真

目录

一、理论基础

2.1 PCA特征提取

2.2 LDA特征提取

1.3实现步骤

二、核心程序

三、仿真结论


一、理论基础

        人脸识别技术是一种广泛应用于安防、金融、医疗等领域的技术,它可以识别出人脸图像中的人物身份信息。基于LDA特征提取的人脸识别算法是一种常用的人脸识别方法,它通过对人脸图像进行特征提取,从而实现人脸识别。本文将从数学公式和实现步骤两个方面,详细介绍基于LDA特征提取的人脸识别算法。


2.1 PCA特征提取

       在介绍LDA特征提取之前,我们先来介绍一下PCA(Principal Component Analysis)特征提取。PCA是一种常用的特征提取方法,它通过对数据进行降维,提取出数据的主要特征,从而减少数据的冗余信息。

       假设我们有一个由$n$个样本组成的数据集$X={x_1,x_2,...,x_n}$,每个样本有$d$维特征,我们的目标是将这个数据集降到$k$维,即将每个样本$x_i$转化为$k$维向量$y_i$,使得样本在$k$维空间中的方差最大。我们可以通过对样本协方差矩阵进行特征值分解,得到协方差矩阵的$k$个最大特征值和对应的特征向量,将这$k$个特征向量组成的矩阵$W$作为变换矩阵,将每个样本$x_i$乘以变换矩阵$W$,得到降维后的样本$y_i=W^Tx_i$。PCA的数学公式如下:

计算样本均值:
$$\overline{x}=\frac{1}{n}\sum_{i=1}^nx_i$$

计算协方差矩阵:
$$C=\frac{1}{n}\sum_{i=1}^n(x_i-\overline{x})(x_i-\overline{x})^T$$

对协方差矩阵进行特征值分解:
$$C=V\Lambda V^T$$

其中,$V$为特征向量矩阵,$\Lambda$为特征值对角矩阵。

取最大的$k$个特征向量:
$$W=[v_1,v_2,...,v_k]$$

对每个样本进行变换:
$$y_i=W^Tx_i$$

2.2 LDA特征提取

       LDA(Linear Discriminant Analysis)特征提取是一种常用的分类方法,它通过对数据进行降维,同时保留了数据的分类信息,从而提高了分类的准确率。

       假设我们有一个由$n$个样本组成的数据集$X={x_1,x_2,...,x_n}$,每个样本有$d$维特征和一个类别标签$y_i$,我们的目标是将这个数据集降到$k$维,使得降维后的数据能够最大化不同类别之间的距离,同时最小化同一类别内部的距离。我们可以通过对两个矩阵$S_w$和$S_b$进行特征值分解,得到特征向量矩阵$W$,将每个样本$x_i$乘以变换矩阵$W$,得到降维后的样本$y_i=W^Tx_i$。LDA的数学公式如下:

计算每个类别的均值:
$$\overline{x}i=\frac{1}{n_i}\sum{j=1}^{n_i}x_{ij},\quad i=1,2,...,c$$

其中,$c$为类别数,$n_i$为第$i$个类别的样本数。

计算总体均值:
$$\overline{x}=\frac{1}{n}\sum_{i=1}^c\sum_{j=1}^{n_i}x_{ij}$$

其中,$n$为总样本数。

计算类内散度矩阵$S_w$:
$$S_w=\sum_{i=1}^c\sum_{j=1}^{n_i}(x_{ij}-\overline{x}i)(x{ij}-\overline{x}_i)^T$$

计算类间散度矩阵$S_b$:
$$S_b=\sum_{i=1}^c n_i(\overline{x}_i-\overline{x})(\overline{x}_i-\overline{x})^T$$

对矩阵$S_w^{-1}S_b$进行特征值分解:
$$S_w^{-1}S_b=V\Lambda V^T$$

其中,$V$为特征向量矩阵,$\Lambda$为特征值对角矩阵。

取最大的$k$个特征向量:
$$W=[v_1,v_2,...,v_k]$$

对每个样本进行变换:
$$y_i=W^Tx_i$$

其中,$k$为降维后的维数,$y_i$为降维后的样本向量。

1.3实现步骤


       基于LDA特征提取的人脸识别算法的实现步骤如下:

       准备人脸数据集,每个人的人脸图像至少有2张,将数据集划分为训练集和测试集。

       对训练集中的每个人的人脸图像进行PCA特征提取,得到每个人的特征子空间,将这些特征子空间合并成一个总的特征子空间。

       对训练集中的每个人的人脸图像进行LDA特征提取,得到每个人的LDA特征向量,将这些LDA特征向量合并成一个总的LDA特征向量矩阵。

      对测试集中的每个人的人脸图像,先进行PCA特征提取,将其转化为PCA特征向量,然后将其投影到总的特征子空间中,得到其在总的特征子空间中的投影向量。

对投影向量进行LDA变换,得到其在LDA特征空间中的特征向量。

       将测试样本的LDA特征向量与训练样本的LDA特征向量进行比较,选择距离最近的训练样本的LDA特征向量对应的人脸标签作为测试样本的识别结果。

       基于LDA特征提取的人脸识别算法是一种常用的人脸识别方法,它通过对人脸图像进行特征提取,从而实现人脸识别。本文从数学公式和实现步骤两个方面,详细介绍了基于LDA特征提取的人脸识别算法。在实际应用中,我们可以根据实际情况对算法进行优化和改进,以提高算法的识别率和性能。
 

二、核心程序

....................................................................................
%------------input train sample-------------------
train=cell(1,all_train);
meanrate=0;%20次试验的平均识别率
fprintf('每类 训练样本个数:%2d     ',t) ;
fprintf('每类 测试样本个数:%2d\n',Ni-t);
for e=1:experiment
    fprintf('第 %2d  组实验 不同维数的识别率\n',e);
    a=1;%用来计数
    gnd=[];
    for i=1:C
        for j=1:t   %每类的前t个样本作为训练样本
            str=strcat('ORL\s',int2str(i),'\',int2str(number(e,j)),'.pgm');
            eval('img=imread(str);');
            train{:,a}=double(img);
            train_data(a,:)=reshape(train{:,a},1,L);
            a=a+1;
            gnd=[gnd;i];
        end
    end
%------------- -------------------------
        ratematrix=[];
        options = [];
        options.PCARatio = 0.85;
        [eigenvector, eigenvalue] = LDA(gnd, options, train_data);
        eigvalue=diag(eigenvalue);
       [Sr,index]=sort(-eigvalue);
    for dim=1:3     %降维后的维数
      %------------------------------- 
       vector=eigenvector(:,index(1:dim)); 
        train_Y = train_data*vector;
%------------input test sample and compute the rate-------------------
        success=0;
        fail=0;
        for n=(t+1):Ni %number :(t+1)---Ni做测试 
            for j=1:C
                test=double(imread(strcat('ORL\s',int2str(j),'\',int2str(number(e,n)),'.pgm')));
                test_data=reshape(test,1,L);%转为列向量
                test_Y=test_data*vector;%将测试样本投影到 
                %-------------comput Euclidean distance--------------
                distance=[];
                for m=1:all_train
                    tt=double(test_Y)-double(train_Y(m,:));
                    d=norm(tt);  
                    distance=[distance d];
                end  
            %--------find the minimum distance -----------------
                min_num=find(distance==min(distance));  
                predict=floor((min_num-1)/t)+1;  
                if predict==j
                   success=success+1;
                else 
                   fail=fail+1;
                %fprintf('%d.jpg fails to match!\n',j);
                end
            end
        end
        rate=(success/all_test)*100;
        ratematrix=[ratematrix rate/100];
         fprintf('dim:%2d',dim);
         fprintf('     rate:%4.2f%%',rate);
         fprintf('     success:%2d',success);
         fprintf('     fail:%2d',fail);
         fprintf('     total:%2d\n',all_test);
    end
    meanrate=meanrate+ratematrix/experiment;
end
colum=size(meanrate,2);
fprintf('每类 训练样本个数:%2d     ',t) ;
fprintf('每类 测试样本个数:%2d\n',Ni-t);
fprintf('%2d组实验,不同维数的平均识别率\n',experiment);
for dim=1:colum
    fprintf('dim:%2d',dim);
    fprintf('     meanrate:%4.4f\n',meanrate(:,dim));
end
UP2147

三、仿真结论

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/131424685