文章目录

  • 前言
  • 一、人脸检测
    • 1.基于Haar的人脸检测
    • 2.基于深度学习的人脸检测
  • 二、人脸识别
    • 1.特征脸EigenFaces
    • 2.人鱼脸FisherFaces
    • 3.局部二进制编码直方图LBPH
    • 4.DLIB
  • 总结

前言

人脸检测有几种方法,主要讲2种,一种是基于Haar,另外一种基于深度学习,从效果上看肯定是后者效果较好,但是前者简单。
人脸识别讲4种方法,EigenFaces、FisherFaces和LBPH以及Dlib方法。


一、人脸检测

1.基于Haar的人脸检测

import cv2
img=cv2.imread('E:\VSCode\CSDN\my.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  #转换为灰度图像
#加载人脸检测器
face = cv2.CascadeClassifier('E:\VSCode\CSDN\haarcascade_frontalface_default.xml')
eye = cv2.CascadeClassifier('E:\VSCode\CSDN\haarcascade_eye.xml')#加载眼睛检测器
faces = face.detectMultiScale(gray)#执行人脸检测
for x,y,w,h in faces:cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)#绘制矩形标注人脸roi_eye = gray[y:y+h, x:x+w]     #根据人脸获得眼睛的检测范围eyes = eye.detectMultiScale(roi_eye)    #在人脸范围内检测眼睛for (ex,ey,ew,eh) in eyes: #标注眼睛cv2.circle(img[y:y+h, x:x+w],(int(ex+ew/2),int(ey+eh/2)),int(max(ew,eh)/2),(0,255,0),1)
cv2.imshow('faces',img)
cv2.waitKey(0)


通过这张图片发现人脸识别效果一般。

基于视频的代码:

import cv2
capture = cv2.VideoCapture(0)   #创建视频捕捉器对象
face = cv2.CascadeClassifier('E:\VSCode\CSDN\haarcascade_frontalface_default.xml')#加载人脸检测器
eye = cv2.CascadeClassifier('E:\VSCode\CSDN\haarcascade_eye.xml')#加载眼睛检测器
while True:ret, frame = capture.read()                             gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)           #转换为灰度图像    faces = face.detectMultiScale(gray)                     #执行人脸检测for x,y,w,h in faces:cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)    #绘制矩形标注人脸      roi_eye = gray[y:y+h, x:x+w]                        #根据人脸获得眼睛的检测范围eyes = eye.detectMultiScale(roi_eye)                #在人脸范围内检测眼睛for (ex,ey,ew,eh) in eyes:                          #标注眼睛cv2.circle(frame[y:y+h, x:x+w],(int(ex+ew/2),int(ey+eh/2)),int(max(ew,eh)/2),(0,255,0),2)  cv2.imshow('faces',frame)                        key = cv2.waitKey(20)if key == 27:    break

2.基于深度学习的人脸检测

