基于Python实现的Eigenface人脸识别

资源下载地址:https://download.csdn.net/download/sheziqiong/85627024

实验内容和要求

自己构建数据库,可选用 AT&T 数据库,包含自己的人脸,进行 eigenface 人脸识别的训练、识别、重构

  1. 训练:指定能量百分比,将训练结果输出到 model 文件,展示平均脸与前十个特征脸;
  2. 识别:装载 model 文件,对输入的人脸图像进行识别,将识别结果叠加在输入的人脸图像上,展示训练库中最相似的图像;
  3. 重构:装载 model 文件,对输入的人脸图像变换到特征脸空间,然后再用变换后的结果重构回原图像。显示自己人脸图像的 10PCs、25PCs、50PCs、100PCs 的重构结果;
  4. 一半数据做训练,另一半做测试,显示随着 PC 增加,Rank-1 识别率曲线。

实验器材

Python 3.7

OpenCV 4.5.0

开发平台:Visual Studio Code

主要使用的 python 开源库有:cv2、numpy、matplotlib

具体实现

3.1 将自己的人脸加入数据库

调用摄像头,用 opencv 自带的 haar_cascade_frontalface_default.xml 来进行人脸识别,调整框的大小,切出自己的人脸,再 resize 到和 AT&T 数据库一样的数值,转换为 pgm 格式,命名为 s41。

fig1.1 预处理部分代码

fig1.2 处理后的自己的人脸图像

3.2 训练过程

先使用一半的数据进行训练。数据集中的每一张图是 112×92 大小的,用 reshape 函数将其化为 10304×1 的列向量,合并得到全数据集的样本矩阵,维度为 10304×205。

将所有的人脸在对应维度上加和求平均可以得到“平均脸”。将每个训练图像减去平均图像,可以得到差值图像的数据矩阵。

下一步我们要计算这个矩阵的协方差矩阵。然而偏差值图像的协方差矩阵维度是 10304×10304,再求其特征值和特征向量的话,计算量太大。因此这采用一种简单的做法——求一个代替的协方差矩阵,再通过求得的特征值与特征向量反推原矩阵的特征向量。

证明如下:

得到特征值与特征向量后,根据特征值排序重新组合特征向量,按照“从粗糙到细致”的思想排序,按照选择的能量百分比保留主成分的个数(PCs)。一般来说,做人脸检测的话较少的 PCs 就足够了,然而想要效果比较良好的人脸重构,还是需要较多的 PCs。此时的矩阵每一列就是一个特征脸。

至此,训练部分结束。可以将上述结果导出到 model 文件里。

fig2.4 训练结果导出为 json

3.3 识别过程

将输入的图像扁平化后,减去平均脸,得到测试人脸的偏差值图像。用我们之前得到的特征矩阵转置与之相乘,可以得到一个每一项为对应特征脸权重的列向量(维度为 PCs×1)。

检测相似度的时候,用各个训练数据得到的权重与上面算出的测试脸的权重求欧氏距离,来判断最相似的脸。

fig3.1 评估最相似人脸

3.4 重建过程

重建过程与检测过程思路类似,注意先对每一个特征点除以其欧氏距离(即列向量的 2-范数)。

从平均脸开始重建,逐渐增加主成分个数(PCs)。用测试图像的偏差矩阵的转置乘以对应的特征向量,得到权重。权重反乘这个特征脸,叠加到平均脸上即可得到重建的结果。

fig4.1 重建人脸关键代码

实验结果与分析

训练过程得到的结果如下:

fig5.3 最匹配人脸检测结果下面是对自己人脸的重建结果:

在这里插入图片描述
在这里插入图片描述

fig5.4 自己的人脸的重建过程(无眼镜、有眼镜)

重建时,我重新导出了一个更大的 model:它使用了每组数据的 9 张图做训练,使用能量百分比为 0.99,生成的特征矩阵有 300 个主成分。在 300PCs 时重建出的结果已经与原图非常接近。

最后,调整能量百分比,每次用一半数据做训练另一半数据做检测,得到Rank-1 随 PCs 增加的曲线(也就是正确率的曲线图)如下:

fig5.5 Rank-1 随 PCs 增加或能量百分比增加的曲线图

心得与体会

本次实验采用了 python 编程,代码量比较少,主要是使用了 numpy 的数学处理函数。但是因为 1.样本图像比较大;2.训练数据比较大,所以跑起来需要花大量的时间,而且在导出模型的过程中要花费更长的时间(需要打印很长的特征矩阵),导出的模型数据量也很大。

另外深刻体会到了自己线性代数基础的薄弱,需要好好补课啦!

对 PCA 算法和 eigenface 算法有了亲身实践体会,还是很有趣的。对于空间映射的思路也有了进一步的理解。

资源下载地址:https://download.csdn.net/download/sheziqiong/85627024

猜你喜欢

转载自blog.csdn.net/newlw/article/details/125257028