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

基于OpenCV的PCA+FLD人脸识别

  • 1. 了解ORL人脸识别数据集格式
  • 2. OpenCV环境配置
  • 3. 理解人脸识别OpenCV教程特别是PCA和FLD部分代码,在ORL上运行并分析它们识别结果之间差异
    • 3.1 Eigenfaces
      • 3.1.1 算法描述
      • 3.1.2 实验验证
      • 3.1.3 用eigenfaces(特征脸)重构近似的人脸图像
    • 3.2 Fisherfaces
      • 3.2.1 算法描述
      • 3.2.2 实验验证
    • 3.3 Eigenfaces和Fisherfaces识别结果之间差异


教程官网: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系统下完成,故选择如下版本:
    【模式识别1】PCA+FLD人脸识别_第1张图片

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

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

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

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

  6. 点击“链接器”中的“输入”中的“附加依赖项”,编辑,添加附加依赖项(指明需要用什么库,d.lib表示debug模式,.lib表示release模式,图中只展示了部分):
    【模式识别1】PCA+FLD人脸识别_第2张图片

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

3.1 Eigenfaces

3.1.1 算法描述

Eigenfaces(特征脸,即特征向量)的思想是将人脸从拉长的n维像素空间变换到另一k维空间(k 算法过程暂时省略,后续有空更新。。。

3.1.2 实验验证

  1. 准备数据和标签
    运行教程中的create_csv.py脚本,输出“/path/to/image.ext;0”形式的label,效果如下:
    【模式识别1】PCA+FLD人脸识别_第3张图片

  2. 教程facerec_eigenfaces.cpp程序流程图
    教程中基于OpenCV的facerec_eigenfaces.cpp代码的程序流程图如下:
    【模式识别1】PCA+FLD人脸识别_第4张图片

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

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

  5. 平均脸计算结果可视化
    通过模型可以直接计算训练样本的平均脸。
    在这里插入图片描述
    特征脸如图所示:
    【模式识别1】PCA+FLD人脸识别_第5张图片

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

特征值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
  1. 特征脸计算结果可视化
    取前十个最大特征值对应的特征向量(特征脸),将其标准化恢复成二维灰度图像,并用JET颜色图展示特征脸。
    在这里插入图片描述
    【模式识别1】PCA+FLD人脸识别_第6张图片
  2. 重建人脸并可视化

用一定数量的特征向量(特征脸)将原始图像映射到特征空间的一个点上,再将其重建到像素空间,上图展示了从10个特征脸起,从左至右从上至下依次递增15个特征脸的重建效果。
【模式识别1】PCA+FLD人脸识别_第7张图片

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

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

3.2 Fisherfaces

3.2.1 算法描述

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

3.2.2 实验验证

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

  2. 特征图计算结果可视化
    取前十个最大特征值对应的特征向量(特征脸),将其标准化恢复成二维灰度图像,并用Bone颜色图展示特征脸。
    【模式识别1】PCA+FLD人脸识别_第9张图片

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

特征值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
  1. 重建人脸并可视化
    【模式识别1】PCA+FLD人脸识别_第10张图片

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

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

你可能感兴趣的:(c/c++,模式识别,c++)