opencv的深度神经网络(DNN)模块提供了基于深度学习的人脸检测器。DNN使用的深度学习框架包括Caffe、TensorFlow、Torch等。OpenCV提供了2个预训练的人脸检测模型,Caffee和Tensorflow模型。
以下为代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt
#加载训练好的模型,可以选择使用Caffee或者Tensorflow模型,加载的2个文件不一样。
#dnnnet = cv2.dnn.readNetFromCaffe("E:\VSCode\CSDN\deploy.prototxt", "E:\VSCode\CSDN\res10_300x300_ssd_iter_140000_fp16.caffemodel")
dnnnet = cv2.dnn.readNetFromTensorflow("E:\VSCode\CSDN\opencv_face_detector_uint8.pb", "E:\VSCode\CSDN\opencv_face_detector.pbtxt")
img = cv2.imread("E:\VSCode\CSDN\hello.jpg")        #读取图像
h, w = img.shape[:2]                                #获得图像尺寸
blobs = cv2.dnn.blobFromImage(img, 1.0, (300, 300), #创建图像的块数据[104., 117., 123.], False, False)
dnnnet.setInput(blobs)                                 #将块数据设置为输入
detections = dnnnet.forward()                          #执行计算,获得检测结果
faces = 0
for i in range(0, detections.shape[2]): #迭代,输出可信度高的人脸检测结果confidence = detections[0, 0, i, 2] #获得可信度if confidence > 0.6:                #输出可行度高于60%的结果faces += 1box = detections[0, 0, i, 3:7] * np.array([w, h, w, h]) #获得人脸在图像中的坐标x1,y1,x2,y2 = box.astype("int")        y = y1 - 10 if y1 - 10 > 10 else y1 + 10            #计算可信度输出位置text = "%.3f"%(confidence * 100)+'%'cv2.rectangle(img, (x1, y1), (x2, y2), (255, 0, 0), 2)#标注人脸范围cv2.putText(img,text, (x1, y),cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)#输出可信度
cv2.imshow('faces',img)
cv2.waitKey(0)

deploy.prototxt 文件定义模型结构配置文件。
res10_300x300_ssd_iter_140000_fp16.caffemodel 包含实际权重训练模型文件。
opencv_face_detector_uint8.pb 包含实际权重训练模型文件。
opencv_face_detector.pbtxt 定义模型结构配置文件

函数cv2.dnn.blobFromImage(image[, scalefactor[, size[, mean[, swapRB[, crop[, ddepth]]]]]])
作用:对图像进行预处理,包括减均值,比例缩放,裁剪,交换通道等,返回一个4通道的blob(blob可以简单理解为一个N维的数组,用于神经网络的输入)

参数:
image:输入图像(1、3或者4通道)
可选参数
scalefactor:图像各通道数值的缩放比例
size:输出图像的空间尺寸,如size=(200,300)表示高h=300,宽w=200
mean:用于各通道减去的值,以降低光照的影响(e.g. image为bgr3通道的图像,mean=[104.0, 177.0, 123.0],表示b通道的值-104,g-177,r-123)
swapRB:交换RB通道,默认为False.(cv2.imread读取的是彩图是bgr通道)
crop:图像裁剪,默认为False.当值为True时,先按比例缩放,然后从中心裁剪成size尺寸
ddepth:输出的图像深度,可选CV_32F 或者 CV_8U.

二、人脸识别

1.特征脸EigenFaces

代码如下(示例):

import cv2
import numpy as np
liudehua_img_1=cv2.imread('E:/VSCode/CSDN/liudehua1.jpg',cv2.IMREAD_GRAYSCALE))      #打开图像,灰度图
liudehua_img_2=cv2.imread('E:/VSCode/CSDN/liudehua2.jpg',cv2.IMREAD_GRAYSCALE))
liudehua_img_3=cv2.imread('E:/VSCode/CSDN/liudehua3.jpg',cv2.IMREAD_GRAYSCALE))
wangzuxian_img_1=cv2.imread('E:/VSCode/CSDN/wangzuxian1.jpg',cv2.IMREAD_GRAYSCALE))
wangzuxian_img_2=cv2.imread('E:/VSCode/CSDN/wangzuxian2.jpg',cv2.IMREAD_GRAYSCALE))
wangzuxian_img_3=cv2.imread('E:/VSCode/CSDN/wangzuxian3.jpg',cv2.IMREAD_GRAYSCALE))                          train_images=[liudehua_img_1,liudehua_img_2,liudehua_img_3,wangzuxian_img_1,wangzuxian_img_2,wangzuxian_img_3]   #创建训练图像数组
labels=np.array([0,0,0,1,1,1])  #创建标签数组,0和1表示对应的训练图像数组中人脸的身份
recognizer=cv2.face.EigenFaceRecognizer_create()#创建EigenFaces识别器
recognizer.train(train_images,labels)  #执行训练操作
testimg=cv2.imread('E:/VSCode/CSDN/test.jpg',0)  #打开测试图像
label,confidence=recognizer.predict(testimg)            #识别人脸
print('匹配标签:',label)
print('可信度:',confidence)

要求训练和预测图片的大小一致。可以使用在线图片处理网站将图片处理成同样大小。

train_images=[liudehua_img_1,liudehua_img_2,liudehua_img_3,wangzuxian_img_1,wangzuxian_img_2,wangzuxian_img_3]
labels=np.array([0,0,0,1,1,1])

