在 python 中使用 Haar-Cascade 进行人脸检测

news2024/11/22 15:10:07

bca17258d26b726b152d1c977b486992.png

介绍

在本文中,我们将讨论在 OpenCV python 中使用 Haar Cascade(级联)实现人脸检测器。

识别图像中的给定对象称为对象检测。可以使用多种技术来完成此任务,但在本文中,我们将使用带有预训练 XML 文件的 haar 级联。这是执行对象检测的最简单方法。

Haar 级联已用于低边缘设备上的对象检测,它是 OpenCV 中最流行的对象检测算法之一。

Haar 级联计算量不大;因此它适用于计算能力较小的小型设备。

Haar 级联

什么是 Haar 级联,它是如何工作的?

Haar 级联 是一种基于特征的对象检测算法,用于从图像中检测对象。Cascade 函数在大量正负图像上进行训练以进行检测。

该算法不需要大量计算并且可以实时运行。我们可以为动物、汽车、自行车等自定义对象训练自己的级联函数。

Haar 级联 不能用于人脸识别,因为它只能识别匹配的形状和大小。

Haar 级联使用 Cascade 函数和 Cascade 窗口。它尝试计算每个窗口的特征并进行正负分类。如果窗口可以是对象的一部分,则为正,否则为负。

4be5bc53079267cd5554ced42077aa5e.png

Haar 级联可以理解为二进制分类器。它为那些可以成为我们对象一部分的级联窗口指定正值,为那些不能成为我们对象的一部分的窗口指定负值。

  • Haar 级联可以实时工作。

  • 与现代对象检测算法相比,Haar 级联并不准确。

  • 它检测到许多误报。这可以在一定程度上进行调整,但不能完全删除。

  • 实现起来非常简单。

  • Haar 级联最大的缺点是它的误报检测。

预训练的 Haar 级联

有许多预训练的 haar 级联文件使实施变得超级容易。我们也可以训练自己的 haar 级联,但这需要大数据进行训练。

OpenCV 库在 GitHub 上管理所有流行的 haar 级联预训练文件的存储库

链接地址:https://github.com/opencv/opencv/tree/master/data/haarcascades

这些文件可用于各种对象检测任务,例如:

  • 人脸检测

  • 眼睛检测

  • 车辆检测

  • 鼻子/嘴巴检测

  • 身体检测

  • 车牌检测

3342f1eb5edeedd644991de0b4e215d5.png

Haar 级联将其特征存储在一个 XML 文件中;这些文件可以直接加载到 OpenCV 中,使用 Haar 级联进行对象检测。

在 OpenCV 中实现 Haar 级联

如果你正在使用 OpenCV 提供的存储库中可用的任何预训练对象检测,则只需下载预训练的 XML 文件。

在 Python 中安装 OpenCV

可以使用 python 中的 pip 包管理器安装 OpenCV。

!pip install opencv-python
#---OR ---
!pip install opencv-contrib-python

在 OpenCV 中加载 Haar 级联

我们可以使用函数cv2.CascadeClassifier加载 haar-cascade XML 文件。

face_detector=cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)
eye_dectector = cv2.CascadeClassifier(‘haarcascade_eye.xml’)

一旦加载了 XML 文件,我们就可以调用检测器函数。

results = face_detector.detectMultiScale(gray_img, scaleFactor=1.15,minNeighbors=5,minSize=(34, 35), flags=cv2.CASCADE_SCALE_IMAGE)
# import the necessary packages
import cv2

face_detector=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_dectector = cv2.CascadeClassifier('haarcascade_eye.xml')

image = cv2.imread('tomato.jpg')
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

results = face_detector.detectMultiScale(gray_img, scaleFactor=1.15,minNeighbors=5,minSize=(34, 35), flags=cv2.CASCADE_SCALE_IMAGE)
print(results)

results是检测到的对象周围的边界框坐标 (x,y,w,h) 的列表。

detectMultiScale中的参数:

  • scaleFactor:这表示对象的大小与原始图像相比减小了多少。

  • minNeighbors:此参数告诉在单个边界框中应该有多少个邻居。

  • minSize :这表示我们图像中对象的最小可能大小。如果我们的对象小于 minSize ,它将被忽略。

注意:对于对象检测,我们必须使用gray_image, minNeighborsscaleFactor等参数。

人脸检测

让我们以第一个使用预训练 haar 级联的对象检测示例为例,我们将使用 Python 从图片中检测人脸。

使用此链接下载用于人脸检测的级联文件:https://github.com/opencv/opencv/tree/master/data/haarcascades

