使用Python,OpenCV与本地二进制模式(LBP)进行人脸识别

  • 1. 效果图
  • 2. 原理及步骤
    • 2.1 原理
    • 2.2 步骤
  • 3. 源码
  • 参考

在深度学习和暹罗网络之前,面部识别算法依赖于特征提取和机器学习。

这篇博客将介绍如何使用本地二进制模式(Local Binary Patterns LBP),OpenCV和CV2.Face.LbphFacerEgnizer_Create进行人脸识别功能。

1. 效果图

2. 原理及步骤

2.1 原理

首先是应用CALTECH FACES数据集,这是评估面部识别算法的基准数据集。
然后审查了Ahonen等人介绍的LBPS面部识别算法。这种方法非常简单且有效。整个算法基本上由三个步骤组成:

  1. 将每个输入图像的面部划分为7×7等大小的单元格;
  2. 从每个单元中提取局部二进制模式。根据如何辨别每个细胞用于人脸识别来度量它们,最后连接7×7 = 49直方图以形成最终特征向量;
  3. 使用具有k = 1的的K-NN分类器和x^2距离度量来执行面部识别。

在Caltech面对数据集上训练脸部识别器,可获得98%的准确性。

2.2 步骤

  1. 给定数据集中的面部,算法的第一步是将面部划分为7×7等大小的单元。

  2. 然后,对于这些单元中的每一个,计算局部二进制模式直方图。

    根据定义,直方图抛出关于模式如何彼此定向的空间信息。然而,通过计算每个小区域的直方图,我们实际上能够编码诸如眼睛,鼻子,嘴巴等的空间信息水平。该空间编码还允许我们以不同方式从每个细胞的直方图中给出不同的加权值,表明更明显的面部特征的差异。

    可以看到原始的面部图像分为7×7个细胞(左)。然后,在右侧,我们可以看到每个单元的加权方案:

  3. 对于白色细胞(例如眼睛)的LBP直方图比其他细胞更多的重量为4倍。这简单意味着从白细胞区域采取LBP直方图并将它们乘以4(考虑到直方图的任何缩放/归一化)。

浅灰色细胞(嘴巴和耳朵)贡献2倍。
深灰色细胞(内颊和额头)只有贡献1x。
最后,黑细胞,如鼻子和外脸颊,完全忽略并称重0x。

Ahonen等人通过在其训练,验证和测试数据拆分之上运行HyperParameter调整算法等实验发现了这些加权值。
最后,加权的7×7 LBP直方图连接在一起以形成最终特征向量。

  1. 执行面部识别是使用 x^2 距离和最近的邻居分类器完成的:
  • 脸部呈现给系统

  • 以与训练数据相同的方式提取,加权和连接的Lbps

  • 使用 x^2 距离进行K-NN(带k = 1),以找到训练数据中最接近的面。

  • 选择最小的距离的脸部相关联的人的名称作为最终分类

用于面部识别算法的LBP并不复杂!提取局部二进制模式将提取方法扩展为计算7×7 = 49个细胞的直方图是简单的。

注意,面部识别算法的LBP具有可更新的额外益处,因为新的面部被引入数据集。

其他流行算法(例如特征缺口 EigenFaces)要求在训练时间出现要识别的所有面孔。这意味着如果将新的面部添加到数据集中,则必须重新培训整个特征文件分类器,这可以是非常重要的密集型的。

相反,用于面部识别算法的LBPS可以简单地插入新的面部样本,而无需重新培训 - 在使用与常规频率的数据集中添加或从数据集中删除的面部数据集时显而易见的益处。

3. 源码

