eigenface方法

eigenface方法人脸识别———《模式识别导论》实验报告三

实验题目

  1. 熟悉常⽤特征降维⽅法,了解并阐释PCA降维的基本原理;
  2. 熟悉Eigenface⼈脸识别的基本流程,利⽤Eigenface算法对训练集的样本进⾏训练,并进⾏⼈脸识别测试;
  3. 分析结果,并对本征脸⽅法的优缺点进⾏分析;
  4. 撰写实验报告。

实验目的

  1. 学习降维原理,以及应用最广泛的PCA降维算法。
  2. 实现eigenface人脸识别,初步了解computer vision相关基础技术。
  3. 进一步熟悉Python科学计算,以及科学绘图。

实验原理

  1. 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
2
3
4
5
6
7
8
9
Cov = XX^T
CovVects = FaceVects = X*eigVecs
for i from 0 to P:
TrainVects = FaceVects.T * X[i]
theta = MAX{ ||TrainVects - TrainVects_j||**2 j=0,1...P }
weiVec = FaceVects.T * judgeFace

reconstruct = FaceVector *weiVec
epsilon = MIN{ ||weiVec - TrainVects||**2 }

$\xi$ = ||TrainVects - reconstruct||^2
$\xi > theta $ 说明恢复后的图像与学习到的人脸库差别太大,故不属于人脸;
$\xi < theta $ and $\varepsilon_{min} \geq theta $ 说明和任意一张学习到的特征脸都相差较大,是未识别过的人脸;
$\xi < theta $ and $\varepsilon_{min} \leq theta $ 则测试图像属于$\varepsilon_{min}$对应的特征脸。

设计思路

  1. 函数loadImageSet将人脸整合为数据矩阵。
  2. 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]
  3. 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')

结果分析

  1. 训练集提取特征
    训练集由135张人脸组成,分别来自15个人,有glassesleftlighthappysad等多种环境。
    程序中选取前k个特征值,使得其和大于selec_trate=0.8的总特征值之和,提取出16张特征脸数据。

  2. 测试集进行评估
    100%识别出属于训练集的人脸;
    但是正确率只有90%,其中01和02测试样本来自同一个人,测试结果认为是来自不同的样本,01和02样本错认成了学习的两张特征脸7和6。


    此外,实验测试集中,加入了一张非学习样本的人脸图像,文件名`subject11.happy.png`,大小尺寸一样,同为灰度图,如下所示。但是可以从上图运行界面看出,测试结果“过拟合”识别成某一张学习的样本人脸。
  3. eigenface优缺点分析
    (1)eigenface实际应用的一个问题,就是在不同的光照条件和成像角度时,会导致识别率大幅下降。因此,使用特征脸需限制在统一的光照条件下使用正面图像进行识别。
    (2)算法可以挖掘出数据集的线性特性,但是遇到非线性结构时,往往不能达到理想的识别效果。
    (3)泛化能力不强,尤其是在学习集不大的时候,迁移到未学习过的测试集上会误当作学习到的特征,准确率不高。