人脸识别-特征算法

news/2024/10/18 2:26:27/

文章目录

  • 一、LBPH算法
    • 1.基本原理
    • 2.实现步骤
    • 3.代码实现
  • 二、Eigenfaces算法
    • 1.特点
    • 2.代码实习
  • 三、FisherFaces算法
    • 1.算法原理
    • 2.算法特点
    • 3.代码实现
  • 四、总结

人脸识别特征识别器是数字信息发展中的一种生物特征识别技术,其核心在于通过特定的算法和技术手段,从人脸图像中提取出具有区分性和稳定性的特征,用于后续的人脸识别和身份验证。Opencv提供了三种用于识别人脸的特征提取算法。分别是 LBPH 算法、EigenFaces 算法、FisherFaces 算法。以下是对人脸识别特征识别器的详细介绍:

一、LBPH算法

Local Binary Patterns Histograms(LBPH),即局部二值模式直方图,是一种用于图像识别和人脸识别的特征提取方法。以下是对LBPH的详细介绍:

1.基本原理

LBPH算法通过LBP算子描述图像局部纹理特征。LBP算子是一种用于描述图像局部纹理的算子,它将每个像素与其邻域内的像素进行比较,并将比较结果编码为二进制数。然后,通过统计这些二进制数的直方图来提取图像的局部纹理特征。在人脸识别中,LBPH算法将人脸图像划分为多个局部块,并计算每个块的LBP直方图,最后将这些直方图组合起来形成特征向量。

2.实现步骤

1、以每个像素为中心,判断与周围像素灰度值大小关系,对其进行二进制编码,从而获得整幅图像的LBP编码图像;
在这里插入图片描述
2、再将LBP图像分为个区域,获取每个区域的LBP编码直方图,继而得到整幅图像的LBP编码直方图。LBP特征与Haar特征很相似,都是图像的灰度变化特征。
在这里插入图片描述
特点:
通过比较不同人脸图像LBP编码直方图达到人脸识别的目的,其优点是不会受到光照、缩放、旋转和平移的影响。

3.代码实现

