【模式识别1】PCA+FLD人脸识别

本文详细介绍了基于OpenCV的PCA+FLD人脸识别技术,包括ORL数据集格式、OpenCV环境配置及PCA(Eigenfaces)与FLD(Fisherfaces)的算法描述和实验验证。实验结果显示,Fisherfaces作为有监督学习方法,在人脸识别中能更好地捕捉区分特征,而Eigenfaces在图像重构方面表现更优。两者识别结果各有特点,适用于不同的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


教程官网:https://docs.opencv.org/2.4/modules/contrib/doc/facerec/facerec_tutorial.html
用到的数据集、代码等资源文件:

  1. ORL数据集
  2. create_csv.py----打印ORL数据集标签文件的脚本
  3. facerec_eigenfaces.cpp----文中Eigenfaces相关部分代码
  4. facerec_fisherfaces.cpp----文中Fisherfaces相关部分代码

1. 了解ORL人脸识别数据集格式

AT&T Facedatabase,也称为ORL人脸数据库,包含40个不同对象,每个对象有10张不同图像,每张图像通道数、高、宽为[1, 112, 92]。受试者图像是在不同时间、光线、面部表情(睁眼/闭眼、微笑/不微笑)和面部细节(戴眼镜/不戴眼镜)下拍摄的。所有的图像都是在黑暗的均匀背景下拍摄的,受试者处于直立的正面位置(允许存在一定的侧移)。

2. OpenCV环境配置

  1. 进入官网https://opencv.org/,选择“Library”库目录,选择适合系统的版本开始下载,本次作业在Win11系统下完成,故选择如下版本:
    在这里插入图片描述

  2. 下载完成后运行.exe文件,将OpenCV库安装在期望的目录下。

  3. 添加环境变量,在用户变量“Path”中新建变量:
    在这里插入图片描述

  4. 新建Visual Studio 2022项目,右击“项目”,点击“属性”,点击VC++目录中的“包含目录”,编辑,添加include路径:
    在这里插入图片描述

  5. 点击VC++中的“库目录”,编辑,添加lib路径:
    在这里插入图片描述

  6. 点击“链接器”中的“输入”中的“附加依赖项”,编辑,添加附加依赖项(指明需要用什么库,d.lib表示debug模式,.lib表示release模式,图中只展示了部分):
    在这里插入图片描述

3. 理解人脸识别OpenCV教程特别是PCA和FLD部分代码,在ORL上运行并分析它们识别结果之间差异

3.1 Eigenfaces

3.1.1 算法描述

Eigenfaces(特征脸,即特征向量)的思想是将人脸从拉长的n维像素空间变换到另一k维空间(k<n),使得同类物体在另一空间中聚集,不同类物体在另一空间中距离较远,从而在另一空间做相似性的计算。Eigenfaces选择的空间变换方法是PCA,它广泛应用于预处理以消去样本特征维度之间的相关性。EigenFaces利用PCA得到人脸分布的主要成分,即对训练集中所有人脸图像的协方差矩阵进行特征值分解,得到对应k个特征向量(即特征脸)。
算法过程暂时省略,后续有空更新。。。

3.1.2 实验验证

  1. 准备数据和标签
    运行教程中的create_csv.py脚本,输出“/path/to/image.ext;0”形式的label,效果如下:
    在这里插入图片描述

  2. 教程facerec_eigenfaces.cpp程序流程图
    教程中基于OpenCV的facerec_eigenfaces.cpp代码的程序流程图如下:
    在这里插入图片描述

  3. 读取图像和标签
    获取①中标签文件所在路径。
    在这里插入图片描述
    分别定义存储图像和标签的数组。
    在这里插入图片描述
    将标签文件中的图像路径和图像类别分别存入图像数组images和标签数组labels。
    在这里插入图片描述

  4. 训练模型并测试一张图片
    获取测试数据(数组中最后一张图片),并将它从训练集中移除。
    在这里插入图片描述
    初始化EigenFace模型并训练。
    在这里插入图片描述
    获取测试图片的识别结果,并将结果进行打印
    在这里插入图片描述
    识别结果如下:
    在这里插入图片描述
    可以看出,预测结果与真实值一致,识别正确。

  5. 平均脸计算结果可视化
    通过模型可以直接计算训练样本的平均脸。
    在这里插入图片描述
    特征脸如图所示:
    在这里插入图片描述

  6. 特征值计算结果记录
    通过模型可以直接获取训练集的特征值,下表记录了前十个最大的特征值。

特征值1特征值2特征值3特征值4特征值5
2819989.115722062664.432411096663.64953894183.32702818967.15747
特征值6特征值7特征值8特征值9特征值10
537972.44192392438.01898372326.54572313616.90351288570.19349
  1. 特征脸计算结果可视化
    取前十个最大特征值对应的特征向量(特征脸),将其标准化恢复成二维灰度图像,并用JET颜色图展示特征脸。
    在这里插入图片描述
    在这里插入图片描述
  2. 重建人脸并可视化

用一定数量的特征向量(特征脸)将原始图像映射到特征空间的一个点上,再将其重建到像素空间,上图展示了从10个特征脸起,从左至右从上至下依次递增15个特征脸的重建效果。
在这里插入图片描述

