opencv 取roi_opencv实现人脸识别快速入门
级联分类器原理介绍:
使用基于Haar特征的级联分类器进行对象检测是Paul Viola和Michael Jones在其论文“使用简单特征的增强级联进行快速对象检测”中于2001年提出的一种有效的对象检测方法。这是一种基于机器学习的方法,其中从许多正负图像中训练级联函数。然后用于检测其他图像中的对象。
在这里,我们将进行人脸检测。最初,该算法需要大量正图像(面部图像)和负图像(无面部图像)来训练分类器。然后,我们需要从中提取特征。为此,使用下图所示的haar功能。它们就像我们的卷积核。每个特征都是通过从黑色矩形下的像素总和中减去白色矩形下的像素总和而获得的单个值。
现在,每个内核的所有可能大小和位置都用于计算大量功能。(试想一下,它需要多少计算?即使是24x24的窗口也会产生超过160000个特征)。对于每个特征计算,我们需要找到白色和黑色矩形下的像素总和。为了解决这个问题,他们引入了积分图像。它简化了仅需要四个像素的操作的像素总和的计算(像素数量可以是多少)。很好,不是吗?它使事情变得超快。
但是在我们计算出的所有这些功能中,大多数都不相关。例如,考虑下图。第一行显示了两个好的功能。选择的第一个特征似乎着眼于眼睛区域通常比鼻子和脸颊区域更暗的性质。选择的第二个功能取决于眼睛比鼻子的鼻梁更黑的属性。但是在脸颊或其他任何地方使用相同的窗户是无关紧要的。那么,我们如何从160000多个功能中选择最佳功能?它是由Adaboost实现的。
为此,我们将所有功能应用于所有训练图像。对于每个特征,它会找到最佳的阈值,该阈值会将面部分为正面和负面。但是很显然,会有错误或分类错误。我们选择错误率最低的特征,这意味着它们是对面部和非面部图像进行最佳分类的功能。(此过程并非如此简单。开始时,每个图像的权重均相等。每次分类后,错误分类的图像的权重都会增加。然后再次执行相同的过程。将计算新的错误率。还要计算新的权重。继续执行该过程,直到达到所需的准确性或错误率或找到所需的功能数量为止。
最终分类器是这些弱分类器的加权和。之所以称其为弱,是因为它本身无法对图像进行分类,而是与其他图像一起构成一个强分类器。该论文说,甚至200个功能都可以提供95%的准确度检测。他们的最终设置具有大约6000个功能。(想象一下,从160000多个功能减少到6000个功能。这是很大的收获)。
因此,现在您拍摄一张照片。取每个24x24窗口。向其应用6000个功能。检查是否有脸。哇..哇..这不是效率低下又费时吗?是的。作者对此有一个很好的解决方案。
在图像中,大多数图像区域是非面部区域。因此,最好有一种简单的方法来检查窗口是否不是面部区域。如果不是,请将其一次性丢弃。不要再处理它。而是将注意力集中在可以有脸的区域。这样,我们可以找到更多时间检查可能的面部区域。
为此,他们引入了级联分类器的概念。不要将所有6000个功能部件应用到一个窗口上,而是将这些功能部件分组到不同的分类器阶段,然后逐一应用。(通常前几个阶段将包含很少的功能)。如果窗口在第一阶段失败,则将其丢弃。我们不考虑其剩余功能。如果通过,则应用功能的第二阶段并继续该过程。经过所有阶段的窗口是一个面部区域。计划如何!
作者的探测器具有6000多个特征,具有38个阶段,在前五个阶段具有1、10、25、25和50个特征。(上图中的两个功能实际上是从Adaboost获得的最佳两个功能)。根据作者的说法,每个子窗口平均评估6000多个功能中的10个。
因此,这是Viola-Jones人脸检测工作原理的简单直观说明。
在OpenCV中通过Haar级联检测完成人脸识别:
OpenCV配备了各种检测器。如果您想为任何物体(例如汽车,飞机等)训练自己的分类器,则可以使用OpenCV创建一个。
OpenCV已经包含许多针对面部,眼睛,微笑等进行过预训练的分类器。这些XML文件存储在opencv/data/haarcascades/
文件夹中。让我们用OpenCV创建面部和眼睛检测器。
首先,我们需要加载所需的XML分类器。然后以灰度模式加载我们的输入图像(或视频)。
- import numpy as np
- import cv2
- face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
- eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
- img = cv2.imread('sachin.jpg')
- gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
现在,我们在图像中找到了面孔。如果找到人脸,则将检测到的人脸的位置返回为Rect(x,y,w,h)。一旦获得这些位置,就可以为面部创建ROI,并在此ROI上进行眼睛检测(因为眼睛始终在脸上!!!)。
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
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_cascade.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()
结果如下:
作者:经典丶
opencv 取roi_opencv实现人脸识别快速入门相关推荐
- python读取视频流做人脸识别_基于OpenCV和Keras实现人脸识别系列——二、使用OpenCV通过摄像头捕获实时视频并探测人脸、准备人脸数据...
基于OpenCV和Keras实现人脸识别系列手记: 项目完整代码参见Github仓库. 本篇是上面这一系列手记的第二篇. 在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,而 ...
- Python人脸识别——从入门到工程实践
参考书籍:<Python人脸识别从入门到工程实践> 全书共8章: 第 1 章:介绍了人脸识别的基础知识和必备常识: 第 2~4 章:详细讲解了与人脸识别相关的数学.机器学习.计算机视觉.O ...
- Python OpenCV开发MR智能人脸识别打卡系统(三、工具模块设计)
需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下 Python OpenCV开发MR智能人脸识别打卡系统(一.需求分析与系统设计) Python OpenCV开发MR智能人脸识别打卡系统 ...
- 深度学习之基于opencv和CNN实现人脸识别
这个项目在之前人工智能课设上做过,但是当时是划水用的别人的.最近自己实现了一下,基本功能可以实现,但是效果并不是很好.容易出现错误识别,或者更改了背景之后识别效果变差的现象.个人以为是数据选取的问题, ...
- 3d人脸识别算法opencv_用Opencv打造自己的人脸识别
# 用Opencv打造自己的人脸识别 标签: opencv 人脸识别在现在使用的越来越多,所以使用opencv构造一个简单的人脸识别.步骤包括收集及处理数据,构建人脸识别器,进行人脸识别. 收集数据 ...
- 基于opencv和pillow实现人脸识别系统(附demo)
更多python教程请到友情连接: 菜鸟教程https://www.piaodoo.com 初中毕业读什么技校 http://cntkd.net 茂名一技http://www.enechn.com p ...
- Python OpenCV开发MR智能人脸识别打卡系统(一、需求分析与系统设计)
需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下链接 Python OpenCV开发MR智能人脸识别打卡系统(二.文件系统.数据实体模块设计) Python OpenCV开发MR智能人脸 ...
- Python OpenCV开发MR智能人脸识别打卡系统(四、服务模块设计)
需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下 Python OpenCV开发MR智能人脸识别打卡系统(一.需求分析与系统设计) Python OpenCV开发MR智能人脸识别打卡系统 ...
- Python OpenCV开发MR智能人脸识别打卡系统(五、程序入口设计与测试)
需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下 Python OpenCV开发MR智能人脸识别打卡系统(一.需求分析与系统设计) Python OpenCV开发MR智能人脸识别打卡系统 ...
最新文章
- 实现AI技术自立自强,国产深度学习框架面临三大难题
- 如何从Java中打印XML?
- 【深度学习】你不知道的车牌识别系统
- Build a Machine Learning Portfolio(构建机器学习投资组合)
- 最大流的算法——Edmonds-Karp算法(最短路径增广算法)
- go 访问数据库mysql基础
- STM32CUBEF4 实现USB 虚拟串口
- 【TensorFlow系列】【九】利用tf.py_func自定义算子
- 【计算机三级数据库技术】三级数据库技术应用题集锦
- 大米新闻微信小程序和Springboot新闻管理系统项目源码
- Android 的 Fragment 教程
- 190606-190610《跟秋叶学PPT》
- Python日期时间差的计算(天/小时/分钟)及timedelta函数的使用(附python代码)
- 二手书交易系统用例图
- 2021-2027全球与中国私人游艇市场现状及未来发展趋势
- python同花顺 财务_使用Python抓取同花顺资金流数据
- 数字信号处理—傅里叶变换
- 工程师文化:正版软件应该公司买吗
- java ssm基于身份识别的考生考试签到管理系统
- 无心剑英译李白诗32首
热门文章
- leetcode 438. Find All Anagrams in a String | 438. 找到字符串中所有字母异位词(Java)
- leetcode 382. Linked List Random Node | 382. 链表随机节点(Java)
- 【Java静态代理】以模拟“婚庆公司帮助你嫦娥奔月”为例
- 在java中使用SPI创建可扩展的应用程序
- Leet Code OJ 203. Remove Linked List Elements [Difficulty: Easy]
- Mysql日志-RedoLog、UndoLog和BinLog的关系捋顺
- spark on yarn 使用自定义jdk
- 28行代码AC——Minimum Sum LCM UVA - 10791(最大质因子)
- Python数据结构学习笔记——链表:无序链表和有序链表
- mysql 多级分类_数据库多级分类相关行排列在一起的查询