使用Python,OpenCV和Haar级联进行人脸检测——轻量级的人脸检测器

  • 1. 效果图
  • 2. 原理
    • 2.1 项目结构
    • 2.2 [haarcascade_frontalface_default.xml下载](https://github.com/seminar2012/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml)
  • 3. 源码
    • 3.1 图像检测源码
    • 3.2 视频流实时检测源码
  • 参考

这篇博客将介绍一个轻量级的人脸检测器——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()

参考

  • https://www.pyimagesearch.com/2021/04/05/opencv-face-detection-with-haar-cascades/

使用Python,OpenCV和Haar级联进行人脸检测——轻量级的人脸检测器相关推荐

  1. 使用OpenCV,Haar级联检测器进行面部、眼睛、嘴部检测

    使用OpenCV,Haar级联检测器进行面部.眼睛.嘴部检测 1. 效果图 2. 原理 2.1 Haar级联是什么? 2.2 Haar级联的问题与局限性 2.3 Haar级联预训练的模型 3. 源码 ...

  2. Python+OpenCV:训练级联分类器(Cascade Classifier Training)

    Python+OpenCV:训练级联分类器(Cascade Classifier Training) Introduction Working with a boosted cascade of we ...

  3. 【OpenCV-Python】——Haar人脸检测深度学习人脸检测EigenFaces/FisherFaces/LBPH人脸识别

    目录 前言: 1.人脸检测 1.1 基于Haar的人脸检测 1.2 基于深度学习的人脸检测 2.人脸识别 2.1 EigenFaces人脸识别 2.2 FisherFaces人脸识别 2.3 LBPH ...

  4. Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测

    点击查看:Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测 文件大小:80M 操作系统:Windows10旗舰版 开发工具:Python3.8.OpenCV4.5.dlib 开发语言:.py ...

  5. Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection)

    Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection) 理论 Feature Detection using FAST Select ...

  6. Python+OpenCV:图像Harris角点检测(Harris Corner Detection)

    Python+OpenCV:图像Harris角点检测(Harris Corner Detection) 理论 corners are regions in the image with large v ...

  7. c#结合emgucv进行人脸检测_Python实时人脸识别/替换

    摄像头中的人脸检测,也是人脸识别的一部分, 摄像头播放的画面本质上是按帧将图片拼凑起来的, 有图片的话,获取图片的中人脸呢再上一篇中我们已经涉及了 想要进行人脸识别, 我们需要OpenCV, 还是先来 ...

  8. 人脸检测MTCNN和人脸识别Facenet(附源码)

    原文链接:人脸检测MTCNN和人脸识别Facenet(附源码) 在说到人脸检测我们首先会想到利用Harr特征提取和Adaboost分类器进行人脸检测(有兴趣的可以去一看这篇博客第九节.人脸检测之Haa ...

  9. CV之FDFA:利用MTCNN的脚本实现对LFW数据集进行FD人脸检测和FA人脸校准

    CV之FD&FA:利用MTCNN的脚本实现对LFW数据集进行FD人脸检测和FA人脸校准 目录 运行结果 运行过程 运行(部分)代码 在裁剪好的LFW数据集进行验证 运行结果 运行过程 time ...

最新文章

  1. LeetCode(13.罗马数字转整数) JAVA Hashmap
  2. 看一遍那些网络上晦涩的名词都弄明白了!
  3. Ubuntu下eclipse indigo版在线安装struts插件
  4. IBM:决胜量子计算五大战略!商用近在咫尺
  5. 华东交通大学2017年ACM双基程序设计大赛题解
  6. hadoop搭建_hadoop分布式搭建之虚拟机克隆
  7. 基于Maven的spring_security入门
  8. oracle软件静默安装程序,【oracle】静默安装 oracle 11gr2
  9. 《Pycharm操作和配置指南》这些不会,写Python肯定慢嘛
  10. 软件包管理:源码包管理-源码包与RPM包的区别
  11. 【Unity开源项目精选】AssetStudio:提取Unity游戏的资源
  12. python能学到什么-学习python三个月能学到什么?
  13. 从程序员到项目经理:原来一切问题都是可以解决的
  14. 深入体验java项目开发 pdf,深入体验Java Web项目开发.pdf
  15. OneNote插件Notehighlight个性化设置
  16. IE恶意修改防护大法(转)
  17. IOS开发之——硬件开发-加速计应用实例(04)
  18. python获取excel数据制作有文字和图表的报告_Python实现从excel读取数据并绘制成精美图像...
  19. 小众绿软|媒体:Soprano Audio Player v1.60
  20. 悲伤是一种毒,会上瘾

热门文章

  1. 客快物流大数据项目(十五):DockeFile常用命令
  2. Cache Aside Pattern(缓存模式)
  3. 你哪来这么多事(四):职工信息排序
  4. C++ 判断指针是否为空
  5. Android 10 新增的功能
  6. CF332C Students' Revenge
  7. 动态规划 最小编辑代价
  8. 如何编写可测试的golang代码
  9. RabbitMQ 入门系列(9)— Python 的 pika 库常用函数及参数说明
  10. Python 常见的坑汇总