Opencv学习02--人脸识别技术实战:5种常用方法详解与代码实现

目录

一、Haar Cascade(哈尔级联检测器)

二、HOG(方向梯度直方图)

三、CNN(卷积神经网络)

四、SSD(单阶段检测器)

五、MTCNN(多任务级联网络)

六、实时摄像头检测示例(Haar)

方法对比与选型建议

环境配置注意事项


人脸识别是计算机视觉领域的核心技术之一,广泛应用于安防、支付、社交等领域。本文将介绍五种常用的人脸检测方法,并提供基于Python和OpenCV的代码实现,帮助读者快速上手实践。

一、Haar Cascade(哈尔级联检测器)

原理简介
Haar Cascade基于Haar-like特征和Adaboost分类器,通过级联结构快速筛选出人脸区域。优点是速度快,适合实时检测。

#步骤
#1。读取图片
#2.用Haar模型识别人脸
#将识别结果用人脸框画出来
import cv2
import numpy
%matplotlib inline
#在绘图代码前添加即可只显示在代码下方
import matplotlib.pyplot as plt
import  matplotlib
#解决pycharm图片显示问题,要改变为交互式才可以正常显示
matplotlib.use('TkAgg') #交互式参数设置
#调整图片显示大小
plt.rcParams['figure.dpi']=200
#读取图片
img=cv2.imread(r"C:\Users\30719\Desktop\opencv\P1.jpg")
#查看大小
img.shape
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
plt.show(block=True)

原图效果: 

 

