人脸检测5种方法(代码片段)

老师我作业忘带了 老师我作业忘带了     2022-12-03     800

关键词:

众所周知,人脸识别是计算机视觉应用的一个重大领域,在学习人脸识别之前,我们先来简单学习下人脸检测的几种用法。

常见的人脸检测方法大致有5种,Haar、Hog、CNN、SSD、MTCNN:

注:本文章图片来源于网络

相关构造检测器的文件:opencv/data at master · opencv/opencv · GitHub

基本步骤

  1. 读入图片
  2. 构造检测器
  3. 获取检测结果
  4. 解析检测结果

一、Haar

# 调整参数
img = cv2.imread('./images/001.jpg')
cv_show('img',img)

# 构造harr检测器
face_detector = cv2.CascadeClassifier('./weights/haarcascade_frontalface_default.xml')

# 转为灰度图
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
plt.imshow(img_gray,'gray')

# 检测结果 上图4个人脸所以4个方框坐标
# image  
# scaleFactor控制人脸尺寸  默认1.1 
detections = face_detector.detectMultiScale(img_gray,scaleFactor=1.3)

# 解析
for x,y,w,h in detections:
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0))
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

# 调整参数
img = cv2.imread('./images/004.jpeg')
cv_show('img',img)

# 构造harr检测器
face_detector = cv2.CascadeClassifier('./weights/haarcascade_frontalface_default.xml')

# 转为灰度图
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
plt.imshow(img_gray,'gray')

# 检测结果 上图4个人脸所以4个方框坐标
# image  
# scaleFactor控制人脸尺寸  默认1.1 
# minNeighbors 确定一个人脸框至少要有n个候选值 越高 质量越好
# [, flags[, 
# minSize  maxSize 人脸框的最大最小尺寸 如minSize=(40,40) 
detections = face_detector.detectMultiScale(img_gray,scaleFactor=1.2, minNeighbors=10)# 在质量和数量上平衡

# 解析
for x,y,w,h in detections:
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0))
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

 

上述过程中:

  • scaleFactor参数:用来控制人脸框的大小,可以用它来排除一些错误检测; 
  • minNeighbors参数:我们给人脸框起来的时候,一般一张脸会框许多的框,假如这张脸框得越多,说明质量越好,越是一张正确的“脸”。

二、Hog

对于第一次使用这个功能的同学,要提前下载一下dlib。

import dlib

# 构造HOG人脸检测器 不需要参数
hog_face_detetor = dlib.get_frontal_face_detector()

# 检测人脸获取数据
# img 
# scale类似haar的scalFactor
detections = hog_face_detetor(img,1)

# 解析获取的数据
for face in detections:
    # 左上角
    x = face.left()
    y = face.top()
    # 右下角
    r = face.right()
    b = face.bottom()
    cv2.rectangle(img,(x,y),(r,b),(0,255,0))
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

 

三、CNN

import dlib

# 构造CNN人脸检测器
cnn_face_detector = dlib.cnn_face_detection_model_v1("./weights/mmod_human_face_detector.dat")

# 检测人脸  参数与上一种相似
detections = cnn_face_detector(img,1)

for face in detections:
    # 左上角
    x = face.rect.left()
    y = face.rect.top()
    # 右下角
    r = face.rect.right()
    b = face.rect.bottom()
    # 置信度
    c = face.confidence
    print(c)
    
    cv2.rectangle(img,(x,y),(r,b),(0,255,0))
    
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

通过神经网络完成,这个过程中我们还可以查看每张脸检测时的置信度。

 

四、SSD

# 加载模型
face_detector = cv2.dnn.readNetFromCaffe('./weights/deploy.prototxt.txt','./weights/res10_300x300_ssd_iter_140000.caffemodel')

# 原图尺寸
img_height = img.shape[0]
img_width = img.shape[1]

# 放缩至输入尺寸
img_resized = cv2.resize(img,(500,300)) 

# 转为2进制
img_blob = cv2.dnn.blobFromImage(img_resized,1.0,(500,300),(104.0,177.0,123.0))

# 输入
face_detector.setInput(img_blob)

# 推理
detections = face_detector.forward()