要求标签中的序号要和图片一一对应,比如刘德华照片是1,2,3,则labels中,前3个都是0号。后3张都是王祖贤,则序号都是1。
confidence表示置信度,值通常在0~20000之间,只要低于5000都被认为是相当可靠的识别结果。

2.人鱼脸FisherFaces

代码和前一种方法一样,只有一个地方不一样。

recognizer=cv2.face.FisherFaceRecognizer_create()#创建FisherFaces识别器

confidence表示置信度,值通常在0~20000之间,只要低于5000都被认为是相当可靠的识别结果。

3.局部二进制编码直方图LBPH

代码和第一种方法一样,只有一个地方不一样。

recognizer=cv2.face.LBPHFaceRecognizer_create()#创建LBPH识别器

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

4.DLIB

Dlib库的安装比较麻烦。这边创建了一个专门的环境给Dlib用。创建环境的方法请看。conda基本操作

先安装这两个库。

pip3 install cmake -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install boost -i https://pypi.tuna.tsinghua.edu.cn/simple


dlib库直接PIP3安装的话基本都会报错,这里使用whl文件安装。
下载whl文件这个链接中只有python3.7和python3.8的版本。
选择你对应python版本的whl文件,然后执行

用绝对途径安装。这就安装成功了。

具体算法实现,参考此链接
也可以参考此篇。使用dlib库进行人脸识别

当然也可以使用Dlib来实现人脸识别,效果也很好。
以下是人脸检测(非识别)代码:

import cv2
import dlib
detector = dlib.get_frontal_face_detector()# Load the detector
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")# Load the predictor
cap = cv2.VideoCapture(0)while True:_, frame = cap.read()# Convert image into grayscalegray = cv2.cvtColor(src=frame, code=cv2.COLOR_BGR2GRAY)# Use detector to find landmarksfaces = detector(gray)for face in faces:x1 = face.left()  # left pointy1 = face.top()  # top pointx2 = face.right()  # right pointy2 = face.bottom()  # bottom point# Create landmark objectlandmarks = predictor(image=gray, box=face)# Loop through all the pointsfor n in range(0, 68):x = landmarks.part(n).xy = landmarks.part(n).y# Draw a circlecv2.circle(img=frame, center=(x, y), radius=3, color=(0, 255, 0), thickness=-1)# show the imagecv2.imshow(winname="Face", mat=frame)# Exit when escape is pressedif cv2.waitKey(delay=1) == 27:break# When everything done, release the video capture and video write objects
cap.release()
# Close all windows
cv2.destroyAllWindows()

shape_predictor_68_face_landmarks.da文件可留下邮箱获取也可以自行百度搜索。


总结

Dlib效果不错。