import numpy as np
import cv2
#---loading the Haar 级联 detector using CascadeClassifier---face_detector=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
#---Loading the image from local -----
img = cv2.imread('team_india.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
results = face_detector.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in results:
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
  
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • results它包含图片中边界框的坐标。

  • detectMultiScale此方法仅适用于灰度图片。

  • cv2.rectangle允许我们在传递坐标后绘制矩形。

  • scaleFactor = 1.3FineTuning 参数,取值范围从 1 到 2。

984bef5f9c23965302c941f3f97133fd.png

分级检测

Haarcascade 支持分级检测,这意味着 Haar 级联能够以分级方式检测单个帧内的多个对象。

假设我们必须检测人类的面部和眼睛。要继续执行任务,我们需要执行以下步骤。

  • 检测人脸

  • 对于每张脸,裁剪人脸并将其转发以进行眼睛检测

  • 在找到眼睛的坐标 ( ex,ey,ew,eh) 后,在原始图片中的眼睛周围绘制一个边界框。

  • 在原始图片上使用坐标(x,y,w,h)在面部周围绘制一个边界框。

import numpy as np
import cv2
face_detector1=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_detector1 = cv2.CascadeClassifier('haarcascade_eye.xml')
img = cv2.imread('uman.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces_result = face_detector.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces_result:
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
eyes = eye_detector.detectMultiScale(roi_gray)
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
6cc6da7b1d64ba9720066a8e1fbe5879.jpeg

实时实现人脸检测

我们可以在 OpenCV 视频流中使用 Haar 级联进行对象检测,只需要在 OpenCV 中读取视频或摄像头,其余的都是一样的。

视频源是一系列帧,因此代码与单个帧相同。由于其轻计算要求,Haar 级联每秒运行良好。

我们将读取 OpenCV 视频摄像头输入以实时拍摄图像。

import cv2
face_detector1 = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_dectector1 = cv2.CascadeClassifier('haarcascade_eye.xml')
# reading the input image now
cap = cv2.VideoCapture(0)
while cap.isOpened():
    _, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = face_detector1.detectMultiScale(gray,1.1, 4 )
    for (x,y, w, h) in faces:
    cv2.rectangle(frame, pt1 = (x,y),pt2 = (x+w, y+h), color = (255,0,0),thickness =  3)
    roi_gray = gray[y:y+h,x:x+w]
    roi_color = frame[y:y+h, x:x+w]
    eyes = eye_dectector1.detectMultiScale(roi_gray)
    for (ex,ey, ew, eh) in eyes:
        cv2.rectangle(roi_color, (ex,ey), (ex+ew, ey+eh), (0,255,0), 5)
    cv2.imshow("window", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
frame.release()

眼睛和面部的边界框将是实时的,并且每帧都会发生变化。

Haar 级联人脸检测的局限性

Haar 级联对于人脸、汽车等一些对象仍然很受欢迎,这些对象很容易区分。

Haar 级联不能用于深度目标检测,如谷物类型等。

Haar 级联算法有一些限制:

  • 与现代对象检测器相比,精度较低。

  • 高假阳性检测。

  • 需要手动调整参数。

  • 为自定义对象训练 haar 级联并不容易。

结论

在本文中,我们讨论了 haar 级联的工作原理以及如何在 python 中使用 OpenCV实现 haar 级联以进行对象检测。我们使用预训练的 haar 级联文件进行人脸检测和眼睛检测,然后我们实时执行相同的操作。

我们还谈到了 haar 级联算法的局限性,为什么它仍然被广泛使用,为什么它这么快。

  • 可以使用手动参数调整来修复误报率。

  • YOLO、SSD 和其他深度学习对象检测算法保证了更高的准确性。

  • 训练自定义 haar 级联既耗时又低效。

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

652015772e601b871c9d01efe9b251c4.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

毕业设计 单片机多功能红外空调遥控器 - 嵌入式 物联网

文章目录0 前言1 简介2 主要器件3 实现效果4 硬件设计空调遥控器原理原理图解码IR信号5 软件说明代码与Homekit进行连接5 最后0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩…

3D nunuStudio脚本开发入门

在 3D应用集成开发环境 nunuStudio 中,脚本是使用 javascript 语言编写的,javascript 是用于开发网页的语言,它是一种易于学习的语言,本教程不需要任何编程知识。 但我建议你在继续学习下一个教程之前学习 javascript 编程的基础知…

JSP | oa项目增加用户登录的功能

目录 一:实现用户登录的功能 (1)当前oa应用还存在的问题? (2)实现登录功能? (3)最终达到的结果? (4)目前存在的问题?…

ASEMI-GBU808整流桥如何测好坏

编辑-Z 整流桥是将交流转化为直流的集成电路设备,主要用于开关电源或逆变电源的整流电路。接下来,让我们了解GBU808整流桥,以及GBU808整流桥如何测好坏的方法。 整流桥GBU808的结构 整流桥GBU808有四只脚分别是AC输入两只脚,用符…

​win10下安装 RabbitMQ​

下载安装包:RabbitMQ-Windows版.7z-Java文档类资源-CSDN下载 下载RabbitMQ一定要保持 Erlang 和 RabbitMQ 的版本匹配 1、安装 Erlang 安装 RabbitMQ 之前需要先安装 Erlang 环境 Erlang 下载地址 https://www.erlang.org/downloads 2、安装 RabbitMQ RabbitMQ 下…

【网络层】RIP协议详解(应用层)、慢收敛、OSPF协议(适合大网络)

注:最后有面试挑战,看看自己掌握了吗 文章目录路由选择分类RIP--距离向量路由选择------简单-------每个路由器维护一个到其他的最佳距离向量记录---------跳数最少-----RIP距离最高16(不可达)最多15个网络-------只适合小的互联网…

Springboot集成activiti7

在pom文件中添加SpringBoot集成Activiti7的依赖 <!--添加activiti和SpringBoot整合的依赖内置的MyBatis版本与外面的会有冲突&#xff0c;所以需要排除--> <dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-start…

毕业设计-深度学习身份证号码检测识别-python-opencv

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

Spring Security HTTP认证

本文内容来自王松老师的《深入浅出Spring Security》&#xff0c;自己在学习的时候为了加深理解顺手抄录的&#xff0c;有时候还会写一些自己的想法。 HTTP提供了用户权限控制和认证的通用方式&#xff0c;这种认证方式通过HTTP请求头来提供认证信息&#xff0c;而不是通过表单…

[附源码]计算机毕业设计基于Springboot校园运动会管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

opencv c++ 霍夫圆检测

1、原理 a&#xff09;对某点&#xff0c;以其为圆心的圆为无数&#xff08;一圈圈的圆&#xff09;&#xff0c;将其从x-y平面坐标系上转换到r-θ极坐标系上后&#xff0c;则变成了以r、θ为自变量&#xff0c;为固定值&#xff0c;x、y为因变量的式子&#xff1a; b&#xff…

一文带你走进JS语法(最全笔记)

目录 基本语法 1.引入方式 2.注释 3.输入输出语句 4.变量和常量 5.原始数据类型 6.运算符 7.流程控制语句 8.数组 9.函数 DOM 1.概述 2.元素对象的操作 3.元素内属性操作 4.元素内文本操作 事件 面向对象 1.定义类的方式 2.继承 内置对象 1.Number对象 2…

matlab贝叶斯隐马尔可夫hmm模型实现

贝叶斯隐马尔可夫模型是一种用于分割连续多变量数据的概率模型。该模型将数据解释为一系列隐藏状态生成。每个状态都是重尾分布的有限混合&#xff0c;具有特定于状态的混合比例和共享的位置/分散参数。 相关视频&#xff1a;马尔可夫链原理可视化解释与R语言区制转换Markov r…

java面试总结

文章目录JVM类的加载过程类加载器有哪些什么是双亲委派双亲委派的好处如何打破双亲委派java内存模型栈帧的结构java堆的分代设计对象内存分配对应的GC为什么需要Survivor区?只有Eden不行吗&#xff1f;为什么要有两个Survivor区对象创建过程对象内存布局对象头Mark Word对象大…

提高 K8S 容器运行时的可观察性最佳方法之一

当谈到云原生可观察性时&#xff0c;可能每个人都会提到OpenTelemetry (OTEL)&#xff0c;因为社区需要依赖标准来将所有集群组件开发指向到同一方向。OpenTelemetry 使我们能够将日志、指标&#xff08;metrics&#xff09;、跟踪&#xff08;traces&#xff09;和其他上下文信…

内容爆炸时代,如何打造品牌经营的“弹药库”?

&#x1f446;点击一键预约本周三主题直播&#x1f446;2017年&#xff0c;华为总裁办发布《华为之熵&#xff0c;光明之矢》的内部学习邮件&#xff0c;将热力学中“熵”的概念应用到企业管理中&#xff0c;成为被人们津津乐道的“熵减哲学”。对于“熵”的概念&#xff0c;大…

[附源码]计算机毕业设计基于vuejs的文创产品销售平台app

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计甜品购物网站Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【OpenCV-Python】教程:4-2 Harris角点检测

OpenCV Python Harris 角点检测 【目标】 理解Harris角点检测背后的概念&#xff1b;cv2.cornerHarris(), cv2.cornerSubPix() 【理论】 上一章节中&#xff0c;我们看到在图像中每个方向变化都很大的区域就是角点&#xff0c;一个早期的尝试是由 Chris Harris & Mike …

关闭图片窗口

关闭图片窗口 结果演示 概述 通过事件的绑定来实现&#xff0c;关闭网页中某个图片窗口的效果。 构建HTML框架 <body><div class"box">图片<img src"https://upload-bbs.mihoyo.com/upload/2021/03/11/73281682/f810fbc2e4806aab8176e96feee…