热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用LBPH算法理解人脸识别

介绍**LBPH(LocalBinaryPatternHistogram,局部二进制模式直方图)**是一种人脸识别算法,用于

介绍

**LBPH(Local Binary Pattern Histogram,局部二进制模式直方图)**是一种人脸识别算法,用于识别人脸。它以其性能以及如何能够从正面和侧面识别人脸而闻名。

在开始了解 LBPH 算法之前,让我们先了解一下图像和像素的基础知识,以便在我们开始有关人脸识别的内容之前,了解图像是如何表示的。

因此,让我们开始了解图像和像素。

图像和像素

所有图像都以矩阵格式表示,如你在此处所见,由行和列组成。图像的基本组成部分是像素。图像由一组像素组成。每一个都是小方格。通过将它们并排放置,我们可以形成完整的图像。单个像素被认为是图像中最少可能的信息。对于每张图像,像素值的范围在 0 到 255 之间。

此图像宽 32 像素,高 32 像素。

而当我们将 32 乘以 32 时,结果是 1024,也就是图像中的总像素数。每个像素由三个值组成:R、G、B,分别是红、绿、蓝的基本颜色。

这三种基本颜色的组合将在图像中创建所有这些颜色,因此我们得出结论,单个像素具有三个通道,每个基本颜色一个通道。

由于现在我们对图像和像素有了一些了解,现在就更容易理解 LBPH 算法了。

LBPH(局部二进制模式直方图)

让我们从分析表示图像片段的矩阵开始。正如你之前了解到的,图像以这些格式表示。在这个例子中,我们有三行三列,像素总数为九。让我们在这里选择中心像素,值为 8,并应用一个条件。

如果该值大于或等于 8,则结果为 '1',否则,如果该值小于 8,则结果为零。使用此条件后,矩阵现在看起来像这样。

这个算法的基本计算就是应用这个条件,选择矩阵的中心元素。现在我们需要生成一个二进制值。二进制值 = 11100010 。算法将开始应用从左上角元素到第 2 行的 1 元素的条件,就像它正在制作一个这样的圆圈。

将二进制值转换为十进制值后,我们得到**十进制值 = 226。**它表示中心值周围的所有这些像素等于 226。

当涉及到亮斑时,该算法是稳健的。如果将手电筒放在图像上,像素值会增加。值越高,图像越亮,值越低,图像越暗。

由于这个原因,该算法在明暗图像上都有很好的效果,因为当图像变亮或变暗时,这里的邻域内的所有像素都会发生变化。将光放在图像上后,矩阵将如下所示。应用上述条件后,我们将得到与上述相同的二进制值,即11100010

让我们在这里考虑另一个图像。为了更好地理解算法将如何识别人脸。

我们这里有一张脸的图像,算法将做的是创建几个正方形。

例如,这里的方格不只代表一个像素,而是设置了三行四列的多个像素。三乘四等于这些方格中总共十二个像素,每个方格都是十二个像素。然后我们将该条件应用于每一个。考虑中心像素。

下一步是创建直方图,这是一个统计概念,将计算每种颜色在每个方格中出现的次数。这是直方图的表示。

例如,如果值 110 出现 50 次,则将创建此大小等于 50 的条形,如果 201 出现 110 次,则将在此直方图中创建此大小等于 100 的另一个条形。

通过对直方图的比较,算法将能够识别图像的边缘和角。例如,在第一个方格中,我们没有关于人脸的信息。因此直方图将不同于另一个具有人脸边缘的方格。

总之,算法知道哪些直方图代表边界,哪些直方图代表人的主要特征,比如眼睛的颜色、嘴巴的形状等等。

所以这就是这个算法的基本理论,它基于直方图的创建和比较。

现在让我们开始编码部分

注意:如果你在导入 cv2 库时遇到错误,例如“No module named 'cv2.cv2”。然后你就可以在 google colab 中编写代码了。我已经在 Google Colab 中编写了这段代码。

我将使用 yaleface 数据集

1. 导入库

import osimport cv2import zipfileimport numpy as npfrom google.colab.patches import cv2_imshow

2. 数据收集

path = "/content/drive/MyDrive/Datasets/yalefaces.zip"
zip_obj = zipfile.ZipFile(file = path,mode='r')
zip_obj.extractall('./')
zip_obj.close()

3. 数据清洗