构建haar检测器以后:(模型文件下载地址--github

#构建haar检测器
face_detector=cv2.CascadeClassifier(r"C:\Users\30719\Desktop\opencv\haar\haarcascade_frontalface_default.xml")
#haar检测是对灰度图进行检测
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#调节参数
#scaleFactor:调整图片尺寸,可以决定两个不同大小的窗口扫描之间有多大的跳跃,这个参数设置的大,则意味着计算会变快,但如果窗口错过了某个大小的人脸,则可能丢失物体。
#minNeighbors:为每一个级联矩形应该保留的邻近个数(候选框的数量),默认为3。minNeighbors控制着误检测,默认值为3表明至少有3次重叠检测,我们才认为人脸确实存。
#minSize:最小检测窗口大小,默认为(20,20)
#maxSize:最大检测窗口大小,默认为(1000,1000)
detection= face_detector.detectMultiScale(gray,scaleFactor=1.5,minNeighbors=6,minSize=(30,30),maxSize=(200,200))
for (x,y,w,h) in detection:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
#显示绘制结果
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
plt.show()

关键参数说明

  • scaleFactor:图像缩放因子(默认为1.1)

  • minNeighbors:候选框最小重叠数(值越大误检越少)

  • minSize/maxSize:人脸区域最小/最大尺寸

 注:以下内容默认都导入了cv2以及matplotlib,代码只涉及模型内容

二、HOG(方向梯度直方图)

原理简介
HOG通过计算图像的局部梯度方向直方图来描述特征,结合线性分类器实现检测。dlib库提供了高效的HOG人脸检测器。

#读取照片
img=cv2.imread(r"C:\Users\30719\Desktop\opencv\P1.jpg")
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
import dlib
#构造Hog人脸检测器
hog_face_detector=dlib.get_frontal_face_detector()
#检测人脸(是RGB通道)
#scale类似haar的scaleFactor,默认为1.1
detection=hog_face_detector(img,1)
#detection是自己类型的数组但可以迭代
#它这里直接给的是相应坐标
#解析检测结果
for i in detection:
    #左上角坐标
    start_point=(i.left(),i.top())
    #右下角坐标
    end_point=(i.right(),i.bottom())
    #画框
    cv2.rectangle(img,start_point,end_point,(255,0,0),2)
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
plt.show(block=True)

不难发现检测到的结果明显变多了!

三、CNN(卷积神经网络)

原理简介
基于深度学习的CNN模型(如dlib的MMOD)通过卷积层提取高级特征,检测精度更高,但计算资源消耗较大。

模型文件下载地址--github

import dlib
#构建CNN人脸检测器
cnn_face_detector=dlib.cnn_face_detection_model_v1(r"C:\Users\30719\Desktop\opencv\CNN\mmod_human_face_detector.dat")
#检测人脸
detection=cnn_face_detector(img,1)
#解析检测结果(注意相比上一个多一个rect)
for i in detection:
    #左上角坐标
    start_point=(i.rect.left(),i.rect.top())
    #右下角坐标
    end_point=(i.rect.right(),i.rect.bottom())
    #置信度
    conf=i.confidence
    print(conf)
    #画框
    cv2.rectangle(img,start_point,end_point,(255,0,0),5)
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

1.1018544435501099
1.0966800451278687
1.096663236618042
1.0941616296768188
1.0885225534439087
1.0741758346557617
1.073972463607788
1.071192979812622
1.0501601696014404
0.9586106538772583
0.9076035022735596
0.583004355430603
0.4041571617126465
0.2967815399169922

可以看到输出结果还有如上的置信度,我们可以通过置信度来筛选检测到的人脸

四、SSD(单阶段检测器)

原理简介
SSD(Single Shot MultiBox Detector)基于深度学习的端到端检测框架,兼顾速度与精度。OpenCV的DNN模块支持预训练模型。

模型文件下载地址--github 01 模型文件下载地址--github 02

#加载模型
detector=cv2.dnn.readNetFromCaffe(r"C:\Users\30719\Desktop\opencv\SSD\deploy.prototxt",                            
                                  r"C:\Users\30719\Desktop\opencv\SSD\res10_300x300_ssd_iter_140000.caffemodel")
#原图尺寸
img_height=img.shape[0]
img_width=img.shape[1]
#缩放至模型的图片尺寸大小
img_resize=cv2.resize(img,(300,300))
#图片转换为二进制
#输入图片的尺寸大小,缩放因子,大小,是否交换RB,是否裁剪
#(104.0, 177.0, 123.0)是均值减去参数,SSD用的均值默认即可
img_blob = cv2.dnn.blobFromImage(img_resize, 1.0, (300, 300), (104.0, 177.0, 123.0))
#输入图片
detector.setInput(img_blob)
#推理
detection=detector.forward()
#推理结果--(,,200,7)200是检测的人脸数量,7是矩形信息
print(detection.shape)
for i in range(detection.shape[2]):
    #置信度
    confidence=detection[0,0,i,2]
    #过滤掉置信度低的
    if confidence>0.2:
        #需要恢复原来矩形大小
        #左上角坐标
        x1=int(detection[0,0,i,3]*img_width)
        y1=int(detection[0,0,i,4]*img_height)
        #右下角坐标
        x2=int(detection[0,0,i,5]*img_width)
        y2=int(detection[0,0,i,6]*img_height)
        cv2.rectangle(img,(x1,y1),(x2,y2),(255,0,0),2)
#展示
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
plt.show(block=True)

不难看出检测的数量有点少,是因为这个模型主要检测正面人脸且不擅长这种多人多形态人脸,对于侧面人脸和遮挡人脸检测不好。我们可以同过调整置信度的判断条件(如>0.2)来使数量更多。

五、MTCNN(多任务级联网络)

原理简介
MTCNN通过三个级联网络(P-Net、R-Net、O-Net)同时检测人脸和关键点,精度高但速度较慢。

注意:虽然没有导入,但是也要tensorflow框架才可以使用!

from mtcnn.mtcnn import MTCNN
#加载模型
detector=MTCNN()
#检测人脸
detection=detector.detect_faces(img)
#解析检测结果--(x,y,w,h)=i['box']
for i in detection:
    #左上角坐标
    start_point=(i['box'][0],i['box'][1])
    #右下角坐标
    end_point=(i['box'][0]+i['box'][2],i['box'][1]+i['box'][3])
    #画框
    cv2.rectangle(img,start_point,end_point,(255,0,0),2)
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
plt.show(block=True)

 看上图。很明显对于新图第一运行时间会较长。

六、实时摄像头检测示例(Haar)

我们此处采用Haar方法来调用摄像头时间检测效果,以此作为例子。

'''
视频流检测人脸
1,构造haar人脸检测器
2,获取视频流
3,检测每一帧画面
4,画人脸框并显示
'''
#导入包
import cv2
import numpy as np
cap=cv2.VideoCapture(0)
#构造haar人脸检测器
haar_face_detector=cv2.CascadeClassifier(r"C:\Users\30719\Desktop\opencv\haar\haarcascade_frontalface_default.xml")
while True:
    ret,frame=cap.read()
    #因为摄像头提取视频是翻转的所以我们要翻转过来
    frame=cv2.flip(frame,1)
    #转为灰度图(因为检测器是要灰度图才能检测)
    gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    #检测人脸
    faces=haar_face_detector.detectMultiScale(gray,1.2,6)
    for x,y,w,h in faces:
        #画人脸框
        cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),3)
    #显示画面
    cv2.imshow('window',frame)
    #按下q键退出
    if cv2.waitKey(10) & 0xFF==ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

 效果视图:

方法对比与选型建议
方法速度精度适用场景
Haar★★★★★★实时检测、嵌入式设备
HOG★★★★★★中等精度需求场景
CNN★★★★★★高精度静态图像检测
SSD★★★★★★★平衡速度与精度的场景
MTCNN★★★★★需要关键点的复杂场景
环境配置注意事项
  1. 安装依赖库:

    pip install opencv-python dlib mtcnn matplotlib tensorflow

  2. 模型文件需从官方渠道下载并正确配置路径。

  3. 实时检测需确保摄像头权限开启。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值