首页 > 编程语言 >人脸识别-特征算法

人脸识别-特征算法

时间:2024-10-20 22:49:39浏览次数:10  
标签:人脸识别 特征 image cv2 算法 人脸 图像 png

文章目录


人脸识别特征识别器是数字信息发展中的一种生物特征识别技术,其核心在于通过特定的算法和技术手段,从人脸图像中提取出具有区分性和稳定性的特征,用于后续的人脸识别和身份验证。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 np

images=[]
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 np

def image_re(image):
    a = cv2.imread(image, 0)
    a = cv2.resize(a, (120, 180))
    return a

images = []
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 np


def image_re(imgae):
    a = cv2.imread(imgae, 0)
    a = cv2.resize(a, (120, 180))
    return a


image = []
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算法。

标签:人脸识别,特征,image,cv2,算法,人脸,图像,png
From: https://blog.csdn.net/2301_77698138/article/details/142980761

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (373)-- 算法导论24.4 5题
    五、请稍微修改Bellman-Ford算法,使其能够在〇(nm)时间内解决由n个未知变量和m个约束条件所构成的差分约束系统问题。如果要写代码,请用go语言。文心一言:Bellman-Ford算法本身就是一个用于解决差分约束系统问题的经典算法,其时间复杂度为......
  • dij算法与小根堆
    dij即利用一个小根堆每次取出队头元素,利用队头元素对其他点进行松弛每当一个点出队,说明他已经是被最小元素松弛过,那么不可能有更优解,那么便打上标记松弛时注意目标点是否已经出队,如果出队说明不能再被松弛注意:dij只能用于没有负边的图内复杂度为O(mlogm)structnode{in......
  • BBR算法: 在Kratos的实现
    什么是BBR?BBR(BottleneckBandwidthandRTT)最初是由Google开发的网络拥塞控制算法。在限流领域,BBR被改造用于自适应限流,通过动态调整并发请求数来平衡系统吞吐量和响应时间。BBR限流算法的核心思想BBR限流算法的核心思想是:持续监控系统的关键指标(CPU使用率、请求通......
  • 基于模糊控制算法的倒立摆控制系统simulink建模与仿真
    1.课题概述      对倒立摆模型进行模糊控制器simulink建模,利用倒立摆的摆角角度与小车的位置来控制小车的推力,控制了倒立摆的摆角问题,使得小车最终停在稳定的位置。 2.系统仿真结果                                        ......
  • 算法笔记-字符串算法集合(未完)
    这里有一些别样的学习思路。KMP用途模式串匹配过程我们分解\(O(nm)\)的算法过程。如图,红色竖线包括的为目前匹配成功的部分,对于下一位\(i\):首先,如果成功匹配,那么匹配长度加一。否则,我们考虑失配情况。我们会将\(S\)串的匹配部分左端点向右移动一位,然后\(T\)串......
  • 基于GWO灰狼优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
    1.算法运行效果图预览(完整程序运行后无水印) 2.算法运行软件版本matlab2022a 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频)a=2*(1-(t/Iters));fori=1:Numforj=1:dimr1=rand;r2=......
  • 代码随想录算法训练营 | 739. 每日温度,496.下一个更大元素 I ,503.下一个更大元素II
    739.每日温度题目链接:739.每日温度文档讲解︰代码随想录(programmercarl.com)视频讲解︰每日温度日期:2024-10-20想法:遍历一遍数组,用栈来存数组下标做记录,因为要找更高得温度,当当前遍历的温度大于栈头存储(存的下标)的温度时,就可以知道栈头要过多少天遇到高温,低的时候直接入栈。J......
  • 人脸识别系统Python深度学习opencv人工智能Keras Tensorflow源码
    项目描述基于opencv,Keras,Tensorflow的人脸识别安装好Anaconda,否则很多科学计算的库要手动安装很麻烦安装好TensorFlow,下面是最简便的方法(但是安装的是cpu版本,但速度相对于GPU版的稍微慢#安装TensorFlowcpu版pipinstalltensorflow#安装keras框架pipinstallkeras#安......
  • 七、朴素贝叶斯算法
    朴素贝叶斯算法前言一、概念二、贝叶斯定理三、朴素贝叶斯分类器四、训练过程第一步:计算计算先验概率第二步:计算条件概率五、模型预测六、常见变体6.1高斯朴素贝叶斯(GaussianNaiveBayes):6.2多项式朴素贝叶斯(MultinomialNaiveBayes):6.3伯努利朴素贝叶斯(BernoulliNa......
  • 快速幂算法
    如何计算,(n是正整数),只需要将a*a*a*a......*a,但它的时间复杂度为O(n)。有什么办法可以快速解决这个问题,比如说:先通过:这个算法的本质是倍增原理比如说,105=1+8+32+64,所以可以写成,将它展开由于很容易计算,所以只需要将它们相乘就可以,但具体是如何实现的可以看见105的二......