EigenFaces算法

时间:2024-10-17 17:58:00

EigenFaces算法是一种基于主成分分析(PCA)的人脸识别方法,其核心思想是通过矩阵的压缩算法,在减少矩阵维数的同时尽可能地保留原矩阵的信息,以此来提取人脸的主要特征并进行识别。以下是对EigenFaces算法的详细介绍:

一、算法原理

  1. 主成分分析(PCA):PCA是一种常用的数据分析方法,它通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。在EigenFaces算法中,PCA被用于将人脸图像从高维空间投影到低维空间,同时保留人脸的主要特征。
  2. 特征脸(Eigenfaces):特征脸是基于PCA原理生成的一组特征向量的名称。这些特征向量代表了人脸图像的主要特征,可以用于人脸识别。在EigenFaces算法中,首先通过计算人脸图像的协方差矩阵,然后求解其特征值和特征向量,最后选取前几个最大的特征值对应的特征向量作为特征脸。

二、算法流程

  1. 数据预处理:收集人脸图像数据库,将每个人脸图像进行预处理,如裁剪、旋转、缩放等,以确保图像的一致性和准确性。
  2. 计算平均脸:将预处理后的人脸图像按行串成一维向量,并计算所有人脸向量的平均值,得到平均脸向量。
  3. 计算差值向量:将每个人脸向量减去平均脸向量,得到差值向量。这些差值向量反映了每个人脸与平均脸的差异。
  4. 计算协方差矩阵:根据差值向量计算协方差矩阵,该矩阵反映了人脸图像中各像素之间的相关性。
  5. 求解特征值和特征向量:计算协方差矩阵的特征值和特征向量,并选取前几个最大的特征值对应的特征向量作为特征脸。
  6. 特征提取与比对:将原始人脸图像投影到特征脸空间中,得到人脸的特征向量。然后,将待识别的人脸图像也进行同样的特征提取,并与存储在人脸数据库中的特征向量进行比对,找出最接近的特征向量,从而完成人脸识别。

三、算法特点

  1. 降维效果好:EigenFaces算法通过PCA降维方法,将高维的人脸图像数据投影到低维空间,同时保留了人脸的主要特征,大大降低了计算复杂度和存储需求。
  2. 识别准确率高:由于EigenFaces算法能够提取人脸的主要特征,因此在人脸识别中具有较高的准确率。
  3. 对光照和表情变化具有一定的鲁棒性:虽然EigenFaces算法对光照和表情变化敏感,但通过适当的预处理和特征提取方法,可以在一定程度上提高其对光照和表情变化的鲁棒性。

四、代码步骤

1. 图像预处理

准备好训练图像以及对应的标签,还有待识别图像:

注意!!!:在使用EigenFaces算法进行人脸识别时,传入图像的大小(即尺寸)需要保持一致

因为基于PCA进行降维处理提取人脸的主要特征的过程中,需要将人脸图像转换为矩阵形式,并按照一定的规则(如按行或按列)将其转换为一维向量。如果图像的大小不一致,那么转换后的一维向量的维度也会不同,这将导致算法无法正确处理这些向量。

import cv2
import numpy as np

"""-----图像预处理----- """
images = []
a = cv2.imread('f1.jpg',0)
a = cv2.resize(a,(100,75))
b = cv2.imread('f2.jpg',0)
b = cv2.resize(a,(100,75))
c = cv2.imread('z1.jpg',0)
c = cv2.resize(a,(100,75))
d = cv2.imread('z2.jpg',0)
d = cv2.resize(a,(100,75))

images.append(a)
images.append(b)
images.append(c)
images.append(d)

labels = [0,0,1,1]
pre_image = cv2.imread('f_test.jpg',0)
pre_image = cv2.resize(pre_image,(100,75))

2. 创建Eigenfaces人脸识别器

# 创建Eigenfaces人脸识别器
recognizer = cv2.face.EigenFaceRecognizer_create()

3. 训练模型

recognizer.train(images,np.array(labels))

4. 预测图像

label,confidence = recognizer.predict(pre_image)
dic = {0:'yifei',1:"zrn"}
print('这人是',dic[label])
print('置信度',confidence)
aa = cv2.putText(cv2.imread('f_test.jpg').copy(),dic[label],(10,30),cv2.FONT_HERSHEY_SIMPLEX,
                 0.9,(0,0,255),2)
cv2.imshow('xx',aa)
cv2.waitKey(0)
-------------------
这人是 yifei
置信度 3772.118831043097