import cv2
import numpy as npimages=[]
images.append(cv2.imread('fmjj1.png', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('fmjj2.png', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('ss1.png', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('ss2.png', cv2.IMREAD_GRAYSCALE))
labels = [0, 0, 1, 1]
dic = {0: 'fmjj', 1: 'ss', -1: '无法识别'}
predict_image = cv2.imread('fmjj.png', cv2.IMREAD_GRAYSCALE)recognizer = cv2.face.LBPHFaceRecognizer_create(threshold=80)recognizer.train(images, np.array(labels))label, confidence = recognizer.predict(predict_image)
print('这人是:', dic[label])
print('置信度:', confidence)
aa = cv2.putText(cv2.imread('fmjj.png').copy(), dic[label], (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
cv2.imshow('aa', aa)
cv2.waitKey(0)
cv2.destroyAllWindows()

本代码通过对四张照片进行读取,前两种为同一人图像,后两张为另一人图像,转为灰度图,并设置对应的标签,然后读取测试图片,通过使用LBPHFaceRecognizer来创建一个人脸识别器,并为其设置了一个阈值为80,然后使用测试图像和对应的标签来训练这个识别器。最后使用predict方法来对新的人脸图像进行识别。结果如下:
在这里插入图片描述

二、Eigenfaces算法

基于主成分分析(PCA)的算法,通过对人脸图像进行PCA处理,将高维的人脸数据转换为低维数据,提取出人脸的主要特征。

1.特点

  • 降维效果好:Eigenfaces算法通过PCA降维,将高维的人脸图像数据转换为低维数据,同时保留了人脸的主要特征,有效降低了计算复杂度。
  • 识别精度高:由于Eigenfaces算法提取了人脸图像的主要特征向量,因此在识别阶段能够较好地区分不同的人脸。
  • 对光照和表情变化敏感:然而,Eigenfaces算法对光照和表情变化较为敏感,因为这些变化会改变人脸图像的主要特征向量,从而影响识别精度。

2.代码实习

import cv2
import numpy as npdef image_re(image):a = cv2.imread(image, 0)a = cv2.resize(a, (120, 180))return aimages = []
a = image_re('fmjj1.png')
b = image_re('fmjj2.png')
c = image_re('ss1.png')
d = image_re('ss2.png')
images.append(a)
images.append(b)
images.append(c)
images.append(d)labels = [0, 0, 1, 1]
pre_image = cv2.imread('fmjj.png', 0)
pre_image = cv2.resize(pre_image, (120, 180))recognizer = cv2.face.EigenFaceRecognizer_create()recognizer.train(images, np.array(labels))
label, confidence = recognizer.predict(pre_image)
dic = {0: 'fmjj', 1: 'ss'}
print('这人是:', dic[label])
print("置信度:", confidence)
aa = cv2.putText(cv2.imread('fmjj.png').copy(), dic[label], (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
cv2.imshow('aa', aa)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码基本与上述一致,这里我们使用EigenFaceRecognizer创建人脸识别器,然后再对其进行训练,预测得到最终结果。

三、FisherFaces算法

1.算法原理

Fisherfaces算法的核心思想是利用LDA算法对人脸特征进行降维,并通过计算投影系数,将原始图像投影到低维空间中。这样不仅可以大大减少计算量,提高识别速度,还能在一定程度上保持较高的识别准确率。LDA是一种经典的线性学习方法,它能够在降维的同时考虑类别信息,使得投影后的同类样本点尽可能靠近,异类样本点尽可能远离。

2.算法特点

  • 考虑类别信息:与Eigenfaces算法相比,Fisherfaces算法在降维过程中考虑了类别信息,这使得投影后的特征更具区分性。
  • 对光照和角度变化具有鲁棒性:由于Fisherfaces算法在提取特征时考虑了人脸的几何形状和纹理信息,因此它对光照和角度变化具有一定的鲁棒性。
  • 计算复杂度较高:虽然Fisherfaces算法在识别阶段具有较快的速度,但由于在训练阶段需要计算类内和类间散度矩阵以及投影系数,因此计算复杂度相对较高。

3.代码实现

import cv2
import numpy as npdef image_re(imgae):a = cv2.imread(imgae, 0)a = cv2.resize(a, (120, 180))return aimage = []
a = image_re('fmjj1.png')
b = image_re('fmjj2.png')
c = image_re('ss1.png')
d = image_re('ss2.png')
image.append(a)
image.append(b)
image.append(c)
image.append(d)
labels = [0, 0, 1, 1]
pre_image = image_re('fmjj.png')
recognizer = cv2.face.FisherFaceRecognizer_create()
recognizer.train(image, np.array(labels))
label, confidence = recognizer.predict(pre_image)
dic = {0: 'fmjj', 1: 'ss'}
print("这人是:", dic[label])
print('置信度:', confidence)
aa = cv2.putText(cv2.imread('fmjj.png').copy(), dic[label], (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
cv2.imshow('aa', aa)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、总结

Eigenfaces、Fisherfaces和LBPH都是人脸识别中的经典算法,它们各自具有不同的特点和优势。Eigenfaces和Fisherfaces关注全局信息,而LBPH注重局部特征。在实际应用中,可以根据具体需求和场景选择合适的算法进行人脸识别。例如,在需要处理大规模数据集时,可以选择Eigenfaces算法;在需要注重分类性能时,可以选择Fisherfaces算法;在复杂环境下进行人脸识别时,可以选择LBPH算法。


http://www.ppmy.cn/news/1539877.html

相关文章

【多版本并发控制(MVCC)】

并发事务问题: MySQL隔离级别-未提交读,提交读,可重复读,序列化 隔离级别对于并发事务的解决情况 隔离级别脏读不可重复读幻读未提交读不可不可不可读已提交可不可不可可重复读 (默认)可可不可串行化&…

通过redis实现高性能计费处理逻辑

计费服务一般都是跟资金相关,所以它在系统中是非常核心的模块,要保证服务的高可用、事务一致性、高性能。服务高可用需要集群部署,要保证事务一致性可以通过数据库来实现,但是只通过数据库却很难实现高性能的系统。 这篇文章通过使…

如何在 cPanel 中使用 PHP-FPM

PHP性能一直是影响网站托管的一个重要问题。PHP是当前网络上使用最广泛的服务器编程语言,远远领先于其他语言。最受欢迎的内容管理系统和电子商务应用程序,如WordPress、Joomla、Drupal、Magento等,都是用PHP编写的。 PHP-FPM加速了在繁忙服务…

Node.js基础与应用

目录 1.要求 2.创建第一个Node.js代码 2.1 安装 VSCode 和所需插件 2.2 安装 Node.js 和 Yarn 2.3 创建 Node.js 项目 2.3.1 在 VSCode 中打开一个新文件夹 2.3.2 初始化 Node.js 项目 2.3.3 安装 Express 2.4 编写 Node.js 应用 2.4.1 创建主文件 2.4.2 运行应用 …

unity动态批处理

unity动态批处理 动态批处理要求和兼容性渲染管线兼容性 使用动态批处理网格的动态批处理限制动态生成几何体的动态批处理 动态批处理 动态批处理是一种绘制调用批处理方法,用于批处理移动的 GameObjects 以减少绘制调用。动态批处理在处理网格和 Unity 在运行时动…

SpringBoot框架在购物推荐网站设计中的创新应用

3系统分析 3.1可行性分析 通过对本东大每日推购物推荐网站实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本东大每日推购物推荐网站采用JAVA作为开发语言&…

智能网联汽车安全隐患,如何化解?

0. 智能网联汽车安全问题如何才能解决?1. TARA 威胁分析与风险评估平台2. CSTP 智能网联汽车网络安全测试平台3. 智能网联汽车安全解决方案4. 车联网测试认证与培训解决方案5. 车联网网络安全实验室建设方案 0. 智能网联汽车安全问题如何才能解决? 智能…

双通道音频功率放大电路D2822M兼容TDA2822,全封装输出功率0.11W,用于音频产品

在某客户的便携式音频产品中,客户想在确保其产品的性能的前提下,为产品方案寻找一颗国产备份料。客户产品之前使用的是TDA2822,在了解客户的电路设计以及该产品的电气特性后,给客户寻找了一款可兼容相同电路设计使用的国产厂牌芯谷…