【进阶OpenCV】 (15)-- 人脸识别 -- EigenFaces算法

文章目录

EigenFaces算法

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

python 复制代码
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人脸识别器

python 复制代码
# 创建Eigenfaces人脸识别器
recognizer = cv2.face.EigenFaceRecognizer_create()

3. 训练模型

python 复制代码
recognizer.train(images,np.array(labels))

4. 预测图像

python 复制代码
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

总结

本篇介绍了,如何通过EigenFaces算法来进行人脸识别,其中需要注意的是:

  1. 在使用EigenFaces算法进行人脸识别时,传入图像的大小(即尺寸)需要保持一致。
  2. 训练以及测试图像最好使用大头照,减少身体的部分。
相关推荐
烦躁的大鼻嘎2 分钟前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
嵌入式大圣5 分钟前
单片机结合OpenCV
单片机·嵌入式硬件·opencv
xrgs_shz12 分钟前
MATLAB读入不同类型图像并显示图像和相关信息
图像处理·计算机视觉·matlab
C++忠实粉丝19 分钟前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
WeeJot嵌入式24 分钟前
卷积神经网络:深度学习中的图像识别利器
人工智能
脆皮泡泡33 分钟前
Ultiverse 和web3新玩法?AI和GameFi的结合是怎样
人工智能·web3
机器人虎哥36 分钟前
【8210A-TX2】Ubuntu18.04 + ROS_ Melodic + TM-16多线激光 雷达评测
人工智能·机器学习
码银44 分钟前
冲破AI 浪潮冲击下的 迷茫与焦虑
人工智能
用户37791362947551 小时前
【循环神经网络】只会Python,也能让AI写出周杰伦风格的歌词
人工智能·算法
何大春1 小时前
【弱监督语义分割】Self-supervised Image-specific Prototype Exploration for WSSS 论文阅读
论文阅读·人工智能·python·深度学习·论文笔记·原型模式