赞
踩
教程官网:https://docs.opencv.org/2.4/modules/contrib/doc/facerec/facerec_tutorial.html
用到的数据集、代码等资源文件:
AT&T Facedatabase,也称为ORL人脸数据库,包含40个不同对象,每个对象有10张不同图像,每张图像通道数、高、宽为[1, 112, 92]。受试者图像是在不同时间、光线、面部表情(睁眼/闭眼、微笑/不微笑)和面部细节(戴眼镜/不戴眼镜)下拍摄的。所有的图像都是在黑暗的均匀背景下拍摄的,受试者处于直立的正面位置(允许存在一定的侧移)。
进入官网https://opencv.org/,选择“Library”库目录,选择适合系统的版本开始下载,本次作业在Win11系统下完成,故选择如下版本:
下载完成后运行.exe文件,将OpenCV库安装在期望的目录下。
添加环境变量,在用户变量“Path”中新建变量:
新建Visual Studio 2022项目,右击“项目”,点击“属性”,点击VC++目录中的“包含目录”,编辑,添加include路径:
点击VC++中的“库目录”,编辑,添加lib路径:
点击“链接器”中的“输入”中的“附加依赖项”,编辑,添加附加依赖项(指明需要用什么库,d.lib表示debug模式,.lib表示release模式,图中只展示了部分):
Eigenfaces(特征脸,即特征向量)的思想是将人脸从拉长的n维像素空间变换到另一k维空间(k<n),使得同类物体在另一空间中聚集,不同类物体在另一空间中距离较远,从而在另一空间做相似性的计算。Eigenfaces选择的空间变换方法是PCA,它广泛应用于预处理以消去样本特征维度之间的相关性。EigenFaces利用PCA得到人脸分布的主要成分,即对训练集中所有人脸图像的协方差矩阵进行特征值分解,得到对应k个特征向量(即特征脸)。
算法过程暂时省略,后续有空更新。。。
准备数据和标签
运行教程中的create_csv.py脚本,输出“/path/to/image.ext;0”形式的label,效果如下:
教程facerec_eigenfaces.cpp程序流程图
教程中基于OpenCV的facerec_eigenfaces.cpp代码的程序流程图如下:
读取图像和标签
获取①中标签文件所在路径。
分别定义存储图像和标签的数组。
将标签文件中的图像路径和图像类别分别存入图像数组images和标签数组labels。
训练模型并测试一张图片
获取测试数据(数组中最后一张图片),并将它从训练集中移除。
初始化EigenFace模型并训练。
获取测试图片的识别结果,并将结果进行打印
识别结果如下:
可以看出,预测结果与真实值一致,识别正确。
平均脸计算结果可视化
通过模型可以直接计算训练样本的平均脸。
特征脸如图所示:
特征值计算结果记录
通过模型可以直接获取训练集的特征值,下表记录了前十个最大的特征值。
特征值1 | 特征值2 | 特征值3 | 特征值4 | 特征值5 |
---|---|---|---|---|
2819989.11572 | 2062664.43241 | 1096663.64953 | 894183.32702 | 818967.15747 |
特征值6 | 特征值7 | 特征值8 | 特征值9 | 特征值10 |
---|---|---|---|---|
537972.44192 | 392438.01898 | 372326.54572 | 313616.90351 | 288570.19349 |
用一定数量的特征向量(特征脸)将原始图像映射到特征空间的一个点上,再将其重建到像素空间,上图展示了从10个特征脸起,从左至右从上至下依次递增15个特征脸的重建效果。
3.1.2节中第⑧步展示了以不同数量的eigenfaces重建近似的人脸图像的过程,使用的eigenfaces数量由10个逐渐递增到295个,但都存在不同程度的信息丢失情况,不如原图像平滑。而在debug过程中发现,特征值分解后得到的特征脸数量为399:
因此,继续增加特征脸的数量,下图可以看出,当特征脸数量增加到350时,重构图像已经很原图较为接近,即达到了人脸重构的效果,如下图所示。
PCA是EigenFaces人脸识别的核心,它找到了最大化数据方差的特征的线性组合。但它具有明显的缺点,若方差是由外部来源引起的(如光照),则可能模型会损失许多人脸的特征信息,从而失去判别能力。
而Fisherfaces采用LDA(Linear Discriminant Analysis,线性判别分析)实现人脸识别。其基本原理是让数据在低维表示下,同类应该紧密聚集,异类应该尽可能分散,且它们之间的距离尽可能远。做线性判别分析时,首先将训练集样本投影到一条直线,让投影后的点满足(1)同类间的点尽可能靠近。(2)异类间的点尽可能远离。预测时,将待测样本投影到直线上,根据投影点的位置判定样本的类别。
训练模型并测试一张图片
训练后的Fisherfaces模型对测试图片的预测结果为:
可以看出,预测结果与真实值一致,识别正确。
特征图计算结果可视化
取前十个最大特征值对应的特征向量(特征脸),将其标准化恢复成二维灰度图像,并用Bone颜色图展示特征脸。
特征值计算结果记录
通过模型可以直接获取训练集的特征值,下表记录了前十个最大的特征值。
特征值1 | 特征值2 | 特征值3 | 特征值4 | 特征值5 |
---|---|---|---|---|
46343770.45151 | 12526.75725 | 2156.94929 | 1202.72304 | 643.75567 |
特征值6 | 特征值7 | 特征值8 | 特征值9 | 特征值10 |
---|---|---|---|---|
415.09794 | 364.10602 | 216.88946 | 160.48730 | 134.74498 |
与Eigenfaces无监督学习方法相比,Fisherfaces是有监督的人脸识别方法,它主要为了识别用于区分对象的特征,因此难以重建回高质量的人脸图像。然而Eigenfaces将原图像投影到另一空间时,保留了人脸分布的主要成分,因此在反投影回图像时,重构的效果更好。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。