eigenface方法
eigenface方法人脸识别———《模式识别导论》实验报告三
实验题目
- 熟悉常⽤特征降维⽅法,了解并阐释PCA降维的基本原理;
- 熟悉Eigenface⼈脸识别的基本流程,利⽤Eigenface算法对训练集的样本进⾏训练,并进⾏⼈脸识别测试;
- 分析结果,并对本征脸⽅法的优缺点进⾏分析;
- 撰写实验报告。
实验目的
- 学习降维原理,以及应用最广泛的PCA降维算法。
- 实现eigenface人脸识别,初步了解computer vision相关基础技术。
- 进一步熟悉Python科学计算,以及科学绘图。
实验原理
- PCA降维
 目的是将一组N维向量$X_{N\times m}$降为K维(K大于0,小于N),选择K个单位正交基,使原始数据变换到这组基上后,各字段两两间协方差为0,字段的方差则尽可能大。
 $ X =\begin{pmatrix}
 a_1&a_2&a_3&…&a_m
 \b_1&b_2&b_3&…&b_m
 \end{pmatrix}$
 矩阵对角线上的两个元素分别是两个字段的方差,而其它元素是a和b的协方差。
 $Cov = \frac{1}{m}XX^T = \begin{pmatrix}
 \frac{1}{m}\sum_{i=1}^{m}a_i^2 &\frac{1}{m}\sum_{i=1}^{m}a_i b_i
 \\frac{1}{m}\sum_{i=1}^{m}a_i b_i&\frac{1}{m}\sum_{i=1}^{m}b_i^2
 \end{pmatrix}$
 求出$Cov$的特征值和特征向量矩阵$P$,并且实对称矩阵$Cov$可以相似对角化,乘以矩阵的n个单位正交特征向量即可。
 $PCovP^T = \Lambda = \begin{pmatrix}
 \lambda_1&&&&
 \ &\lambda_2&&&
 \ &&\lambda_3&&
 \ &&&…
 \ &&&&\lambda_n
 \end{pmatrix}$
 特征值从大到小排列,取前k行对应的单位正交特征向量组成的矩阵$E = \begin{pmatrix}
 e_1&e_2&e_3&…&e_k
 \end{pmatrix}$乘以原数据矩阵$X$,就得到了需要的降维之后的矩阵$Y = EX$。
2.eigenface人脸识别算法
人脸图像images $ I_{W\times H  }$,设数量为P。
将图像作Flatten操作,变成一维向量$ I=\begin{pmatrix}
a_1
\a_2
\…
\a_{N^2}
\end{pmatrix}
   {(W\times H = N^2)}$
所有的人脸图像组成矩阵$ X{N^2 \times M} = \begin{pmatrix}
I_1&I_2&I_3&…&I_M
\end{pmatrix}$
计算平均脸$avg =\frac{1}{P} \sum_{i=1}^{P} I_i = \frac{1}{P}
\begin{pmatrix}
a_1 + b_1 + … h_1
\a_1 + b_1 + … h_1
\…
\a_{N^2} + b_{N^2} + … h_1
\end{pmatrix}$
计算类协方差矩阵$Cov’ = X^TX$,这是由于原协方差矩阵计算量过大,改为求$Cov’$的特征向量矩阵,与原想要求解的仍然一致。
求出特征向量矩阵$eigVects$,默认取所有的特征向量也就是select_rate = 1,这是因为学习集样本不多。
接下来伪代码如下:
| 1 |  | 
$\xi$ = ||TrainVects - reconstruct||^2
$\xi > theta $ 说明恢复后的图像与学习到的人脸库差别太大,故不属于人脸;
$\xi < theta $ and $\varepsilon_{min} \geq theta $ 说明和任意一张学习到的特征脸都相差较大,是未识别过的人脸;
$\xi < theta $ and $\varepsilon_{min} \leq theta $ 则测试图像属于$\varepsilon_{min}$对应的特征脸。
设计思路
- 函数loadImageSet将人脸整合为数据矩阵。
- RecognitionVector处理人脸,提取特征脸。
 算法如下:- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15- alorithm2: ReconginitionVector
 input: select_rate=1
 output: avgImg,covVects,diffTrain
 FaceMat = loadImageSet('./Dataset/trainingset/')
 avgImg = mean_along_axis0(FaceMat)
 diffTrain = FaceMat-avgImg
 covMat =diffTrain *diffTrain^T
 eigvals = eigenvaluesof(covMat)
 eigVects = eigenvectorsof(covMat)
 
 eigvals =sort(-eigvals) #按特征值从大到小,取前k个
 MIN {i s.t. sum(eigvals[0:i])/sum(eigvals[]) >= selectrate}
 covVects = diffTrain.T * eigVects[][0:i]
- JudgeFace测试来自同一批采集者但是不同的表情和环境的人脸图像- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26- algorithm3: judgeFace
 input: judgeImg,FaceVector,avgImg,diffTrain
 output: the eigenface the testing face belongs to or alert "a new face"
 
 diff = judgeImg - avgImg
 weiVec = FaceVector.T* diff
 reconstruct = FaceVector *weiVec
 #====================================================================
 #plt.imshow(reconstruct.reshape(195,231))
 #plt.show()
 #====================================================================
 epsilonmin = np.inf
 imin = 0
 for i from 0 to FaceVector.shape[1]:
 TrainVec = (diffTrain[i]*FaceVector).T #omega_i
 TrainVects_j = (diffTrain[j]*FaceVector).T #omega_j
 thetamax = MAX{j: ||TrainVects - TrainVects_j||^2 }
 epsilon = ||weiVec-TrainVec||^2 #omega - omega_i
 if epsilon < epsilonmin:
 epsilonmin = epsilon and imin=i
 if epsilonmin >= thetamax:
 alert(the face to be judged is a new face)
 elif epsilonmin < thetamax:
 print(the face belongs to the same person as 'imin')
结果分析
- 训练集提取特征 
 训练集由135张人脸组成,分别来自15个人,有- glasses,- leftlight,- happy,- sad等多种环境。
 程序中选取前k个特征值,使得其和大于- selec_trate=0.8的总特征值之和,提取出16张特征脸数据。
- 测试集进行评估 
 100%识别出属于训练集的人脸;
 但是正确率只有90%,其中01和02测试样本来自同一个人,测试结果认为是来自不同的样本,01和02样本错认成了学习的两张特征脸7和6。  
 此外,实验测试集中,加入了一张非学习样本的人脸图像,文件名`subject11.happy.png`,大小尺寸一样,同为灰度图,如下所示。但是可以从上图运行界面看出,测试结果“过拟合”识别成某一张学习的样本人脸。  
- eigenface优缺点分析
 (1)- eigenface实际应用的一个问题,就是在不同的光照条件和成像角度时,会导致识别率大幅下降。因此,使用特征脸需限制在统一的光照条件下使用正面图像进行识别。
 (2)算法可以挖掘出数据集的线性特性,但是遇到非线性结构时,往往不能达到理想的识别效果。
 (3)泛化能力不强,尤其是在学习集不大的时候,迁移到未学习过的测试集上会误当作学习到的特征,准确率不高。
 scan the code if you would like to and I will thank you for inviting me for a Starbucks Coffee
scan the code if you would like to and I will thank you for inviting me for a Starbucks Coffee