PCA降维、Eigenface+Fisherface鉴别

1. 基础知识

1.1 最小距离分类器

最小距离分类器又称最近邻分类(K Nearest Neighbors),是一种非常简单的分类思想。这种基于匹配的分类技术通过以一种原型模式向量代表每一个类别,识别时一个未知模式被赋予一个按照预先定义的相似性度量与其距离最近的类别,常用的距离度量有欧氏距离,马氏距离等。
一种简单的做法是将每个类别所有样本的平均向量作为该类别的原型,则第类样本的代表向量为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ttFIUyyO-1647920267992)(https://cdn.nlark.com/yuque/latex/696f40fdf534852efa88a1f359724873.svg#card=math&code=%7B%7Bm%7D%7Bi%7D%7D%3D%5Cfrac%7B1%7D%7B%7B%7BN%7D%7Bi%7D%7D%7D%5Cunderset%7Bx%5Cin%20%7B%7B%5Comega%20%7D_%7Bi%7D%7D%7D%7B%5Coverset%7B%7B%7D%7D%7B%5Cmathop%20%5Csum%20%7D%7D%5C%2C%7B%7Bx%7D_%7Bi%7D%7Di%3D1%2C2%2C…W&id=ytLez)]

Matlab代码实现

%最小距离分类器,交互式选取图像样本分类数据,进行最小距离分类(实现欧式距离,马氏距离,计程距离)
function re=mindis()
[filename,pathname]=uigetfile({'*.jpg;*.bmp;*.tif;*.png;*.gif','All Image Files';'*.*','All Files'});%动态打开文件
image = imread([pathname,filename]);%读取
figure(1);imshow(image);
image=double(image);
[m,n,bands]=size(image);
k=input('请输入要分类的个数:  ');%输入要选取的样本类别数
aver=zeros(k,bands);%申请矩阵空间存储样本数据各类别各波段均值
%对所选取样本数据进行处理求得各类别均值
for i=1:k%对选中类别循环
    str=['请在屏幕图像上选择第',num2str(i),'种分类样本,选择完毕请回车确定'];
    disp(str);
    [y,x]=getpts;%从图像上获取数据点
    A=[round(y),round(x)];
    for band=1:bands%对图像每个波段进行计算,求取指定类别每个波段均值
        Sum=0;
         for count=1:size(A,1)%对取得点循环
             temp=image(:,:,band);
            Sum=Sum+temp(A(count,2),A(count,1));
         end
          aver(i,band)=Sum/size(A,1);%求均值
    end
end
image=reshape(image,m*n,bands);%将图像数据重塑成为一列为一个波段数据的形式,便于计算
dis=zeros(k,m*n);%申请矩阵空间存储每个类别图像各个点数据分别到各波段均值的距离的和
type=input('请输入要选择的分类类型: 1.欧式距离 2.马氏距离  3.计程距离  : ');
switch type%分别代入不同公式
    case 1
        %对每个类别进行循环,求出各个类别的距离,后面进行比较
        for t=1:k
        tem=image-aver(t,:);%图像数据与样本每个类别每个波段均值分别求差值
        dis(t,:)=sqrt(sum((tem.*tem).'));  %和的平方根
        end
    case 2
        %申请矩阵存储样本数据均值协方差
        T=zeros(bands,bands,k);
        for t=1:k
            T(:,:,t)=cov(aver);%求取协方差
            tem=image-aver(t,:);
            dis(t,:)=sqrt(sum((tem*T(:,:,t).*tem).'));  %同上
        end
    case 3
        for t=1:k
            tem=image-aver(t,:);
            dis(t,:)=sum(abs(tem.'));%绝对值之和
        end
end
    [~,index]=min(dis);%求各距离最小值
    index=reshape(index,m,n);%重塑回原图像排列
    re=index/k;%给各类别赋值指定灰度值便于区分,也可赋值其他
    figure(2),imshow((re));%显示
end


1.2 PCA降维

主成分分析(Principal components analysis,简称PCA)是最重要的降维算法之一。在数据压缩、消除冗余和数据噪音消除等领域都有着广泛应用。一般提到降维算法,人们首先想到的就是PCA算法。
PCA顾名思义,就是找出数据里最主要的方面,用数据的最主要方面来代替原始数据。具体的如果数据集是维的,共有个数据,希望将这个数据的维度从维降到维,也就是尽可能地将原始特征往具有最大投影信息量的维度上进行投影,即希望这个维的数据集尽可能的代表原始数据集。当然,在降维的过程中,肯定存在数据的丢失,而我们需要做的就是使损失最小。
PCA降维主要步骤:

  1. 创建所有训练样本组成的矩阵,并计算训练样本的平均值矩阵
  2. 去除平均值,得到规格化后的训练样本矩阵
  3. 计算协方差矩阵及其特征值和特征向量,并将特征值进行排序,保留个最大的特征值对应的特征向量。
  4. 获得训练样本的特征脸空间,并计算训练样本在特征脸空间上的投影
  5. 计算欧式距离,找出匹配的人脸

1.3 Eigenface+Fisherface鉴别

Eigenface(特征脸)在人脸识别历史上有着里程碑式的意义,其被认为是第一种有效的人脸识别算法。1987年Sirovich and Kirby为了减少人脸图像的表示(降维)采用了PCA算法,1991年Matthew Turk and Alex Pentland首次将PCA应用于人脸识别,即将原始图像投影到特征空间,得到一系列降维图像,取其主元表示人脸,因其主元有人脸形状,故称为“Eigenface特征脸”。
Eigenface是一种基于统计特征的方法,将人脸图像视为随机向量,并用统计的方法辨别不同的人脸特征模式。Eigenface的基本思想是,从统计的观点,寻找人脸图像分布的基本元素,即人脸图像样本集协方差矩阵的特征向量,以此近似的表征人脸图像,这些特征向量即称为特征脸。下图对特征脸的应用进行了说明。
![image.png](https://img-blog.csdnimg.cn/img_convert/e175af6408836adeacb95254fe9b7108.png#clientId=uca0d51e5-dd95-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=140&id=uc00b7df3&margin=[object Object]&name=image.png&originHeight=280&originWidth=1138&originalType=binary&ratio=1&rotation=0&showTitle=false&size=295463&status=done&style=none&taskId=ude89e56c-e8e9-4367-b283-e124aabaaaa&title=&width=569)
从图1.3.1中可以看出,一组特征脸基图像(特征脸)组成一个特征脸子空间,任何一幅人脸图像(减去平均脸后)都可投影到该子空间,得到一个权值向量()。计算此向量和训练集中每个人的权值向量之间的欧氏距离,取最小距离所对应的人脸图像的身份作为测试人脸图像的身份。而这里提到的一组特征脸基图像(也就是特征脸或者称为特征向量)正是利用PCA所求得的协方差矩阵的特征向量。
基于特征脸的人脸识别过程如下:

  1. 将训练集的每一个人脸图像都拉长为一列,将他们组合在一起形成一个大矩阵。
  2. 将所有的N个人脸在对应维度上加起来,然后求个平均,就得到了一个“平均脸”。
  3. 将N个图像都减去那个平均脸图像,得到差值图像的数据矩阵。
  4. 计算协方差矩阵。再对其进行特征值分解,就可以得到想要的特征向量(即特征脸Eigenface)。
  5. 将训练集图像和测试集图像都投影到这些向量上,再对测试集的每个图像找到训练集中的最近邻,进行分类即可。

![image.png](https://img-blog.csdnimg.cn/img_convert/dff85feffed1ebcdf911d6077112ac6a.png#clientId=uca0d51e5-dd95-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=290&id=u9bb342d7&margin=[object Object]&name=image.png&originHeight=580&originWidth=1133&originalType=binary&ratio=1&rotation=0&showTitle=false&size=294308&status=done&style=none&taskId=ua0194d1b-4033-4c40-a1b1-00e5d98ecdf&title=&width=566.5)
![image.png](https://img-blog.csdnimg.cn/img_convert/acaecbf9997bc290d813405ad2a26e72.png#clientId=uca0d51e5-dd95-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=80&id=u5a04f017&margin=[object Object]&name=image.png&originHeight=159&originWidth=1136&originalType=binary&ratio=1&rotation=0&showTitle=false&size=30095&status=done&style=none&taskId=ub5e1adf4-4d5a-4384-8ee6-37416f54876&title=&width=568)
![image.png](https://img-blog.csdnimg.cn/img_convert/9c84fc4f943af94ff9f24d1cb5d8e803.png#clientId=uca0d51e5-dd95-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=361&id=uc22e943d&margin=[object Object]&name=image.png&originHeight=526&originWidth=626&originalType=binary&ratio=1&rotation=0&showTitle=false&size=29250&status=done&style=none&taskId=u5b22110c-7323-415d-be21-ee503e64fec&title=&width=430)

1.4 An efficient algorithm for Fisher criterion

在上述Fisherface的基础上的一些优化方法:
方法一、应用新算法直接在模式空间上计算鉴别向量,将模式投影到鉴别向量上,应用最小距离分类器做分类。(如果图像维数太高,可以将图像缩小)
方法二、先应用Eigenface的方法,计算N-1个Eigenfaces(可减少,但必须大于N-C),在特征脸空间应用新方法计算鉴别向量,将特征脸空间中的模式再投影到鉴别向量上得到鉴别特征,利用鉴别特征做最小距离分类。(注:1、N 为训练本个数,C 为类数)

2. 实验要求

  1. 要求:写出详细算法步骤,以及各种参数(如用了多少Eigenfaces,多少鉴别向量),给出实验结果。
  2. 用每个人的前5个人脸作为训练样本,后5个人脸作为测试样本。

3. 代码分析及结果

3.1 KNN近邻算法分类

![image.png](https://img-blog.csdnimg.cn/img_convert/d707c40cf1c2b5d89a22c2af1007bf8f.png#clientId=uca0d51e5-dd95-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=982&id=u8c9bf468&margin=[object Object]&name=image.png&originHeight=786&originWidth=554&originalType=binary&ratio=1&rotation=0&showTitle=false&size=88521&status=done&style=none&taskId=ub10f558e-0f06-4408-9e3b-0a7737a75c8&title=&width=692)
![image.png](https://img-blog.csdnimg.cn/img_convert/8d47ec18a784dbe86acced8ab70e9e00.png#clientId=uca0d51e5-dd95-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=252&id=u1fcc23c5&margin=[object Object]&name=image.png&originHeight=442&originWidth=1152&originalType=binary&ratio=1&rotation=0&showTitle=false&size=152108&status=done&style=none&taskId=uc4ac968f-df5d-4629-a5fb-069d95c8d56&title=&width=656)
从图3.1.1可以看出随k值不断增加,KNN的误差也在不断地增加,故选择k=1作为KNN算法的输入参数,一方面可以提高准确度,同时还可以减少运算时间,提高运行效率。从图3.1.2可以看出期望预测值和KNN预测值,以及据此计算的准确度,可以看出在KNN的算法下,其分类准确度可以达到90%,基本符合分类要求。

3.2 PCA分类

![image.png](https://img-blog.csdnimg.cn/img_convert/31e648aea19180992c893e4b9e496c98.png#clientId=uca0d51e5-dd95-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=1113&id=ud3490ffb&margin=[object Object]&name=image.png&originHeight=884&originWidth=553&originalType=binary&ratio=1&rotation=0&showTitle=false&size=120950&status=done&style=none&taskId=u4391de1c-85a3-4d3b-8de9-3f1fdadad20&title=&width=696.5)
![image.png](https://img-blog.csdnimg.cn/img_convert/bf944051fc8c7f15cbb2aef799dd0612.png#clientId=uca0d51e5-dd95-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=361&id=u254459a3&margin=[object Object]&name=image.png&originHeight=588&originWidth=1072&originalType=binary&ratio=1&rotation=0&showTitle=false&size=449219&status=done&style=none&taskId=ued21aa36-728c-4cde-8170-fa437899358&title=&width=659)
从图3.2.1和图3.2.2中可以明显的看出在PCA降维的过程中,保留90%的图像数据时,其大部分数据得到保留,图像依旧显示的很清楚;而当数据只保留60%时,虽然部分数据得以保留,人脸轮廓还是基本可以看出,但是其中的部分细节已经不是那么明显;故PCA降维虽然可以大幅减少运算数据量,但是其中的细节也会随之流失,因此选择合适的降维的维数显得尤为重要。

3.3 Eigenface+Fisherface鉴别

![image.png](https://img-blog.csdnimg.cn/img_convert/44feca6218e92543b97a108d1badfafb.png#clientId=uca0d51e5-dd95-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=1066&id=u7b8e08b3&margin=[object Object]&name=image.png&originHeight=845&originWidth=553&originalType=binary&ratio=1&rotation=0&showTitle=false&size=191079&status=done&style=none&taskId=ue20dc42a-83c0-4235-8731-769fba8818e&title=&width=697.5)
![image.png](https://img-blog.csdnimg.cn/img_convert/1a6e01ed347087177c2aa450aacbdb91.png#clientId=uca0d51e5-dd95-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=1135&id=ue9440b83&margin=[object Object]&name=image.png&originHeight=905&originWidth=553&originalType=binary&ratio=1&rotation=0&showTitle=false&size=249605&status=done&style=none&taskId=uec27130e-2c92-46b2-bf89-7707f2a6868&title=&width=693.5)
![image.png](https://img-blog.csdnimg.cn/img_convert/defe8d1bd540a2b355157cb92a2cfbb2.png#clientId=uca0d51e5-dd95-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=764&id=u539145c3&margin=[object Object]&name=image.png&originHeight=546&originWidth=498&originalType=binary&ratio=1&rotation=0&showTitle=false&size=116739&status=done&style=none&taskId=ua92abf0d-535b-4142-bbe3-160e3c1d26c&title=&width=697)
![image.png](https://img-blog.csdnimg.cn/img_convert/75ad17815052b67fc7d17881005d8d8a.png#clientId=uca0d51e5-dd95-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=447&id=ue45a160b&margin=[object Object]&name=image.png&originHeight=732&originWidth=1143&originalType=binary&ratio=1&rotation=0&showTitle=false&size=610285&status=done&style=none&taskId=udbf7ee34-8e90-448b-acef-d88cbd81960&title=&width=697.5)

3.4 An efficient algorithm for Fisher criterion

![image.png](https://img-blog.csdnimg.cn/img_convert/e2bd2c87ffa7e24e692c884a54800a74.png#clientId=uca0d51e5-dd95-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=1199&id=ue4248eac&margin=[object Object]&name=image.png&originHeight=884&originWidth=515&originalType=binary&ratio=1&rotation=0&showTitle=false&size=240540&status=done&style=none&taskId=ud72b9ce0-c16e-44a5-8ba1-5e3baf735fc&title=&width=698.5)
![image.png](https://img-blog.csdnimg.cn/img_convert/3015b070d5be7c8ec1be17f8589ea208.png#clientId=uca0d51e5-dd95-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=669&id=u2413d52d&margin=[object Object]&name=image.png&originHeight=533&originWidth=554&originalType=binary&ratio=1&rotation=0&showTitle=false&size=156859&status=done&style=none&taskId=u22fb8d2f-876a-45a4-a8e0-c5f01883f25&title=&width=695)

4. 总结

在本次实验中,初步认识了PCA降维方法以及基于PCA的人脸分类算法EigenFace;另外还学习到LDA降维算法以及基于其的FisherFace算法,而EigenFace和FisherFace的区别就在于他们特征矩阵选择的不同,其余步骤基本一样。在EigenFace算法的实现过程中,进一步理解了算法的降维过程,充分理解到两种降维人脸识别方法,其核心思想无非是使用矩阵的部分特征向量来代替原数据,从而在保留数据特征信息不变的情况下,极大地减少基础运算数据,从而提高代码的运行效率。

https://www.yuque.com/docs/share/338e70e8-0e2a-45ce-97e5-7688a869d124?# 《PCA降维、Eigenface+Fisherface鉴别》其中不显示处可在语雀中查看

你可能感兴趣的:(python,机器学习)