3.1.3 用eigenfaces(特征脸)重构近似的人脸图像

3.1.2节中第⑧步展示了以不同数量的eigenfaces重建近似的人脸图像的过程,使用的eigenfaces数量由10个逐渐递增到295个,但都存在不同程度的信息丢失情况,不如原图像平滑。而在debug过程中发现,特征值分解后得到的特征脸数量为399:
在这里插入图片描述
因此,继续增加特征脸的数量,下图可以看出,当特征脸数量增加到350时,重构图像已经很原图较为接近,即达到了人脸重构的效果,如下图所示。
在这里插入图片描述

3.2 Fisherfaces

3.2.1 算法描述

PCA是EigenFaces人脸识别的核心,它找到了最大化数据方差的特征的线性组合。但它具有明显的缺点,若方差是由外部来源引起的(如光照),则可能模型会损失许多人脸的特征信息,从而失去判别能力。
而Fisherfaces采用LDA(Linear Discriminant Analysis,线性判别分析)实现人脸识别。其基本原理是让数据在低维表示下,同类应该紧密聚集,异类应该尽可能分散,且它们之间的距离尽可能远。做线性判别分析时,首先将训练集样本投影到一条直线,让投影后的点满足(1)同类间的点尽可能靠近。(2)异类间的点尽可能远离。预测时,将待测样本投影到直线上,根据投影点的位置判定样本的类别。

3.2.2 实验验证

  1. 训练模型并测试一张图片
    训练后的Fisherfaces模型对测试图片的预测结果为:
    在这里插入图片描述
    可以看出,预测结果与真实值一致,识别正确。

  2. 特征图计算结果可视化
    取前十个最大特征值对应的特征向量(特征脸),将其标准化恢复成二维灰度图像,并用Bone颜色图展示特征脸。
    在这里插入图片描述

  3. 特征值计算结果记录
    通过模型可以直接获取训练集的特征值,下表记录了前十个最大的特征值。

特征值1特征值2特征值3特征值4特征值5
46343770.4515112526.757252156.949291202.72304643.75567
特征值6特征值7特征值8特征值9特征值10
415.09794364.10602216.88946160.48730134.74498
  1. 重建人脸并可视化
    在这里插入图片描述

3.3 Eigenfaces和Fisherfaces识别结果之间差异

与Eigenfaces无监督学习方法相比,Fisherfaces是有监督的人脸识别方法,它主要为了识别用于区分对象的特征,因此难以重建回高质量的人脸图像。然而Eigenfaces将原图像投影到另一空间时,保留了人脸分布的主要成分,因此在反投影回图像时,重构的效果更好。

### PAC FLD人脸识别技术 #### PCA (Principal Component Analysis, 主成分分析) PCA 是一种用于降维的技术,在人脸识别领域通常被称为“特征脸”。该方法通过计算协方差矩阵并找到其最大特征向量来表示图像的主要变化方向。这些主要变化方向构成了新的坐标轴,使得数据可以在更低维度空间中被有效表达。 对于给定的一组人脸图片集合 $X$ ,可以按照如下方式应用 PCA1. 计算平均脸 $\mu$ 2. 构建零均值化后的样本集 $Y=X-\mu$ 3. 求解协方差矩阵 $C=YY^{T}$ 4. 找出前 k 大的特征值对应的特征向量作为投影基底 V 5. 将原始输入映射到低维子空间得到特征脸 Z = YV ```python from sklearn.decomposition import PCA def pca_transform(images, n_components): pca = PCA(n_components=n_components) transformed_images = pca.fit_transform(images.reshape(len(images), -1)) return transformed_images, pca.components_ ``` [^1] #### LDA (Linear Discriminant Analysis, 线性判别分析) LDA 不仅考虑了类内差异还关注不同类别之间的区别度。具体来说就是寻找能够最大化类间散布同时最小化类内散布的方向来进行分类决策边界划分。这有助于提高识别率特别是在多个人物区分场景下效果更佳显著。 假设存在 C 类训练样例,则可以通过下面几个步骤完成 LDA: 1. 分别求得每类别的均值向量 ${\mu_i}$ 及总体均值 μ 2. 计算类内离散度 S_W 与类间离散度 S_B 3. 解广义特征值问题 $(S_{B}-λS_{W})w=0$, 获取最优投影矢量 w* 4. 利用获得的最佳变换矩阵 W* 对测试样本做线性转换 y=W*x ```python import numpy as np from sklearn.discriminant_analysis import LinearDiscriminantAnalysis def lda_transform(features, labels, n_components=None): lda = LinearDiscriminantAnalysis(n_components=n_components) transformed_features = lda.fit_transform(features, labels) return transformed_features, lda.scalings_ ``` 当结合使用 PCA LDA 进行人脸识别时,一般先利用 PCA 来减少数据维度从而降低后续处理复杂度;然后再采用 LDA 提取最具辨别力的信息以便于最终分类判断。这种组合策略能够在保持较高精度的同时加快运算速度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wilbur11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值