人脸检测 + 数据训练 + 人脸识别

您所在的位置:网站首页 opencv人脸识别模型训练步骤 人脸检测 + 数据训练 + 人脸识别

人脸检测 + 数据训练 + 人脸识别

2023-12-10 09:04| 来源: 网络整理| 查看: 265

准备工作: 安装opencv

pip install opencv

安装opencv-contrib

pip install opencv-contrib

创建文件夹,文件结构为: 在这里插入图片描述

一、编写一个基础的人脸识别 import cv2 as cv def face_detect_demo(): # ----------------------------------------------将图片灰度化---------------------------------------------- gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 加载特征数据 face_detector = cv.CascadeClassifier('C:/Program Files (x86)/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') faces = face_detector.detectMultiScale(gray) for x, y, w, h in faces: cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2) cv.imshow('result',img) #加载图片 img = cv.imread('C:/Users/Administrator/Desktop/my.jpg') face_detect_demo() cv.waitKey(0) cv.destroyAllWindows() 二、下载或者使用自己照片当训练素材

照片放在data下面的jm文件夹下面,照片名称是我们后面使用到的ID,命名要规范,后缀要一致。如下: 在这里插入图片描述

我10张照片里面选了 1-3为马云的,4-7为普京的,8-10是周杰伦的照片。进行训练识别。

三、编写训练代码: import cv2 import os 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)] print(imagePaths) # 检测人脸 face_detector = cv2.CascadeClassifier( 'C:/Program Files (x86)/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 print(os.path.split(imagePath)) 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文件,这个文件路径我设置在trainer文件夹下面。 五、编写人脸识别代码:

import cv2 import numpy as np import os # 1-3,4-7,8-10 names = ['','MY','MY','MY','president:pitin','president:pitin','president:pitin','president:pitin','jay','jay','jay',] # 加载训练数据和文件 recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.read('trainer/trainer.yml') #准备识别的图片 img = cv2.imread('C:/Users/Administrator/Desktop/6.jpg') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) face_detector = cv2.CascadeClassifier('C:/Program Files (x86)/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') faces = face_detector.detectMultiScale(gray,minNeighbors=30) for x,y,w,h in faces: id, confidence = recognizer.predict(gray[y:y + h, x:x + w]) # 人脸识别 cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) name = names[id] cv2.putText(img,name,(x,y),cv2.FONT_HERSHEY_COMPLEX,1,(128,128,0),2) print('标签id:',id,'置信评分:',confidence) cv2.imshow('result',img) cv2.waitKey(0) cv2.destroyAllWindows() 总结:

基础的人脸检测的思路是: 1.灰度化图片 2.加载特征数据 3.检测灰度图片中的人脸(可以是多个人脸),获取每一个的人脸坐标 5.遍历绘制人脸框,显示图像 6.释放capture内存,销毁所有窗口。

训练数据的思路: 1.在上面基础上,遍历获取ID和人脸的宽度和高度(y:y+h,x:x+w) 2.创建cv2.face.LBPHFaceRecognizer_create()LBPHFF特征算法类 3.使用.train(faces,np.array(ids))进行训练。 4.保存yml文件.write('trainer/trainer.yml')

人脸识别思路: 1.导入数据文件

# 加载训练数据和文件 recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.read('trainer/trainer.yml')

2.按照基础的人脸检测方法,在遍历faces的时候,也就是在被检测的人脸中去匹配特征信息 使用.predict(gray[y:y + h, x:x + w])方法进行人脸识别。

3.最后使用.putText(img,name,(x,y),cv2.FONT_HERSHEY_COMPLEX,1,(128,128,0),2)方法进行标签的绘制。

经过训练后,我去网上找了一张程序从来没有见过的普京的照片。 然后让它识别并且给出一个置信指数,注意指数越低越靠谱,一般来说50的指数为可信度非常强,70以上可信度较弱,指数为0时,则是100%可信,也就是100%匹配。

结果显示 左右的图片(网上找的,程序不认识的)和训练库中id为6的图片匹配(也就是右边的图片),置信指数55,可见可信度还是比较高的,至此为止整个人脸识别就全部完成了。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3