当前位置: 首页 > news >正文

opencv人脸识别 (二):人脸识别 (基于 LBPH)

       人脸检测是 OpenCV 的一个很不错的功能, 它是人脸识别的基础。 什么是人脸识别呢?

       其实就是一个程序能识别给定图像或视频中的人脸。 实现这一目标的方法之一是用一系列分好类的图像来“训练” 程序, 并基于这些图像来进行识别。这就是 OpenCV 及其人脸识别模块进行人脸识别的过程。

       人脸识别模块的另外一个重要特征是: 每个识别都具有转置信(confidence) 评分, 因此可在实际应用中通过对其设置阈值来进行筛选。

      人脸识别所需要的人脸可以通过两种方式来得到: 自己获得图像或从人脸数据库免费获得可用的人脸图像
 

训练数据

pycharm可以打开.cpm图像

 

import os
import cv2
import numpy as np
import sys
from PIL import Image


detector = cv2.CascadeClassifier("D:\\Anaconda3\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml")

def getImagesAndLabels(path):
	imagePaths = [os.path.join(path,f) for f in os.listdir(path)]
	faceSamples=[]
	ids = []
	for imagePath in imagePaths:
		#打开图片
		PIL_img = Image.open(imagePath).convert('L') # convert it to grayscale
		#将图像转换为数组
		img_numpy = np.array(PIL_img,'uint8')
		#获取每张图片的id
		#print(os.path.split(imagePath))
		id = int(os.path.split(imagePath)[-1].split(".")[0])
		faces = detector.detectMultiScale(img_numpy)
		for x,y,w,h in faces:
			faceSamples.append(img_numpy[y:y+h,x:x+w])
			ids.append(id)
	return faceSamples,ids

if __name__ == '__main__':
	#图片路径
	path='data/jm/'
	#获取图像数组和id标签数组
	faces, ids = getImagesAndLabels(path)
	#获取训练对象
	recognizer = cv2.face.LBPHFaceRecognizer_create()
	recognizer.train(faces, np.array(ids))  #要将ids从列表转换为数组
	# Save the model into trainer/trainer.yml
	recognizer.write('trainer/trainer.yml')

 

 

基于 LBPH 的人脸识别

      LBPH(Local Binary Pattern Histogram) 将检测到的人脸分为小单元, 并将其与模型中的对应单元进行比较, 对每个区域的匹配值产生一个直方图。 由于这种方法的灵活性, LBPH是唯一允许模型样本人脸和检测到的人脸在形状、 大小上可以不同的人脸识别算法。

      调整后的区域中调用 predict()函数, 该函数返回两个元素的数组: 第一个元素是所识别个体的标签, 第二个是置信度评分。 所有的算法都有一个置信度评分阈值, 置信度评分用来衡量所识别人脸与原模型的差距, 0 表示完全匹配。 可能有时不想保留所有的识别结果, 则需要进一步处理, 因此可用自己的算法来估算识别的置信度评分。

      LBPH 一个好的识别参考值要低于 50 , 任何高于 80 的参考值都会被认为是低的置信度评分。

 

之前训练的数据都在trainer.yml里,

这次读取一个图片,程序会输入和训练数据的哪个最像,然后置信度评分是多少

import cv2
import numpy as np
import os

recognizer = cv2.face.LBPHFaceRecognizer_create()
#加载数据
recognizer.read('trainer/trainer.yml')
faceCascade = cv2.CascadeClassifier("D:\\Anaconda3\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml")
font = cv2.FONT_HERSHEY_SIMPLEX
id = 0
img=cv2.imread('1.pgm') #识别的图片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(gray)
for(x,y,w,h) in faces:
	cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
	id, confidence = recognizer.predict(gray[y:y+h,x:x+w])
	print('标签id:',id,'置信评分:',confidence)

cv2.imshow('camera',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

6.pgm

这是训练用的数据集data/jm里的2.pgm,可见被识别的6.pgm和2.pgm还是属于同一个人的,只不过置信评分有些高了

 

 

1.gpm

data/jm里面就有这张照片,所以识别出来一摸一样,置信0.0

 

 

 

相关文章:

  • Caffe(一)——简介 优点 Caffe2 编译和安装
  • Pytorch之经典神经网络CNN(一) —— 全连接网络 / MLP (MNIST) (trainset和Dataloader batch training learning_rate)
  • 神经网络/深度学习 相关知识
  • pytorch搭建神经网络分类Fashion-MNIST数据集
  • Python函数式编程(三):匿名函数lambda
  • 编程范式—命令式编程与函数式编程
  • Scala语言(二)
  • Scala语言(三)
  • Python——virtualenv/virtualenvwrapper
  • Python多进程(multiprocessing)(mp)(一) —— 进程的创建 join()方法
  • Python多进程(multiprocessing)(mp)(二) —— 创建多进程 继承process类 进程池(Pool)
  • Python多进程(multiprocessing)(mp)(三) —— 进程间通信 Queue队列(Manager)
  • Python多线程(二): 线程同步 生产者消费者模式 ThreadLocal线程局部变量
  • 爬虫url去重策略
  • 爬虫中的深搜和广搜
  • 【Linux系统编程】快速查找errno错误码信息
  • Angular 响应式表单之下拉框
  • angular2 简述
  • CSS3 变换
  • ES6之路之模块详解
  • GitUp, 你不可错过的秀外慧中的git工具
  • iOS 颜色设置看我就够了
  • JavaScript 基础知识 - 入门篇(一)
  • MySQL-事务管理(基础)
  • nodejs实现webservice问题总结
  • Odoo domain写法及运用
  • python学习笔记 - ThreadLocal
  • react-native 安卓真机环境搭建
  • Redis在Web项目中的应用与实践
  • Tornado学习笔记(1)
  • vue自定义指令实现v-tap插件
  • 安卓应用性能调试和优化经验分享
  • 关于使用markdown的方法(引自CSDN教程)
  • 记一次删除Git记录中的大文件的过程
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 前端js -- this指向总结。
  • 实习面试笔记
  • 使用权重正则化较少模型过拟合
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 微信小程序填坑清单
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • $.each()与$(selector).each()
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (02)Hive SQL编译成MapReduce任务的过程
  • (06)Hive——正则表达式
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (poj1.2.1)1970(筛选法模拟)
  • (poj1.3.2)1791(构造法模拟)
  • (待修改)PyG安装步骤
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154