# 特征脸识别
## 实验目的和要求
自己写代码实现 Eigenface 人脸识别的训练与识别过程:
假设每张人脸图像只有一张人脸,且两只眼睛位置已知(即可人工标注给出)。每张图像的眼睛位置存在相应目录下的一个与图像文件名相同但后缀名为 txt 的文本文件里,文本文件中用一行、以空格分隔的 4 个数字表示,分别对应于两只眼睛中心在图像中的位置;
实现两个程序过程(两个执行文件),分别对应训练与识别;
自己构建一个人脸库(至少 40 人,包括自己),课程主页提供一个人脸库可选用;
不能直接调用 OpenCV 里面与 Eigenface 相关的一些函数,特征值与特征向量求解函数可以调用;只能用 C/C++/Python,不能用其他编程语言;GUI 只能用 OpenCV 自带的 HighGUI,不能用 QT 或其他的;平台可以用 Win/Linux/MacOS,建议 Win 优先;
训练程序格式大致为:“mytrain.exe < *能量百分比 >* <*model 文件名 > < 其他参数 >*…”,用能量百分比决定取多少个特征脸,将训练结果输出保存到 model 文件中。同时将前 10 个特征脸拼成一张图像,然后显示出来;
识别程序格式大致为:“mytest.exe < *人脸图像文件名 > <model 文件名 > < 其他参数 >*…”,将 model 文件装载进来后,对输入的人脸图像进行识别,并将识别结果叠加在输入的人脸图像上显示出来,同时显示人脸库中跟该人脸图像最相似的图像。
## 实验内容和原理
PCA
PCA(Principal Components Analysis)是一种统计分析、简化数据集的方法。它利用正交变换来对一系列可能相关的变量的观测值进行线性变换,从而投影为一系列线性不相关变量的值,这些不相关变量称为主成分(Principal Components)。
(线性代数知识回顾:PCA 的数学原理[[http://blog.codinglabs.org/articles/pca-tutorial.html](http://blog.codinglabs.org/articles/pca-tutorial.html)])
基本思想:
将坐标轴中心移到数据的中心,然后旋转坐标轴,使得数据在 C1 轴上的方差最大,即全部 n 个数据个体在该方向上的投影最为分散。意味着更多的信息被保留下来。C1 成为第一主成分。
第二主成分:找一个 C2,使得 C2 与 C1 的协方差(相关系数)为 0,以免与 C1 信息重叠,并且使数据在该方向的方差尽量最大。
以此类推,找到第三主成分,第四主成分……第 p 个主成分。p 个随机变量可以有 p 个主成分。
通过 PCA,可以通过只保留对方差贡献最大的特征的方式来降低数据的维数(可以通过特征值的大小来判断贡献度)。PCA 相当于找到了原有高维数据在低维度的投影钟,数据损失量最小的那个,作为提取出的主要特征。
数学定义:
PCA 的数学定义是:一个正交化线性变换,把数据变换到一个新的坐标系统中,使得这一数据的任何投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推。
定义一个 n × m 的矩阵, XT 为去平均值(以平均值为中心移动至原点)的数据,其行为数据样本,列为数据类别。则 X 的奇异值分解为 X = WΣVT,其中 m × m 矩阵 W 是 XXT 的特征向量矩阵, Σ 是 m × n 的非负矩形对角矩阵,V 是 n × n 的 XTX 的特征向量矩阵。据此:
![](https://www.writebug.com/myres/static/uploads/2022/6/29/10b6ab41e16841b872697391af60bb39.writebug)
当 m < n 1 时,V 在通常情况下不是唯一定义的,而 Y 则是唯一定义的。W 是一个正交矩阵,YTWT=XT,且 YT 的第一列由第一主成分组成,第二列由第二主成分组成,依此类推。
为了得到一种降低数据维度的有效办法,我们可以利用 WL 把 X 映射到一个只应用前面 L 个向量的低维空间中去:
![](https://www.writebug.com/myres/static/uploads/2022/6/29/862997888ca0425b3785c83b5c04f9d5.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/6/29/46a1864d1745b05e3ea98fb05120db03.writebug)
在欧几里得空间给定一组点数,第一主成分对应于通过多维空间平均点的一条线,同时保证各个点到这条直线距离的平方和最小。去除掉第一主成分后,用同样的方法得到第二主成分。依此类推。在 Σ 中的奇异值均为矩阵 XXT 的特征值的平方根。每一个特征值都与跟它们相关的方差是成正比的,而且所有特征值的总和等于所有点到它们的多维空间平均点距离的平方和。
特征脸
可以通过在一大组描述不同人脸的图像上进行主成分分析(PCA)获得。任意一张人脸图像都可以被认为是这些标准脸的组合。例如,一张人脸图像可能是特征脸 1 的 10%,加上特征脸 2 的 55%,在减去特征脸 3 的 3%。值得注意的是,它不需要太多的特征脸来获得大多数脸的近似组合。另外,由于人脸是通过一系列向量(每个特征脸一个比例值)而不是数字图像进行保存,可以节省很多存储空间。
实现:
准备一个训练集的人脸图像。构成训练集的图片需要在相同的照明条件下拍摄的,并将所有图像的眼睛和嘴对齐。他们还必须在预处理阶段就重采样到一个共同的像素分辨率(R×C)。现在,简单地将原始图像的每一行的像素串联在一起,产生一个具有 R×C 个元素的行向量,每个图像被视为一个向量。现在,假定所有的训练集的图像被存储在一个单一的矩阵 T 中,矩阵的每一列是一个图像。
减去均值向量. 均值向量 a 要首先计算,并且 T 中的每一个图像都要减掉均值向量。
计算协方差矩阵 S 的特征值和特征向量。每一个特征向量的维数与原始图像的一致,因此可以被看作是一个图像。因此这些向量被称作特征脸。他们代表了图像与均值图像差别的不同方向。通常来说,这个过程的计算代价很高(如果可以计算的话)。
选择主成分。一个 D x D 的协方差矩阵会产生 D 个特征向量,每一个对应 R × c 图像空间中的一个方向。具有较大特征值的特征向量会被保留下来,一般选择最大的 N 个,或者按照特征值的比例进行保存,如保留前 95%。
这些特征脸现在可以用于标识已有的和新的人脸:我们可以将一个新的人脸图像(先要减去均值图像)投影到特征脸上,以此来记录这个图像与平均图像的偏差。每一个特征向量的特征值代表了训练集合的图像与均值图像在该方向上的偏差有多大。将图像投影到特征向量的子集上可能丢失信息,但是通过保留那些具有较大特征值的特征向量的方法可以减少这个损失。
实验步骤与分析
输入图像的预处理
因为之后也会需要对自己的照片进行处理,所以直接忽略了给出的数据库中的眼睛信息,使用了 python 自带的人脸识别库进行头像裁剪。
对裁剪出的头像做一遍直方图均衡化,平衡不同光照的情况
```c++
img = cv.imread(path, -1)
FACE = cv.CascadeClassifier(r'haarcascade_frontalface_default.xml')
Scan = FACE.detectMultiScale(img,scaleFactor=1.1,minNeighbors=3)
if len(Scan) == 1 :
for (x,y,w,h) in Scan:
cropped = img[y:y+h, x:x+w]
# cropped is where face is
cv.rectangle(img, (x,y), (x+w, y+h), (255, 255, 255), 1)
cropped = cv.equalizeHist(cropped)
cropped = cv.resize(cropped, (250, 250))
# change it to 250 * 250 (then will be 62500)
cv.imshow("ori",img)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
假设每张人脸图像只有一张人脸,且两只眼睛位置已知(即可人工标注给出)。每张图像的眼睛位置存在相应目录下的一个与图像文件名相同但后缀名为 txt 的文本文件里,文本文件中用一行、以空格分隔的 4 个数字表示,分别对应于两只眼睛中心在图像中的位置; 实现两个程序过程(两个执行文件),分别对应训练与识别; 自己构建一个人脸库(至少 40 人,包括自己),课程主页提供一个人脸库可选用; 不能直接调用 OpenCV 里面与 Eigenface 相关的一些函数,特征值与特征向量求解函数可以调用;只能用 C/C++/Python,不能用其他编程语言;GUI 只能用 OpenCV 自带的 HighGUI,不能用 QT 或其他的;平台可以用 Win/Linux/MacOS,建议 Win 优先;
资源推荐
资源详情
资源评论
收起资源包目录
基于Python实现特征脸识别【100010959】 (278个子文件)
报告.docx 1.67MB
BioID_0082.eye 29B
BioID_0028.eye 29B
BioID_0016.eye 29B
BioID_0026.eye 29B
BioID_0085.eye 29B
BioID_0117.eye 29B
BioID_0035.eye 29B
BioID_0066.eye 29B
BioID_0077.eye 29B
BioID_0110.eye 29B
BioID_0102.eye 29B
BioID_0019.eye 29B
BioID_0079.eye 29B
BioID_0076.eye 29B
BioID_0106.eye 29B
BioID_0124.eye 29B
BioID_0101.eye 29B
BioID_0081.eye 29B
BioID_0021.eye 29B
BioID_0100.eye 29B
BioID_0120.eye 29B
BioID_0027.eye 29B
BioID_0119.eye 29B
BioID_0018.eye 29B
BioID_0086.eye 29B
BioID_0034.eye 29B
BioID_0126.eye 29B
BioID_0013.eye 29B
BioID_0111.eye 29B
BioID_0015.eye 29B
BioID_0103.eye 29B
BioID_0094.eye 29B
BioID_0009.eye 29B
BioID_0031.eye 29B
BioID_0080.eye 29B
BioID_0014.eye 29B
BioID_0045.eye 29B
BioID_0040.eye 29B
BioID_0104.eye 29B
BioID_0123.eye 29B
BioID_0025.eye 29B
BioID_0046.eye 29B
BioID_0121.eye 29B
BioID_0020.eye 29B
BioID_0099.eye 29B
BioID_0037.eye 29B
BioID_0070.eye 29B
BioID_0122.eye 29B
BioID_0012.eye 29B
BioID_0084.eye 29B
BioID_0089.eye 29B
BioID_0087.eye 29B
BioID_0038.eye 29B
BioID_0115.eye 29B
BioID_0044.eye 29B
BioID_0109.eye 29B
BioID_0113.eye 29B
BioID_0011.eye 29B
BioID_0108.eye 29B
BioID_0041.eye 29B
BioID_0010.eye 29B
BioID_0125.eye 29B
BioID_0033.eye 29B
BioID_0032.eye 29B
BioID_0105.eye 29B
BioID_0029.eye 29B
BioID_0078.eye 29B
BioID_0036.eye 29B
BioID_0024.eye 29B
BioID_0083.eye 29B
BioID_0042.eye 29B
BioID_0039.eye 29B
BioID_0107.eye 29B
BioID_0043.eye 29B
BioID_0075.eye 29B
BioID_0023.eye 29B
BioID_0022.eye 29B
BioID_0112.eye 29B
BioID_0017.eye 29B
BioID_0098.eye 29B
BioID_0030.eye 29B
BioID_0088.eye 29B
BioID_0118.eye 29B
BioID_0114.eye 29B
BioID_0116.eye 29B
BioID_0056.eye 28B
BioID_0047.eye 27B
BioID_0067.eye 27B
BioID_0090.eye 27B
BioID_0072.eye 27B
BioID_0096.eye 27B
BioID_0097.eye 27B
BioID_0048.eye 27B
BioID_0074.eye 27B
BioID_0058.eye 27B
BioID_0095.eye 27B
BioID_0052.eye 27B
BioID_0006.eye 27B
BioID_0007.eye 27B
共 278 条
- 1
- 2
- 3
资源评论
- 明溪8702023-06-25资源很实用,对我启发很大,有很好的参考价值,内容详细。
神仙别闹
- 粉丝: 2674
- 资源: 7640
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功