【OpenCV】人脸检测和识别相关推荐

  1. Qt之OpenCV人脸检测以及识别

    简介 最近做了一个人脸检测以及识别的程序,很多的文章都有比较详细的叙述,可以自行查找.但是个人觉得大部分文章都太细致了以至于初学者无法快速领会主干(不是否认质量),是侧重点问题.所以结合我遇到了一些问 ...

  2. 人脸识别案例:【实战】opencv人脸检测+Haar特征分类器

    1 基础 我们使用机器学习的方法完成人脸检测,首先需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器.我们需要从其中提取特征.下图中的 Haar 特征会被使用,就像我们的卷积核 ...

  3. keras系列︱人脸表情分类与识别:opencv人脸检测+Keras情绪分类(四)

    人脸识别热门,表情识别更加.但是表情识别很难,因为人脸的微表情很多,本节介绍一种比较粗线条的表情分类与识别的办法. Keras系列: 1.keras系列︱Sequential与Model模型.kera ...

  4. 人脸识别系统——OpenCV人脸检测

    EduCoder:人脸识别系统--OpenCV人脸检测 第1关:图片基本操作 编程要求: 请在右侧编辑器中的BEGIN-END之间编写代码,完成如下要求: 导入openCV库(cv2): 读取路径 s ...

  5. 【EduCoder答案】人脸识别系统——OpenCV人脸检测

    简介 答案查询的入口网页版 其他各类实训答案的目录见这里 答案获取的方法简介见这里 并不是所有的关卡都有答案,有些只有部分关卡有 不要直接复制答案哦 人脸识别系统 -- OpenCV人脸检测 > ...

  6. 基于opencv的人脸检测与识别(python)(1)

    基于opencv的人脸检测与识别(python语言)(1) 人脸检测和识别技术就目前而言,已经相对成熟,各类算法层出不穷,这都归功于各位奋斗在一线的大佬的努力(站在巨人的肩膀上的感觉就是爽).本文是参 ...

  7. OpenCV与图像处理学习十七——OpenCV人脸检测(含代码)

    OpenCV与图像处理学习十七--OpenCV人脸检测(含代码) 一.人脸识别概要 1.1 人脸检测 1.2 人脸对齐(Face Alignment) 1.3 人脸特征提取(Face Feature ...

  8. python实现人脸检测及识别(1)---- 采集人脸数据

    本次项目是采用keras深度学习框架,训练人脸识别模型,采用opencv实时检测与识别周围的人脸,本文主要讲解如何采集训练集,本次代码在人脸识别的代码上添加了将识别的照片依次写入指定文件夹,并命名(0 ...

  9. 人脸检测和识别的开源库总结

    背景 人脸相关的任务有以下几种: 人脸检测(将图片中包含的人脸进行初步定位,以及关键点如眼睛.鼻子.嘴巴等更精细的定位,文章封面即为典型人脸检测结果): 人脸跟踪(视频中跟踪人脸位置变化): 人脸验证 ...

  10. 目标人脸检测与识别(计算机视觉)

    一.实验目的 通过python 语言编程设计人脸检测算法,以此人脸作为训练样本,训练目标人脸模型,进一步实现目标人脸的识别.通过上述编程促进学生理解并掌握人脸检测及识别的相关原理,同时培养学生的编程能 ...

最新文章

  1. 718. Maximum Length of Repeated Subarray 最长重复子数组
  2. H.264基础知识及视频码流解析
  3. SAP Spartacus界面注册用户获取OAuth Access Token的方式
  4. 使用 ServiceStack 构建跨平台 Web 服务(转)
  5. 字符串大写转小写库函数_PHP程序无需使用库函数即可将字符串转换为大写
  6. DPDK多线程:EAL pthread和lcore Affinity(F-Stack配置文件的配置参数:lcore_mask、lcore_list)
  7. .net core下简单构建高可用服务集群
  8. angularjs directive指令 link在渲染完成之后执行
  9. DevExpress.XtraEditors.Repository.RepositoryItem.CreateDesigner()
  10. java常量池在哪里_【Java基础】Java常量池在哪里? - 收获啦
  11. ENVI制作三维立体影像图
  12. 习题6.14 编一个程序,将两个字符串s1和s2比较,若s1 > s2,输出一个正数;若s1 = s2, 输出0;若s1 < s2,输出一个负数。不要用strcmp函数。两个字符串用gets函数输入。
  13. 在vue中使用高德地图获取坐标与地址信息(包含点击+搜索)
  14. R语言ARIMA-GARCH波动率模型预测股票市场苹果公司日收益率时间序列
  15. Calendar加減月份、年份-月底的处理逻辑
  16. 强化学习-Q-Learning算法
  17. 小米平板4 android版本,小米平板4-4plus
  18. 特别策划:非计算机专业如何转行做程序员?
  19. 小程序生成二维码分享朋友圈的功能
  20. matlab qpsk 星座图,【求助】如何画QPSK信号的星座图?各位高手帮帮忙啊!小弟...

热门文章

  1. 1646 获取生成数组中的最大值(模拟)
  2. 7.8 css 学习
  3. 学生登录系统 过程及结果
  4. 继机器人披萨后,我又吃了个机器人汉堡!
  5. 回文序列是指正读反读均相同的字符序列,如“abba”和“abdba”均是 回文,但“good”不是回文。试写一个算法判定给定的字符串是否为回文序列。
  6. INSERT INTO语句
  7. SpringCloud微服务实战——搭建企业级开发框架(二十七):集成多数据源+Seata分布式事务+读写分离+分库分表
  8. 两个主要问题将决定微信支付成败
  9. php时间期间检测重叠,如何检查PHP中多个日期范围之间的重叠?
  10. AGORA数据集简介 (SMPL,SMPL-X)