# CALTECH FACES是面部识别算法的基准数据集。总的来说,数据集由450个图像组成约27人。如图4所示,在各种照明条件,背景场景和面部表情下捕获每个受试者。
# 本教程的总体目标是应用特征缺陷面部识别算法(Eigenfaces face recognition algorithm),以识别CALTECH FACES数据集中的每个拍摄对象。# face_detector  目录包含OpenCV深度学习的面部探测器。该探测器既快速准确,能够实时运行,无需GPU。# USAGE
# python lbp_face_reco.py --input caltech_faces# 导入必要的包
from sklearn.preprocessing import LabelEncoder  # 加载类标签由String转为int类型
from sklearn.model_selection import train_test_split  # 训练和测试数据集分割
from sklearn.metrics import classification_report
from pyimagesearch.faces import load_face_dataset  # 加载CaltechFaces数据集
import numpy as np
import argparse
import imutils
import time
import cv2
import os# 构建命令行参数及解析
# --input 输入图片数据集的路径
# --face 面部检测器模型的目录
# --confidence 面部检测的最小置信度(用于标识弱/假阳性结果的值)
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--input", type=str, required=True,help="path to input directory of images")
ap.add_argument("-f", "--face", type=str,default="face_detector",help="path to face detector model directory")
ap.add_argument("-c", "--confidence", type=float, default=0.5,help="minimum probability to filter weak detections")
args = vars(ap.parse_args())# 从磁盘加载序列化的面部检测器模型
print("[INFO] loading face detector model...")
prototxtPath = os.path.sep.join([args["face"], "deploy.prototxt"])
weightsPath = os.path.sep.join([args["face"],"res10_300x300_ssd_iter_140000.caffemodel"])
net = cv2.dnn.readNet(prototxtPath, weightsPath)# 加载CALTECH faces数据集,要求置信度0.5,每个人最小样本量20
print("[INFO] loading dataset...")
(faces, labels) = load_face_dataset(args["input"], net,minConfidence=0.5, minSamples=20)
print("[INFO] {} images in dataset".format(len(faces)))# 编码类标签由String转为Int
le = LabelEncoder()
labels = le.fit_transform(labels)# 构建训练和测试集分组(训练集75%,测试集25%)
(trainX, testX, trainY, testY) = train_test_split(faces,labels, test_size=0.25, stratify=labels, random_state=42)# 训练LBP面部识别器
print("[INFO] training face recognizer...")
# 虽然Ahonen等人的原始训练建议使用7×7网格,我更喜欢使用8×8网格,允许更高的粒度,从而提高准确度。
# 这种准确度的提高是以(1)更长的特征提取/比较时间(由于将从49到64跳跃的LBP直方图的数量)为代价(由于从49到64跳跃),但也许更重要的是,(2)相当多的内存消耗存储特征向量。
# 在实践中,自己的数据集上您应该调整grid_x和grid_y,并查看哪些值产生最高准确度。
recognizer = cv2.face.LBPHFaceRecognizer_create(radius=2, neighbors=16, grid_x=8, grid_y=8)
start = time.time()
# 训练模型
recognizer.train(trainX, trainY)
end = time.time()
print("[INFO] training took {:.4f} seconds".format(end - start))# 初始化预测结果和置信度list
print("[INFO] gathering predictions...")
predictions = []
confidence = []
start = time.time()# 遍历测试数据集
for i in range(0, len(testX)):# 执行面部识别预测# 更新预测list和置信度分数list# 返回(1)预测的2元组(即主题的整数标签)和(2)CONF(信心短暂),它只是当前测试矢量和训练数据中最近的数据点之间的x^2距离。距离越低,两个面部属于同一个人的可能性越大。(prediction, conf) = recognizer.predict(testX[i])predictions.append(prediction)confidence.append(conf)# 度量预测数据集耗时
end = time.time()
print("[INFO] inference took {:.4f} seconds".format(end - start))# 展示分类结果
print(classification_report(testY, predictions,target_names=le.classes_))# 生成测试数据的样本
idxs = np.random.choice(range(0, len(testY)), size=10, replace=False)# 便利测试数据样本
for i in idxs:# 获取预测面部名称和实际名称predName = le.inverse_transform([predictions[i]])[0]actualName = le.classes_[testY[i]]# 获取面部图片并等比例缩放为宽度250,因此可以很好的展示在屏幕上face = np.dstack([testX[i]] * 3)face = imutils.resize(face, width=250)# 显示预测名称和实际名称在图像上cv2.putText(face, "pred: {}".format(predName), (5, 25),cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)cv2.putText(face, "actual: {}".format(actualName), (5, 60),cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)# 展示预测名称,实际名称,预测置信度文本值在图像上,预测置信度值越小,预测越准确;print("[INFO] prediction: {}, actual: {}, confidence: {:.2f}".format(predName, actualName, confidence[i]))# 显示面部到屏幕cv2.imshow("Face", face)cv2.waitKey(0)

参考

  • https://www.pyimagesearch.com/2021/05/03/face-recognition-with-local-binary-patterns-lbps-and-opencv/
  • FaceNet

尽管近期识别领域发展迅速,但在规模上有效地实施面部核查和识别会对目前的方法产生严重挑战。在本文中,我们提出了一个称为FaceNet的系统。该系统直接从面部图像到紧凑的欧几里德空间学习,其中距离直接对应于面部相似度的量度。一旦产生了该空间,可以使用具有FaceNet Embeddings作为特征向量的标准技术来容易地实现诸如面部识别,验证和聚类的任务。

我们使用深度卷积的网络训练,直接优化嵌入本身,而不是在以前的深度学习方法中的中间瓶颈层。训练模型时我们使用小说在线三联挖掘方法产生的大致对齐/非匹配面补丁的三胞胎。这个方法的好处是更大的代表性效率:仅利用每张面部128字节实现最先进的面部识别性能。

在被广泛使用的Wild(LFW)数据集中,FaceNet系统实现了99.63%的新记录准确度。在YouTube面部DB数据集中,它达到了95.12%。我们的系统与两个数据集中的最佳已发布结果相比削减了错误率。

我们还介绍了谐波嵌入以及谐波三态损失的概念,描述了彼此兼容的不同版本的面部嵌入式(由不同的网络产生),并且允许彼此之间的直接比较。

  • OpenFace

OpenFace是一个Python和 Torch 的人脸识别与深神经网络的人脸识别,并基于CVPR 2015纸张面孔:谷歌·施罗夫,德米特里卡莱尼科和詹姆斯菲尔宾的面部识别和聚类统一嵌入。Torch 允许在CPU或CUDA上执行网络。