此时

detections.shape # (1, 1, 200, 7)

说明有200个结果,后面的7则是我们做需要的一些数据,继续如下:

# 查看人脸数量
num_of_detections = detections.shape[2]


img_copy = img.copy()

for index in range(num_of_detections):
    # 置信度
    detections_confidence = detections[0,0,index,2]
    # 通过置信度筛选
    if detections_confidence > 0.15:
        # 位置  乘以宽高恢复大小
        locations = detections[0,0,index,3:7] * np.array([img_width,img_height,img_width,img_height])
        # 打印
        print(detections_confidence)
     
        lx,ly,rx,ry = locations.astype('int')
        # 绘制
        cv2.rectangle(img_copy,(lx,ly),(rx,ry),(0,255,0),2)
        
plt.imshow(cv2.cvtColor(img_copy,cv2.COLOR_BGR2RGB))     

 

五、MTCNN

# 导入MTCNN
from mtcnn.mtcnn import MTCNN

# 记载模型
face_detetor = MTCNN()

# 检测人脸
detections = face_detetor.detect_faces(img_cvt)
for face in detections:
    x,y,w,h = face['box']
    cv2.rectangle(img_cvt,(x,y),(x+w,y+h),(0,255,0),2)
plt.imshow(img_cvt)

 

对比

优势劣势
Haar速度最快、清凉、适合算力较小的设备准确度低、偶尔误报、无旋转不变性
HOG+Dlib比Haar准确率高速度比Haar低,计算量大、无旋转不变性、Dlib兼容性问题
SSD比Haar和hog准确率高、深度学习、大小一般低光照片准确率低,受肤色影响。
CNN最准确、误报率低、轻量相对于其他方法慢、计算量大、Dlib兼容性问题

opencv-python实战(15)——面部特征点检测详解(仅需5行代码学会3种面部特征点检测方法)(代码片段)

...点4.使用face_recognition检测面部特征点小结系列链接0.前言人脸处理是人工智能中的一个热门话题,人脸处理可以使用计算机视觉算法 查看详情

pyhton,opencv对象检测之——haar级联人脸及眼睛检测(代码片段)

Pyhton,OpenCV对象检测之——Haar级联人脸及眼睛检测1.效果图2.原理2.1Haar人脸检测原理2.2Haar级联预训练的模型3.源码3.1图像面部及眼睛检测3.2视频帧面部及眼睛检测参考这篇博客将介绍如何使用预训练的模型——基于Haar特征的... 查看详情

图像人脸检测(框出人脸笑脸眼睛)(代码片段)

1#通过图片识别人脸23#1.概述:人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部的一系列... 查看详情

android实现戴口罩人脸检测和戴口罩识别(附android源码)(代码片段)

Android实现戴口罩人脸检测和戴口罩识别(附Android源码)目录Android实现戴口罩人脸检测和戴口罩识别(附Android源码)1.戴口罩识别的方法(1)基于多类别目标检测的戴口罩识别方法(2)基于人脸检测+戴口罩分类识... 查看详情

android实现戴口罩人脸检测和戴口罩识别(附android源码)(代码片段)

Android实现戴口罩人脸检测和戴口罩识别(附Android源码)目录Android实现戴口罩人脸检测和戴口罩识别(附Android源码)1.戴口罩识别的方法(1)基于多类别目标检测的戴口罩识别方法(2)基于人脸检测+戴口罩分类识... 查看详情

javascript人脸检测的实现方法(代码片段)

...rdoLundgren开发的轻量级的javascript库,它可以让你做实时的人脸检测,色彩追踪和标记好友的脸。在这个教程中,我们将会看到,我们如何从静态图片中检测脸,眼睛和嘴巴。我一直对视频和图片中的人脸标记、检测和人脸识别技... 查看详情

基于yolo的人脸检测与人脸对齐(代码片段)

前言YOLO(YouOnlyLookOnce)是一种基于深度神经网络的对象识别和定位算法,yolo将对象定位作为回归问题求解,在one-stage中实现对象定位与识别,其最大的特点就是快!快!快!既然yolo本来就是通过... 查看详情

