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
15alorithm2: 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
26algorithm3: 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)泛化能力不强,尤其是在学习集不大的时候,迁移到未学习过的测试集上会误当作学习到的特征,准确率不高。