使用深神经网络表示(或嵌入)128维单元间距的面部。嵌入是通用的操作。与其他面部表示不同,这种嵌入具有良好的特性,即两个面部嵌入之间的距离更大的距离意味着面部可能不具有同一个人。该属性使得聚类,相似性检测和分类任务更容易。

使用Python,OpenCV,本地二进制模式(LBP)进行人脸识别相关推荐

  1. 用matlab的lbp算子,Matlab学习: LBP(局部二进制模式)用于人脸识别

    1. 算法简介 LBP是一种用于纹理分类的简单有效的特征提取算法. LBP运算符由Ojala等人在1996年提出. 主要论文是"具有局部二进制模式的多分辨率灰度和旋转不变纹理分类" ...

  2. Python+OpenCV 调用手机摄像头并实现人脸识别

    文章内容: 1.windows 环境下安装 OpenCV 机器视觉环境搭建: 2.基于通过 Python+OpenCV调用手机摄像头并实现人脸检测识别. 目录 1 实验环境 2 实验准备 2.1 下载 ...

  3. 具有Python&OpenCV的本地二进制模式

    具有Python&OpenCV的本地二进制模式 1. 效果图 2. 原理 2.1 项目结构 2.2 数据集构建 2.3 什么是本地二进制模式? 3. 源码 参考 这篇博客将介绍如何使用本地二进 ...

  4. Python OpenCV Tesseract实现车牌的检测与识别

    python+opencv+TESSERT-OCR实现车牌的检测与识别_啥都不会的小王的博客-CSDN博客python+opencv+TESSERT-OCR实现车牌的检测与识别开学花了十天时间0基础搞 ...

  5. 使用百度云接口API和人脸库完成本地合影图片的多人脸识别--V3版接口Python语言

    百度接口人脸检测,识别率很高,而且操作简单.网上百度还未见到借助百度云接口API和人脸库完成本地合影图片的多人脸识别,本人编写的代码可以实现,但觉得不够简洁,代码数还可以精减,欢迎交流. 1.准备工作 ...

  6. Linux毕业设计:基于OpenCV和QT库实现的人脸识别考勤/门禁系统(arm嵌入式ubuntu)

    本文介绍:Linux上以opencv和qt库实现的人脸识别系统,可应用于考勤.门禁等场景,具有人脸录入.删除.人脸检测.识别.用户管理等完整功能.可运行于ARM嵌入式linux.ubuntu即纯软件. ...

  7. python能不能用c打开文件_C/C++/Python等 使用二进制模式打开文件与不使用二进制模式的区别...

    C语言中文本文件与二进制文件的区别 一.文本文件与二进制文件的定义 大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的.这两者只是在编码层次上有差异. ...

  8. 极简Python:用opencv实现人脸检测,并用本地摄像头实现视频流的人脸识别

    文章目录 1. 图片人脸识别 2. 图片人脸检测+人眼检测 3. 视频流的人脸识别 包括图片级别的人脸检测和调用本地摄像头实现视频流级别的人脸识别. 废话不大多说,直接上代码,喜欢的同学可以收藏! 1 ...

  9. python人脸识别考勤系统 dlib+OpenCV和Pyqt5、数据库sqlite 人脸识别系统 计算机 毕业设计 源码

    一.项目介绍 Python语言.dlib.OpenCV.Pyqt5界面设计.sqlite3数据库 本系统使用dlib作为人脸识别工具,dlib提供一个方法可将人脸图片数据映射到128维度的空间向量,如 ...

最新文章

  1. 深入理解分布式技术 - 配置中心
  2. Android Canvas的drawText()和文字居中方案
  3. 初探VMware View 5.1
  4. [心情]一落千丈的反差
  5. python生活中的小问题_python日常注意小知识集锦
  6. 机器人的核心——运动控制器
  7. mysql gtidpurged_gtid环境下mysqldump对于set-gtid-purged的取值
  8. AndroidStudio使用Git,Commit、Push代码到GitLab权限失败问题
  9. 深度学习基础知识题库大全
  10. fabric ca 使用案例
  11. k8s中Ingress安装
  12. 软件设计 基础篇(二) 交互设计
  13. 如何去除图片上的文字(PS使用教程)
  14. 51单片机节日彩灯控制c语言,采用AT89C51单片机设计的可编程彩灯控制
  15. DataGrip csv等文件 快速建表
  16. 2021年12月电子学会Python等级考试试卷(二级)答案解析
  17. 核高基向左,生产性服务向右,只是完整的左右手而已
  18. angular.js-服务-http-路由(5)
  19. 如何算java程序的运行时间
  20. autojs之停止脚本的6种方法

热门文章

  1. NVIDIA深度学习Tensor Core性能解析(上)
  2. 空间点像素索引(一)
  3. 深度学习常见问题解析
  4. 2021年大数据Spark(四十四):Structured Streaming概述
  5. Lumen报class does not exist的mailer坑
  6. Thrift架构与使用方法
  7. Django 验证码4.4
  8. python 使用sax 解析xml 文件
  9. Java设计模式:单例模式
  10. .net2.0网站多语言