android实现戴口罩人脸检测和戴口罩识别(附android源码)(代码片段)

Android实现戴口罩人脸检测和戴口罩识别(附Android源码)目录Android实现戴口罩人脸检测和戴口罩识别(附Android源码)1.戴口罩识别的方法(1)基于多类别目标检测的戴口罩识别方法(2)基于人脸检测+戴口罩分类识... 查看详情

戴口罩人脸检测和戴口罩识别(含pythonandroid源码)(代码片段)

戴口罩人脸检测和戴口罩识别(含PythonAndroid源码)目录戴口罩人脸检测和戴口罩识别(含PythonAndroid源码)1.戴口罩识别的方法(1)基于多类别目标检测的戴口罩识别方法(2)基于人脸检测+戴口罩分类识别方法2.戴... 查看详情

戴口罩人脸检测和戴口罩识别(含pythonandroid源码)(代码片段)

戴口罩人脸检测和戴口罩识别(含PythonAndroid源码)目录戴口罩人脸检测和戴口罩识别(含PythonAndroid源码)1.戴口罩识别的方法(1)基于多类别目标检测的戴口罩识别方法(2)基于人脸检测+戴口罩分类识别方法2.戴... 查看详情

使用tensorrt对人脸检测网络mtcnn进行加速(代码片段)

前言最近在做人脸比对的工作,需要用到人脸关键点检测的算法,比较成熟和通用的一种算法是MTCNN,可以同时进行人脸框选和关键点检测,对于每张脸输出5个关键点,可以用来进行人脸对齐。问题刚开始准备对齐人脸图片用于... 查看详情

详解openvino模型库中的人脸检测模型(代码片段)

人脸检测模型OpenVINO的模型库中有多个人脸检测模型,这些模型分别支持不同场景与不同分辨率的人脸检测,同时检测精度与速度也不同。下面以OpenVINO2020R04版本为例来逐一解释模型库中的人脸检测,列表如下:从列表中可以看... 查看详情

详解openvino模型库中的人脸检测模型(代码片段)

人脸检测模型OpenVINO的模型库中有多个人脸检测模型,这些模型分别支持不同场景与不同分辨率的人脸检测,同时检测精度与速度也不同。下面以OpenVINO2020R04版本为例来逐一解释模型库中的人脸检测,列表如下:从列表中可以看... 查看详情

python到底有多强大?只需15行代码即可进行人脸检测(代码片段)

...段时间,在任何一种情况下,您都一定遇到过“人脸检测”这个词。随着机器变得越来越智能,它们模仿人类行为的能力似乎也在增加,而人脸检测就是人工智能的进步之一。私信小编01即可获取大量python学习资... 查看详情

计算机视觉opencv学习系列:第十部分实时人脸检测(代码片段)

第十部分、实时人脸检测第一节、实时人脸检测1.OpenCV人脸检测支持演化2.OpenCVDNN检测函数3.代码练习与测试学习参考第一节、实时人脸检测1.OpenCV人脸检测支持演化OpenCV4DNN模块DNN-深度神经网络来自另外一个开源项目tinydnnOpenCV3.3... 查看详情

[android]虹软人脸检测与人脸识别集成分享(代码片段)

目前我们的应用内使用了ArcFace的人脸检测功能,其他的我们并不了解,所以这里就和大家分享一下我们的集成过程和一些使用心得 集成ArcFaceFD的集成过程非常简单在ArcFaceFD的文档上有说明支持的系统为5.0及以上系统,但其... 查看详情

dlib+opencv库实现疲劳检测(代码片段)

...1.关键点检测2.算法实现的核心点3.算法实现(1)人脸的关键点集合(2)加载人脸检测库和人脸关键点检测库(3)绘制人脸检测的框(4)对检测之后的人脸关键点坐标进行转换(5)计算欧... 查看详情

人脸检测进阶:更快的5点面部标志检测器(代码片段)

人脸检测进阶:更快的5点面部标志检测器今天在这里的目标是向您介绍新的dlib面部标志检测器,它比原始版本更快(提高8-10%)、更高效、更小(10倍)。在这篇博文的第一部分,我们将讨论dlib的新的... 查看详情