在向模型提供数据之前,这些图像是 .gif 格式,因此我们需要将它们转换为 ndarray,因此我们需要使用以下代码

from PIL import Image

def get_image_data() :paths = [os.path.join("/content/yalefaces/train",f)for f in os.listdir(path="/content/yalefaces/train")]faces = []ids = []#faces will contain the px of the images#path will contain the path of the imagesfor path in paths :image = Image.open(path).convert('L')image_np = np.array(image,'uint8')id = int(os.path.split(path)[1].split(".")[0].replace("subject"," "))ids.append(id)faces.append(image_np)return np.array(ids),faces
ids , faces = get_image_data()

4. 模型训练

lbph_classifier = cv2.face.LBPHFaceRecognizer_create()
lbph_classifier.train(faces,ids)#Below line will store the histograms for each one of the iamges
lbph_classifier.write('lbph_classifier.yml')

5. 识别人脸

lbph_face_classifier = cv2.face.LBPHFaceRecognizer_create()
lbph_face_classifier.read("/content/lbph_classifier.yml")#Now we will check the performance of model test_image = "/content/yalefaces/test/subject03.leftlight.gif"
image = Image.open(test_image).convert('L')
image_np = np.array(image,'uint8')#Before giving the image to the model lets check it first
cv2_imshow(image_np)
predictions = lbph_face_classifier.predict(image_np)
print(predictions)expected_output = int(os.path.split(test_image)[1].split('.')[0].replace("subject"," "))
print(expected_output)
3<-That&#39;s our output

这是我们将要测试的图像

第一个参数给出检测到的人脸&#xff0c;第二个参数给出置信度。这是我们从 print(predictions) 得到的输出

cv2.putText(image_np, &#39;Pred.&#39; &#43;str(predictions[0]),(10,30),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,0))
cv2.putText(image_np, &#39;Expec.&#39; &#43;str(expected_output),(10,50),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,0)
)
cv2_imshow(image_np)

最后结果

结论

在本文中&#xff0c;我们介绍了以下内容&#xff1a;

  • 什么是LBPH算法

  • LBPH算法如何识别人脸并进行计算

  • 理解代码如何使用LBPH算法识别人脸

☆ END ☆

如果看到这里&#xff0c;说明你喜欢这篇文章&#xff0c;请转发、点赞。微信搜索「uncle_pn」&#xff0c;欢迎添加小编微信「 woshicver」&#xff0c;每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓



推荐阅读
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • java drools5_Java Drools5.1 规则流基础【示例】(中)
    五、规则文件及规则流EduInfoRule.drl:packagemyrules;importsample.Employ;ruleBachelorruleflow-group ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • 前言:拿到一个案例,去分析:它该是做分类还是做回归,哪部分该做分类,哪部分该做回归,哪部分该做优化,它们的目标值分别是什么。再挑影响因素,哪些和分类有关的影响因素,哪些和回归有关的 ... [详细]
  • 原文链接:Python:获取“3年前的今天”的日期时间Python:getdatetimefor3yearsagotoday在Python中,如何获取3年前的今天的datetime ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • 语义分割系列3SegNet(pytorch实现)
    SegNet手稿最早是在2015年12月投出,和FCN属于同时期作品。稍晚于FCN,既然属于后来者,又是与FCN同属于语义分割网络 ... [详细]
  • 做实验需要重命名数据集的名字,有几个容易踩坑的地方和小技巧,总结一下importospathfilelistos.listdir(path)#文件夹路 ... [详细]
  • 说出来你可能不信,我用三天做了一个完整的项目
    Java在人工智能中能起到什么作用?作为编程语言中的扛把子,Java20多年稳定不倒,就在于它的稳定性,维护成本极低。这使得 ... [详细]
  • 2017亚马逊人工智能奖公布:他们的AI有什么不同?
    事实上,在我们周围,“人工智能”让一切都变得更“智能”极具讽刺意味。随着人类与机器智能之间的界限变得模糊,我们的世界正在变成一个机器 ... [详细]
  • 基于深度学习的遥感应用
    文章目录深度学习的发展过程深度学习在遥感中的应用基于深度学习的遥感样例库建设基于深度学习的遥感影像目标及场景检索基于深度学习的建筑物提取基于深度学习的密集建筑物自动检测基于深度学习 ... [详细]
author-avatar
手机用户2502904013
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有