感谢优秀的你打开了小白的文章
“希望在看文章的你今天又进步了一点点,离美好生活更近一步!”
往期回顾
灰度转换 | 人脸识别基础-灰度转换与修改图片尺寸_am_student的博客-CSDN博客 |
矩形圆形的绘制 | 人脸识别-矩形圆形的绘制_am_student的博客-CSDN博客 |
Hrr级联 | 人脸识别-Haar级联_am_student的博客-CSDN博客 |
多张人脸检测 |
目录
前言
LBPH(Local Binary Pattern Histogram)将检测到的人脸分为小单元,并将其与模型中 的对应单元进行比较,对每个区域的匹配值产生一个直方图。由于这种方法的灵活性,LBPH 是唯一允许模型样本人脸和检测到的人脸在形状、大小上可以不同的人脸识别算法。 调整后的区域中调用 predict()函数,该函数返回两个元素的数组:第一个元素是所识别个体的标签,第二个是置信度评分。所有的算法都有一个置信度评分阈值,置信度评分用来 衡量所识别人脸与原模型的差距,0 表示完全匹配。可能有时不想保留所有的识别结果,则 需要进一步处理,因此可用自己的算法来估算识别的置信度评分。LBPH 一个好的识别参考值要低于50 ,任何高于 80 的参考值都会被认为是低的置信度评分。
对数据的训练
具体内容参照人脸识别-对数据的训练_am_student的博客-CSDN博客中,我们得到
import os
import cv2
import sys
from PIL import Image
import numpy as np
def getImageAndLabels(path):
facesSamples=[]
ids=[]
imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
#检测人脸
face_detector = cv2.CascadeClassifier(
'C:/Users/ZXY13/Desktop/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
#遍历列表中的图片
for imagePath in imagePaths:
#打开图片
PIL_img=Image.open(imagePath).convert('L')
#将图像转换为数组
img_numpy=np.array(PIL_img,'uint8')
faces = face_detector.detectMultiScale(img_numpy)
#获取每张图片的id
id=int(os.path.split(imagePath)[1].split('.')[0])
for x,y,w,h in faces:
facesSamples.append(img_numpy[y:y+h,x:x+w])
ids.append(id)
return facesSamples,ids
if __name__ == '__main__':
#图片路径
path='./data/jm/'
#获取图像数组和id标签数组
faces,ids=getImageAndLabels(path)
#获取训练对象
recognizer=cv2.face.LBPHFaceRecognizer_create()
recognizer.train(faces,np.array(ids))
#保存文件
recognizer.write('trainer/trainer.yml')
我们得到一个.yml文件,里面有我们所需要的数据。
人脸识别
import cv2
import numpy as np
import os
#加载训练数据集文件
recogizer=cv2.face.LBPHFaceRecognizer_create()
recogizer.read('trainer/trainer.yml')
#准备识别的图片
img=cv2.imread('7.pgm')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
face_detector = cv2.CascadeClassifier(
'C:/Users/ZXY13/Desktop/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
faces = face_detector.detectMultiScale(gray)
for x,y,w,h in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
#人脸识别
id,confidence=recogizer.predict(gray[y:y+h,x:x+w])
print('标签id:',id,'置信评分:',confidence)
cv2.imshow('result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
得到结果:
具体内容关注公众号获取代码