CV16 人脸检测:Haar级联

本文涉及的产品
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,视频资源包5000点
简介: 因为Haar级联是在机器学习AdaBoost、Boosting的基础上提出的,由于我还没有学过机器学习,所以这部分的内容日后再描述,我将根据自己的理解浅显地解释一下

本章将讲述CV史上最经典的算法Haar级联🤤


  • 什么是Haar级联?
  • 图片和视频中的人脸检测
  • face_cascade.detectMultiScale()函数


2001年,Viola和Jones两位大牛发表了经典的《Rapid Object Detectionusing a Boosted Cascade of Simple Features》和《Robust Real-Time Face Detection》,在AdaBoost算法的基础上,使用Haar-like小波特征和积分图方法进行人脸检测。他们设计了针对人脸检测更有效的特征,并对AdaBoost训练出的强分类器进行级联。这可以说是CV史上里程碑式的一笔了,也因此当时提出的这个算法被称为Viola-Jones检测器。随后这两位大牛将这个检测器进行了扩展,最终形成了OpenCV现在的Haar分类器。


Haar级联简介


因为Haar级联是在机器学习AdaBoost、Boosting的基础上提出的,由于我还没有学过机器学习,所以这部分的内容日后再描述,我将根据自己的理解浅显地解释一下🧐


什么是Haar?


人脸五官有明显的区别。


例如:


  1. 眼睛要比脸颊颜色要深
  2. 鼻梁两侧比鼻梁颜色要深
  3. 嘴巴比周围颜色要深
  4. 眼睛区域往往比脸颊区域暗
  5. 鼻子区域比眼睛区域亮


so on…


而Haar就是一个人脸的模板,刚好可以契合人脸的图像特征


而这些特征,不会出现在其它物体上


什么是级联?


多组弱分类器,通过不断分类,最终筛选出检测目标


05cb744265c279d7f2f13ac9591861b8.jpg


多级弱分类器与一个强分类器的效果相似,但级联类似于条件概率


级联的弱分类器的复杂度逐渐增加来提高算法的识别准确度


优劣对比


  • 优点:速度极快


  • 缺点:


1.Haar 级联不具有旋转不变性,即不认为侧面照与正面照是相同的,所以需要最有效的正面图像的脸;

2.精确度低


获取Haar级联数据


D:/opencv/CV/Haar/cascades/haarcascade_frontalface_default.xml


2f664149dcb236e35e65c1263d105a9c.png


  • haarcascade_frontalface_default.xml:检测面部
  • haarcascade_eye.xml:检测左眼和右眼
  • haarcascade_smile.xml:检测面部是否存在嘴部
  • haarcascade_eye_tree_eyeglasses.xml:检测是否带墨镜🕶
  • haarcascade_frontalcatface.xml:检测猫脸
  • haarcascade_frontalcatface_extended.xml:检测猫脸延伸
  • haarcascade_frontalface_alt.xml:检测猫脸属性
  • haarcascade_frontalface_alt_tree.xml
  • haarcascade_frontalface_alt2.xml
  • haarcascade_fullbody.xml:检测全身
  • haarcascade_lefteye_2splits.xml:检测左眼
  • haarcascade_licence_plate_rus_16stages.xml:检测证件
  • haarcascade_lowerbody.xml:检测下半身
  • haarcascade_profileface.xml
  • haarcascade_righteye_2splits.xml:检测右眼
  • haarcascade_russian_plate_number.xml:检测俄罗斯字母车牌号
  • haarcascade_upperbody.xml:检测上半身


这些xml文件,其实就是机器学习中的模型


检测人脸


在静态图片上人脸检测


import cv2
import numpy as np
face_cascade = cv2.CascadeClassifier('D:/opencv/CV/Haar/cascades/haarcascade_frontalface_default.xml')
img = cv2.imread('face2.jpg')
img = cv2.resize(img,(720,720),interpolation=cv2.INTER_LANCZOS4)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray,1.08,5)
for(x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('face',img)
cv2.waitKey()
cv2.destroyAllWindows()

009d8ee8616b9f92aa84d6bce0c58199.png


CascadeClassifier检测的基本原理


xml中存放的是训练后的特征池,特征size大小根据训练时的参数而定,检测的时候可以简单理解为就是将每个固定大小的检测窗口与输入图像的同样大小区域比较,如果匹配那么就记录这个矩形区域的位置。


然后滑动窗口,检测图像的另一个区域。


20210626214219542.gif


重复操作。由于输入的图像中特征大小不定,比如在输入图像中眼睛是25x25的区域,而训练时的是50x50,那么只有当输入图像增大到一半的时候,才能匹配上,所以这里还有一个逐步增大图像,也就是制作图像金字塔的流程。而每次增大的比例由scaleFactor决定


face_cascade.detectMultiScale()函数


功能:检测目标,返回目标位置的四个顶点


输入参数:


1.img:输入图像,灰度图运算速度更快

2.scaleFactor:每次循环增大的比例

3.minNeighbors:表示构成检测目标的相邻矩形的最小个数(默认为3个),数值越大人脸被筛选的难度越大,同样也越精确

4.minSize=(120,120):小于这个范围的矩形,就不被认定为检测目标


示例faces = face_cascade.detectMultiScale(gray,1.08,5,minSize=(120,120))


在视频上进行人脸检测


import cv2
import numpy as np
face_cascade = cv2.CascadeClassifier('D:/opencv/CV/Haar/cascades/haarcascade_frontalface_default.xml')
camera = cv2.VideoCapture(0)
while(cv2.waitKey(1)==-1):
    success,img = camera.read()
    if success:
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray,1.08,5,minSize=(120,120))
        for(x,y,w,h) in faces:
            img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        cv2.imshow('face',img)
cv2.destroyAllWindows()


参考资料


(四十八)Haar级联检测器

haar分类器原理和opencv实现

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

opencv人脸检测_cascade.detectMultiScale参数详解

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

opencv人脸检测_cascade.detectMultiScale参数详解

相关文章
|
6月前
|
机器学习/深度学习 XML 算法
Haar
【6月更文挑战第11天】
47 3
|
6月前
|
计算机视觉
OpenCV图像二值化
OpenCV图像二值化
ORB特征检测
ORB特征检测
71 1
SURF特征检测
SURF特征检测
57 1
|
7月前
|
算法 计算机视觉
OpenCV对图像进行Otsu二值分割、Canny边缘检测、Harris角点检测实战(附源码)
OpenCV对图像进行Otsu二值分割、Canny边缘检测、Harris角点检测实战(附源码)
103 0
|
7月前
|
计算机视觉
OpenCV(八):图像二值化
OpenCV(八):图像二值化
121 0
|
算法 API 计算机视觉
OpenCV_08 边缘检测:Sobel检测算子+Laplacian算子+Canny边缘检测
边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。
345 0
|
算法 数据可视化 计算机视觉
CV17 HOG特征提取算法
假设有这么一幅图片(gray格式),取出64*128大小的部分,通过选择其中的一个像素点及其周围的3x3区域,计算梯度和大小
322 0
|
编解码 资源调度 算法
CV学习笔记-尺度不变特征变换(SIFT)
CV学习笔记-尺度不变特征变换(SIFT)
539 0
CV学习笔记-尺度不变特征变换(SIFT)
|
算法 数据中心 计算机视觉
CV学习笔记-特征提取
CV学习笔记-特征提取
199 0
CV学习笔记-特征提取

热门文章

最新文章