# Eigenface人脸识别
# 实验内容和要求
自己构建数据库,可选用 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。
![](https://www.writebug.com/myres/static/uploads/2022/6/12/963cc01bd915a4e56b724faf33b8114b.writebug)
fig1.1 预处理部分代码
![](https://www.writebug.com/myres/static/uploads/2022/6/12/56ebe241d895c88dd7133b16295e8253.writebug)
fig1.2 处理后的自己的人脸图像
## 3.2 训练过程
先使用一半的数据进行训练。数据集中的每一张图是 112×92 大小的,用 reshape 函数将其化为 10304×1 的列向量,合并得到全数据集的样本矩阵,维度为 10304×205。
将所有的人脸在对应维度上加和求平均可以得到“平均脸”。将每个训练图像减去平均图像,可以得到差值图像的数据矩阵。
![](https://www.writebug.com/myres/static/uploads/2022/6/12/dbb111fbb8f8ac56455ece3a29d6d3b0.writebug)
fig2.1 求平均脸与训练数据的差值图像
下一步我们要计算这个矩阵的协方差矩阵。然而偏差值图像的协方差矩阵维度是 10304×10304,再求其特征值和特征向量的话,计算量太大。因此这采用一种简单的做法——求一个代替的协方差矩阵,再通过求得的特征值与特征向量反推原矩阵的特征向量。
证明如下:
![](https://www.writebug.com/myres/static/uploads/2022/6/12/eb987b093c5ffef01bce780e00bb88c0.writebug)
fig2.2 证明
得到特征值与特征向量后,根据特征值排序重新组合特征向量,按照“从粗糙到细致”的思想排序,按照选择的能量百分比保留主成分的个数(PCs)。一般来说,做人脸检测的话较少的 PCs 就足够了,然而想要效果比较良好的人脸重构,还是需要较多的 PCs。此时的矩阵每一列就是一个特征脸。
![](https://www.writebug.com/myres/static/uploads/2022/6/12/fbb4ea21e95672aca254e5c15ada8da8.writebug)
fig2.3 得到特征矩阵
至此,训练部分结束。可以将上述结果导出到 model 文件里。
![](https://www.writebug.com/myres/static/uploads/2022/6/12/08324ee9a6575eb2a9b53574f65326ca.writebug)
fig2.4 训练结果导出为 json
## 3.3 识别过程
将输入的图像扁平化后,减去平均脸,得到测试人脸的偏差值图像。用我们之前得到的特征矩阵转置与之相乘,可以得到一个每一项为对应特征脸权重的列向量(维度为 PCs×1)。
检测相似度的时候,用各个训练数据得到的权重与上面算出的测试脸的权重求欧氏距离,来判断最相似的脸。
![](https://www.writebug.com/myres/static/uploads/2022/6/12/007e02c076fa716ad593d8d6d3cd8077.writebug)
fig3.1 评估最相似人脸
## 3.4 重建过程
重建过程与检测过程思路类似,注意先对每一个特征点除以其欧氏距离(即列向量的 2-范数)。
从平均脸开始重建,逐渐增加主成分个数(PCs)。用测试图像的偏差矩阵的转置乘以对应的特征向量,得到权重。权重反乘这个特征脸,叠加到平均脸上即可得到重建的结果。
![](https://www.writebug.com/myres/static/uploads/2022/6/12/7a73883207c1727a50bc6d74fb25518f.writebug)
fig4.1 重建人脸关键代码
# 实验结果与分析
训练过程得到的结果如下:
![](https://www.writebug.com/myres/static/uploads/2022/6/12/23abf44c7881033a78c6c10c55029e55.writebug)
fig5.1 平均脸
![](https://www.writebug.com/myres/static/uploads/2022/6/12/ac2ef43b27aa6c56559e6ce382f1c931.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/6/12/ab9871c3941119bcfba63319d1e3283e.writebug)
fig5.2 10 个特征脸与混合结果
在能量选择 0.8 的情况下的最相似人脸的识别结果正确率还是很高的。
![](https://www.writebug.com/myres/static/uploads/2022/6/12/c942df96256a28a660d52ed441376a58.writebug)
fig5.3 最匹配人脸检测结果下面是对自己人脸的重建结果:
![](https://www.writebug.com/myres/static/uploads/2022/6/12/6aeade2dd5018fa16bb2a5b5a575b0c0.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/6/12/1032c4ba5ff85d7ef5de5d1d34dccbe3.writebug)
fig5.4 自己的人脸的重建过程(无眼镜、有眼镜)
重建时,我重新导出了一个更大的 model:它使用了每组数据的 9 张图做训练,使用能量百分比为 0.99,生成的特征矩阵有 300 个主成分。在 300PCs 时重建出的结果已经与原图非常接近。
最后,调整能量百分比,每次用一半数据做训练另一半数据做检测,得到Rank-1 随 PCs 增加的曲线(也就是正确率的曲线图)如下:
![](https://www.writebug.com/myres/static/uploads/2022/6/12/da6376f48c63ff46e59b8fe8b0bb3c82.writebug)
fig5.5 Rank-1 随 PCs 增加或能量百分比增加的曲线图
# 心得与体会
本次实验采用了 python 编程,代码量比较少,主要是使用了 numpy 的数学处理函数。但是因为 1.样本图像比较大;2.训练数据比较大,所以跑起来需要花大量的时间,而且在导出模型的过程中要花费更长的时间(需要打印很长的特征矩阵),导出的模型数据量也很大。
另外深刻体会到了自己线性代数基础的薄弱,需要好好补课啦!
对 PCA 算法和 eigenface 算法有了亲身实践体会,还是很有趣的。对于空间映射的思路也有了进一步的理解。
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源包含文件:设计报告word+源码 调用摄像头,用 opencv 自带的 haar_cascade_frontalface_default.xml 来进行人脸识别,调整框的大小,切出自己的人脸,再 resize 到和 AT&T 数据库一样的数值,转换为 pgm 格式,命名为 s41。 Python 3.7 OpenCV 4.5.0 开发平台:Visual Studio Code 主要使用的 python 开源库有:cv2、numpy、matplotlib 详细介绍参考:https://biyezuopin.blog.csdn.net/article/details/125257028
资源推荐
资源详情
资源评论
收起资源包目录
基于Python实现的Eigenface人脸识别.zip (11个子文件)
设计报告.docx 474KB
LICENSE 1KB
code
rank-1.py 2KB
mytrain.py 5KB
model.json 39.22MB
haarcascade_frontalface_default.xml 908KB
myface.py 1KB
mytest.py 2KB
myreconstruct.py 3KB
tmp.txt 1KB
README.md 6KB
共 11 条
- 1
shejizuopin
- 粉丝: 9533
- 资源: 1288
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页