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

分手后的思念是犯贱 2022-12-21 03:14 249阅读 0赞

准备工作:
安装opencv

  1. pip install opencv

安装opencv-contrib

  1. pip install opencv-contrib

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

一、编写一个基础的人脸识别

  1. import cv2 as cv
  2. def face_detect_demo():
  3. # ----------------------------------------------将图片灰度化----------------------------------------------
  4. gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  5. # 加载特征数据
  6. face_detector = cv.CascadeClassifier('C:/Program Files (x86)/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
  7. faces = face_detector.detectMultiScale(gray)
  8. for x, y, w, h in faces:
  9. cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2)
  10. cv.imshow('result',img)
  11. #加载图片
  12. img = cv.imread('C:/Users/Administrator/Desktop/my.jpg')
  13. face_detect_demo()
  14. cv.waitKey(0)
  15. cv.destroyAllWindows()

二、下载或者使用自己照片当训练素材

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

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

三、编写训练代码:

  1. import cv2
  2. import os
  3. import sys
  4. from PIL import Image
  5. import numpy as np
  6. def getImageAndLabels(path):
  7. facesSamples=[]
  8. ids=[]
  9. imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
  10. print(imagePaths)
  11. # 检测人脸
  12. face_detector = cv2.CascadeClassifier(
  13. 'C:/Program Files (x86)/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
  14. # 遍历列表中的图片
  15. for imagePath in imagePaths:
  16. # 打开图片
  17. PIL_img = Image.open(imagePath).convert('L')
  18. # 将图像转换为数组
  19. img_numpy = np.array(PIL_img,'uint8')
  20. faces = face_detector.detectMultiScale(img_numpy)
  21. # 获取每张图片的id
  22. print(os.path.split(imagePath))
  23. id = int(os.path.split(imagePath)[1].split('.')[0])
  24. for x,y,w,h in faces:
  25. facesSamples.append(img_numpy[y:y+h,x:x+w])
  26. ids.append(id)
  27. return facesSamples,ids
  28. if __name__== '__main__':
  29. #图片路径
  30. path = './data/jm/'
  31. #获取图像 数组和id标签
  32. faces,ids=getImageAndLabels(path)
  33. #获取循环对象
  34. recognizer = cv2.face.LBPHFaceRecognizer_create()
  35. recognizer.train(faces,np.array(ids))
  36. #保存文件
  37. recognizer.write('trainer/trainer.yml')

运行代码后就会生成一个yml文件,这个文件路径我设置在trainer文件夹下面。
五、编写人脸识别代码:

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

  1. # 加载训练数据和文件
  2. recognizer = cv2.face.LBPHFaceRecognizer_create()
  3. 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,可见可信度还是比较高的,至此为止整个人脸识别就全部完成了。

发表评论

表情:
评论列表 (有 0 条评论,249人围观)

还没有评论,来说两句吧...

相关阅读

    相关 iOS 人脸识别(检测)

    本文用的是系统自带的人脸识别功能,跟扫二维码条形码是一样的,但是系统只能识别出这是人的脸,至于高级的判断这张脸是谁的,需要更高级的第三方库了。 这里是检测到有人脸,然后三秒后

    相关 人脸识别系统_人脸检测

    项目:基于人脸识别的无卡ATM机模拟系统 主要实现内容: 包括实现AMT机模拟人脸识别和密码输入、PC端模拟实现储户数据库服务器系统。 1. ATM模拟端实现采用手