1. 基础知识
1.1 最小距离分类器
最小距离分类器又称最近邻分类器(K Nearest Neighbors),这是一个非常简单的分类思想。这种基于匹配的分类技术通过一种原型模式向量代表每个类别。在识别未知模式时,根据预定义的相似性,给出了一个类别。常用的距离测量包括欧氏距离、马氏距离等。 一种简单的方法是将各类所有样有样本的平均向量作为该类别的原型,第一类样本的代表向量为: [外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-ttFIUyyO-1647920267992)(https://cdn.nlark.com/yuque/latex/696f40fdf534852efa88a1f359724873.svg#card=math&code={{m}{i}}=\frac{1}{{{N}{i}}}\underset{x\in {{\omega }_{i}}}{\overset{{}}{\mathop \sum }}\,{{x}_{i}}i=1,2,…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顾名思义,就是找出数据中最重要的方面,用数据要方面代替原始数据。具体来说,如果数据集是维的,则共有一个数据,希望将数据的维度从维度降低到维度,即尽可能将原始特征投影到投影信息量最大的维度,即希望维的数据集尽可能代表原始数据集。当然,在降维的过程中,肯定会有数据丢失,我们需要做的就是尽量减少损失。
- 创建由所有训练样本组成的矩阵,并计算训练样本的平均值
- 去除平均值,获得标准化的训练样本矩阵
- 计算协方差矩阵及其特征值和特征向量,对特征值进行排序,保留与最大特征值对应的特征向量。
- 获得训练样本的特征脸空间,计算特征脸空间中训练样本的投影
- 计算欧式距离,找出匹配的人脸
1.3 Eigenface Fisherface鉴别
Eigenface(特征脸)在人脸识别史上具有里程碑意义,被认为是第一种有效的人脸识别算法。1987年Sirovich and Kirby采用了减少人脸图像的表示(降维)PCA算法,1991年Matthew Turk and Alex Pentland首次将PCA应用于人脸识别,即将原始图像投影到特征空间,获得一系列降维图像,以其主元表示人脸,故称为“Eigenface特征脸”。 Eigenface是一种基于统计特征的方法,将人脸图像视为随机向量,并用统计的方法辨别不同的人脸特征模式。Eigenface基本思想是从统计的角度找到人脸图像分布的基本元素,即人脸图像样本集协方差矩阵的特征向量,以类似地表示人脸图像,称为特征脸。下图描述了特征脸的应用。  从图1.3.从1中可以看出,一组特征脸基图像(特征脸)形成一个特征脸空间,任何人脸图像(减去平均脸后)都可以投影到子空间,获得权值向量()。计算每个人权值向量之间的欧氏距离,以最小距离对应的人脸图像身份作为测试人脸图像的身份。这里提到的一组特征脸基图像(即特征脸或特征向量)正在使用PCA协方差矩阵的特征向量。
- 将训练集中的每个人脸图像拉长成一列,组合在一起形成大矩阵。
- 在相应的维度上加上所有的N个人脸,然后找到一个平均,得到一个平均脸。
- 将N个图像减去平均面图像,获得差值图像的数据矩阵。
- 计算协方差矩阵。然后分解其特征值,得到所需的特征向量(即特征脸Eigenface)。
- 将训练集图像和测试集图像投影到这些向量上,然后找到训练集中的最近邻,对测试集中的每个图像进行分类。
  
1.4 An efficient algorithm for Fisher criterion
在上述Fisherface的基础上的一些优化方法: 方法一、应用新算法直接在模式空间上计算鉴别向量,将模式投影到鉴别向量上,应用最小距离分类器做分类。(如果图像维数太高,可以将图像缩小) 方法二、先应用Eigenface的方法,计算N-1个Eigenfaces(可减少,但必须大于N-C),在特征脸空间应用新方法计算鉴别向量,将特征脸空间中的模式再投影到鉴别向量上得到鉴别特征,利用鉴别特征做最小距离分类。(注:1、N 为训练本个数,C 为类数)
2. 实验要求
- 要求:写出详细算法步骤,以及各种参数(如用了多少Eigenfaces,多少鉴别向量),给出实验结果。
- 用每个人的前5个人脸作为训练样本,后5个人脸作为测试样本。
3. 代码分析及结果
3.1 KNN近邻算法分类
  从图3.1.1可以看出随k值不断增加,KNN的误差也在不断地增加,故选择k=1作为KNN算法的输入参数,一方面可以提高准确度,同时还可以减少运算时间,提高运行效率。从图3.1.2可以看出期望预测值和KNN预测值,以及据此计算的准确度,可以看出在KNN的算法下,其分类准确度可以达到90%,基本符合分类要求。
3.2 PCA分类
  从图3.2.1和图3.2.2中可以明显的看出在PCA降维的过程中,保留90%的图像数据时,其大部分数据得到保留,图像依旧显示的很清楚;而当数据只保留60%时,虽然部分数据得以保留,人脸轮廓还是基本可以看出,但是其中的部分细节已经不是那么明显;故PCA降维虽然可以大幅减少运算数据量,但是其中的细节也会随之流失,因此选择合适的降维的维数显得尤为重要。
3.3 Eigenface+Fisherface鉴别
   
3.4 An efficient algorithm for Fisher criterion
 
4. 总结
在本次实验中,初步认识了PCA降维方法以及基于PCA的人脸分类算法EigenFace;另外还学习到LDA降维算法以及基于其的FisherFace算法,而EigenFace和FisherFace的区别就在于他们特征矩阵选择的不同,其余步骤基本一样。在EigenFace算法的实现过程中,进一步理解了算法的降维过程,充分理解到两种降维人脸识别方法,其核心思想无非是使用矩阵的部分特征向量来代替原数据,从而在保留数据特征信息不变的情况下,极大地减少基础运算数据,从而提高代码的运行效率。
https://www.yuque.com/docs/share/338e70e8-0e2a-45ce-97e5-7688a869d124?# 《PCA降维、Eigenface+Fisherface鉴别》其中不显示处可在语雀中查看