| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 基于PCA方法的人脸识别(Python) -> 正文阅读 |
|
[人工智能]基于PCA方法的人脸识别(Python) |
目录 1.PCA简介主成分分析算法(PCA)是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的信息量最大(方差最大),以此使用较少的数据维度,同时保留住较多的原数据点的特性。 PCA降维的目的,就是为了在尽量保证“信息量不丢失”的情况下,对原始特征进行降维,也就是尽可能将原始特征往具有最大投影信息量的维度上进行投影。将原特征投影到这些维度上,使降维后信息量损失最小。
2.照片要求? ? 30个人,每人拍摄10张正脸照片,取每个人的7张照片,共210张作为训练数据。那么每个人剩下的3张照片,计算机还没有看过,就可以在计算机认识了每一个人之后用来考研计算机是否真的能够正确识别图像中的人是谁。 这是我创造的30个人的训练集文件,每个trainxx 下又包含7张照片。 ? 这是我创造的30个人的测试集文件,每个testxx 下又包含3张照片。 ? 3.创建训练人脸库的特征脸空间????????3.1:创建所有训练样本组成的 M×N 矩阵 ?创建所有训练样本组成的 M×N 矩阵 trainFaceMat。M 为样本个数,N 为一 个训练样本? ? ? ? ? ? ? ? ?图像所有像素按行相连的像素值,在本次实验中,?M = 人数(使用的30个人的人脸数据) * 7(每人7张照片)= 210。 N = 像素点的个数,比如说一张照片大小为 10 * 10, N就为100。在本次实验中,我们把每个人的照片都处理成128 * 128,因此N = 16384。
运行结果: ?????????3.2:计算训练样本的平均值矩阵 ?计算训练样本的平均值矩阵meanFaceMat,该矩阵大小为1 * N。1 * N 就代表目前算出? ? ? ? ? ? ? ? ? ? ?来的平均值矩阵是 一张 人脸的数据,这张平均脸其实就是把上面的 M * N 的矩阵? ? ? ? ? ? ?trainFaceMat平均化,把这 M 张照片的每一个位置对应的数值加起来,然后再除以 M。可以理解为把一 个 M * N 的二维数组的每一列都加起来,变成一个 1 * N 的数组,然后这个数组的每一? ? ? ? ?位都除以 M,最后得到一个 1 * N 的平均值脸。
?运行结果: ? ????????3.3:去除平均值,得到规格化后的训练样本矩阵 计算规格化后的训练样本矩阵 normTrainFaceMat,矩阵大小为 M×N。用我们一开始得到的 M*N 的矩阵 trainFaceMat 减去我们的平均脸矩阵meanFaceMat,即计算出我每个人的数据跟这个平均脸的差异,我们把计算结果成为差值矩阵。
运行结果: ?
计算
normTrainFaceMat
的协方差矩阵covariance。
计算 协方差矩阵covariance的特征值eigenvalue和特征向量featurevector。
获取特征值按降序排序对应原矩阵的下标。
????????3.7:保留前K个最大的特征值对应的特征向量
特征向量与特征值是相互对应的,我们可以直接根据刚刚得到的特征值排序
后对应原序列中的索引来得到排序后的特征向量,公式如下:
topk_evecs = featurevector[:, sorted_Index[:-k - 1:-1]]
这是一个由前
k
个特征向量组成的矩阵,一个特征向量可以理解为一个特征,我们
取最具有代表性的
k
个特征来构成我们的特征空间。选取前
k
个特征向量的过程我们叫
做
降维
,
降维的目的
是为了抛弃那些对我们计算影响不大的值,减少计算量,只选前
k
个而不选排名靠后的原因就是因为后面的数据对我们的影响不大,可以抛弃。
K
可以取
150
左右。在这里,我取得是140。
获得训练样本的特征脸空间eigenface 。其中:
eigenface = normTrainFaceMat' * topk_evecs。
注意这个地方的
normTrainFaceMat
是转置了的,它的右上角有个撇,在
numpy
中
要使用
transpose
()方法,对其转置,而“
*
”号代表点乘,在
numpy
中使用
dot
()
函数计算得到的矩阵 eigenface 大小为 N×m,每一列是一个长度为 N 的特征脸,共 m 列。
训练样本在特征脸空间的投影eigen_train_sample。其中:
eigen_train_sample = np.dot(normTrainFaceMat, eigenface)。
?eigen_train_sample 为投影样本矩阵,大小为 M×m,每一行为一个训练样本图 像在特征脸空间的投影。由于 m<<N,经过投影可获得更能描述训练样本图像特征的描述。 4.人脸识别
将测试人脸展开为
1
×
N
矩阵
testFaceMat。
?????????4.2:去除平均值,得到规格化后的识别样本矩阵
计算
eigen_test_sample
与
eigen_train_sample
中各样本(每行)的欧式距离,距离
最小的那个样本则可以认为与待识别样本为同一人。numpy中提供了函数计算欧氏距离,
numpy.linalg.norm( )。
到这一步,人脸识别的算法就完了,后面就自己去写一些界面来丰富自己的人脸识别,下面附上几张图测试一下此算法。 ? ? 因为我使用的所有图片都是学长学姐们自己拍摄的,所以为了保护肖像权······嘿嘿…^o^懂得都懂。? 从发型看还是能看出来是同一个人吧哈哈哈。 在本博客所写代码中,不能实现待识别人脸不在训练集中的提示,他会查找到一张跟欧氏距离最小的照片显示。另因为算法本身就较为简陋,所以识别成功率不是很高。 注:此博客是在我的一位学长写的任务书下完成,文章中部分提及到任务书中的内容,在此感谢那位学长。 ? ? ? ? ? ? ? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/17 20:27:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |