使用Python,OpenCV和Haar级联进行人脸检测

Posted 程序媛一枚~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Python,OpenCV和Haar级联进行人脸检测相关的知识,希望对你有一定的参考价值。

这篇博客将介绍一个轻量级的人脸检测器——Haar级联人脸检测器,并实现对图像进行检测和实时视频中进行人脸检测。

尽管深度学习的人脸检测可以得到更准确的结果和更强大的脸部检测,但Haar级联人脸检测器也有其优势:模型小而轻巧 930kb;即使在资源受限的设备上,也超快速, 很适合在资源受限的设备上使用。

Haar级联人脸检测器缺点:易于伪阳性检测;比HOG线性SVM检测器,SSD,YOLO、深度学习人脸检测的准确性稍低;需要手动进行参数调整;

1. 效果图

用了我最喜欢的一对,晋嫣图,效果图1如下:
在这里插入图片描述
效果图2,可以看到左下角包含一个伪阳性结果
在这里插入图片描述
对于这种假阳性结果,可以调整minNeighbors 或者 minSize来保证正确的检测,消除假阳性结果。

rects = detector.detectMultiScale(gray, scaleFactor=1.05,
minNeighbors=5, minSize=(30, 30),
flags=cv2.CASCADE_SCALE_IMAGE)

通过调整minNeighbors=10,得到了正确的检测结果,效果图3如下:
在这里插入图片描述

2. 原理

当执行面部检测时,Haar级联检测器在图像上从左右和顶到底部滑动窗口,沿途计算整体图像。当Haar级联认为脸部在某个区域时,它将返回更高的置信度。如果给定区域有足够的高置信度分数,那么Haar Cascade将报告阳性检测。

通过增加区域的邻居个数,可以提升其消除假阳性结果。

2.1 项目结构

在这里插入图片描述

2.2 haarcascade_frontalface_default.xml下载

3. 源码

3.1 图像检测源码

# USAGE
# python haar_face_detector.py --image images/ty.png

# 导入必要的包
import argparse
import imutils
import cv2

# 构建命令行参数及解析
# --image 检测人脸的图像
# --cascade Haar Cascade的人脸检测器路径
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str, required=True,
                help="path to input image")
ap.add_argument("-c", "--cascade", type=str,
                default="haarcascade_frontalface_default.xml",
                help="path to haar cascade face detector")
args = vars(ap.parse_args())

# 加载 haar级联人脸检测器
print("[INFO] loading face detector...")
detector = cv2.CascadeClassifier(args["cascade"])

# 从磁盘加载输入图像,等比例缩放宽度为500,转换为灰度图
image = cv2.imread(args["image"])
image = imutils.resize(image, width=500)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 对图像进行haar级联人脸检测
print("[INFO] performing face detection...")
# scaleFactor 在每个图像刻度下图像尺寸减小了多少。此值用于创建图像金字塔。为了在图像中的多个不同大小处检测人脸(一些人脸可能更靠近前景,因此更大,其他在背景中的人脸可能更小,因此用不同尺度的使用)。
# 值1.05 表示在金字塔中的每个级别将图像的大小降低5%。
# minneighbors 级联分类器将围绕脸部检测多个窗口,每个脸部窗口至少具有5个邻居。此参数控制需要围绕脸部检测几个邻居矩形窗口。
# inssize 宽度和高度(以像素为单位)的元组,表示窗口的最小尺寸。小于此大小的边界框将被忽略。从(30,30)开始,然后微调.

# 对于假阳性结果,可以调整minNeighbors 或者 minSize来保证正确的检测,消除假阳性结果。
rects = detector.detectMultiScale(gray, scaleFactor=1.05,
                                  minNeighbors=10, minSize=(30, 30),
                                  flags=cv2.CASCADE_SCALE_IMAGE)
print("[INFO] {} faces detected...".format(len(rects)))

# 遍历检测到的人脸边界框
for (x, y, w, h) in rects:
    # 绘制人脸在图像上
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

# 展示结果图像
cv2.imshow("Image", image)
cv2.waitKey(0)

3.2 视频流实时检测源码

在实时视频流中进行面部检测,Haar级联人脸检测器轻巧而速度快,非常的合适。
如果想要更准确的结果,也可以选用基于深度学习的人脸检测器。

# USAGE
# python video_face_detector.py

# 导入必要的包
from imutils.video import VideoStream  # 获取视频流或者摄像头流
import argparse
import imutils
import time
import cv2

# 构建命令行参数及解析
# --cascade Haar Cascade的人脸检测器(haarcascade_frontalface_default.xml)路径
ap = argparse.ArgumentParser()
ap.add_argument("-c", "--cascade", type=str,
                default="haarcascade_frontalface_default.xml",
                help="path to haar cascade face detector")
args = vars(ap.parse_args())

# 加载 haar级联人脸检测器
print("[INFO] loading face detector...")
detector = cv2.CascadeClassifier(args["cascade"])

# 初始化摄像头流,并预热相机传感器2s
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
time.sleep(2.0)

# 遍历视频流中的帧
while True:
    # 获取下一帧,等比例缩放宽度为500,转换为灰度图
    frame = vs.read()
    frame = imutils.resize(frame, width=500)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 使用Haar级联执行人脸检测
    rects = detector.detectMultiScale(gray, scaleFactor=1.05,
                                      minNeighbors=5, minSize=(30, 30),
                                      flags=cv2.CASCADE_SCALE_IMAGE)

    # 遍历检测结果(人脸边界框)
    for (x, y, w, h) in rects:
        # 在图像上绘制人脸边界框
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

    # 展示输出帧
    cv2.imshow("Frame", frame)
    key = cv2.waitKey(1) & 0xFF

    # 按下‘q’键,结束检测
    if key == ord("q"):
        break

# 做一些清理工作
cv2.destroyAllWindows()
vs.stop()

参考

以上是关于使用Python,OpenCV和Haar级联进行人脸检测的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV-Python实战(番外篇)——基于 Haar 级联的猫脸检测器

OpenCV-Python实战(番外篇)——基于 Haar 级联的猫脸检测器

使用 OpenCV与 HAAR 级联算法进行人脸检测和人脸识别

Pyhton,OpenCV对象检测之——Haar级联人脸及眼睛检测

使用Python进行实时人脸检测(附完整代码)

OpenCV中的Haar级联分类器数据: