基于Python实现人脸识别【100010473】
Eigenface人脸识别
实验内容和要求
自己构建数据库,可选用 AT&T 数据库,包含自己的人脸,进行 eigenface 人脸识别的训练、识别、重构
- 训练:指定能量百分比,将训练结果输出到 model 文件,展示平均脸与前十个特征脸;
- 识别:装载 model 文件,对输入的人脸图像进行识别,将识别结果叠加在输入的人脸图像上,展示训练库中最相似的图像;
- 重构:装载 model 文件,对输入的人脸图像变换到特征脸空间,然后再用变换后的结果重构回原图像。显示自己人脸图像的 10PCs、25PCs、50PCs、100PCs 的重构结果;
- 一半数据做训练,另一半做测试,显示随着 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。
将所有的人脸在对应维度上加和求平均可以得到“平均脸”。将每个训练图像减去平均图像,可以得到差值图像的数据矩阵。
fig2.1 求平均脸与训练数据的差值图像
下一步我们要计算这个矩阵的协方差矩阵。然而偏差值图像的协方差矩阵维度是 10304×10304,再求其特征值和特征向量的话,计算量太大。因此这采用一种简单的做法——求一个代替的协方差矩阵,再通过求得的特征值与特征向量反推原矩阵的特征向量。
证明如下:
fig2.2 证明
得到特征值与特征向量后,根据特征值排序重新组合特征向量,按照“从粗糙到细致”的思想排序,按照选择的能量百分比保留主成分的个数(PCs)。一般来说,做人脸检测的话较少的 PCs 就足够了,然而想要效果比较良好的人脸重构,还是需要较多的 PCs。此时的矩阵每一列就是一个特征脸。
fig2.3 得到特征矩阵
至此,训练部分结束。可以将上述结果导出到 model 文件里。
fig2.4 训练结果导出为 json
3.3 识别过程
将输入的图像扁平化后,减去平均脸,得到测试人脸的偏差值图像。用我们之前得到的特征矩阵转置与之相乘,可以得到一个每一项为对应特征脸权重的列向量(维度为 PCs×1)。
检测相似度的时候,用各个训练数据得到的权重与上面算出的测试脸的权重求欧氏距离,来判断最相似的脸。
fig3.1 评估最相似人脸
3.4 重建过程
重建过程与检测过程思路类似,注意先对每一个特征点除以其欧氏距离(即列向量的 2-范数)。
从平均脸开始重建,逐渐增加主成分个数(PCs)。用测试图像的偏差矩阵的转置乘以对应的特征向量,得到权重。权重反乘这个特征脸,叠加到平均脸上即可得到重建的结果。
fig4.1 重建人脸关键代码
实验结果与分析
训练过程得到的结果如下:
fig5.1 平均脸
fig5.2 10 个特征脸与混合结果
在能量选择 0.8 的情况下的最相似人脸的识别结果正确率还是很高的。
fig5.3 最匹配人脸检测结果下面是对自己人脸的重建结果:
fig5.4 自己的人脸的重建过程(无眼镜、有眼镜)
重建时,我重新导出了一个更大的 model:它使用了每组数据的 9 张图做训练,使用能量百分比为 0.99,生成的特征矩阵有 300 个主成分。在 300PCs 时重建出的结果已经与原图非常接近。
最后,调整能量百分比,每次用一半数据做训练另一半数据做检测,得到Rank-1 随 PCs 增加的曲线(也就是正确率的曲线图)如下:
fig5.5 Rank-1 随 PCs 增加或能量百分比增加的曲线图
心得与体会
本次实验采用了 python 编程,代码量比较少,主要是使用了 numpy 的数学处理函数。但是因为 1.样本图像比较大;2.训练数据比较大,所以跑起来需要花大量的时间,而且在导出模型的过程中要花费更长的时间(需要打印很长的特征矩阵),导出的模型数据量也很大。
另外深刻体会到了自己线性代数基础的薄弱,需要好好补课啦!
对 PCA 算法和 eigenface 算法有了亲身实践体会,还是很有趣的。对于空间映射的思路也有了进一步的理解。
♻️ 资源
大小: 7.85MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87390873
相关文章
- 【华为云技术分享】基于Atlas 200 DK的原版YOLOv3(基于Darknet-53)实现(Python版本)
- python实现基于两张图片生成圆角图标效果的方法
- Python下的XML-RPC客户端和服务端实现(基于xmlrpclib SimpleXMLRPCServer 模块)
- 【Python五篇慢慢弹(4)】模块异常谈python
- python实现堆栈与队列的方法
- TF学习:Tensorflow基础案例、经典案例集合——基于python编程代码的实现
- Python编程语言学习:python的列表的特殊应用之一行命令实现if判断中的两类判断
- 【微电网】基于风光储能和需求响应的微电网日前经济调度(Python代码实现)
- 基于蒙特卡洛法的规模化电动车有序充放电及负荷预测(Python&Matlab实现)
- 基于蒙特卡洛法的规模化电动汽车充电负荷预测(Python&Matlab实现)
- 【路径规划】基于A*算法和Dijkstra算法的路径规划(Python代码实现)
- 基于遗传算法和粒子群优化算法优化LSTM(Python代码实现)
- 【负荷预测】基于贝叶斯网络的考虑不确定性的短期电能负荷预测(Python代码实现)
- 基于蒙特卡洛法的规模化电动车有序充放电及负荷预测(Python&Matlab实现)
- 基于蜻蜓优化算法的配电网重构求解(Python代码实现)【IEEE123节点算例】
- 基于深度学习的大规模 MIMO电力系统功率分配研究(Matlab&Python代码实现)
- 【华为云技术分享】基于Atlas 200 DK的原版YOLOv3(基于Darknet-53)实现(Python版本)
- Python实现贝叶斯优化器(Bayes_opt)优化支持向量机分类模型(SVC算法)项目实战
- Python实现基于Optuna超参数自动优化的Catboost回归模型(CatBoostRegressor算法)项目实战
- 【项目实战】Python实现LightGBM分类模型(LGBMClassifier算法)项目实战
- Python:re.sub()实现字符串替换
- DeepID:Python基于Caffe的DeepID2实现人脸识别的简介、实现之详细攻略
- 〖Python自动化办公篇⑲〗 - python实现邮件自动化 - 邮件发送