本章将讲述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?
人脸五官有明显的区别。
例如:
- 眼睛要比脸颊颜色要深
- 鼻梁两侧比鼻梁颜色要深
- 嘴巴比周围颜色要深
- 眼睛区域往往比脸颊区域暗
- 鼻子区域比眼睛区域亮
so on…
而Haar就是一个人脸的模板,刚好可以契合人脸的图像特征
而这些特征,不会出现在其它物体上
什么是级联?
多组弱分类器,通过不断分类,最终筛选出检测目标
多级弱分类器与一个强分类器的效果相似,但级联类似于条件概率
级联的弱分类器的复杂度逐渐增加来提高算法的识别准确度
优劣对比
- 优点:速度极快
- 缺点:
1.Haar 级联不具有旋转不变性,即不认为侧面照与正面照是相同的,所以需要最有效的正面图像的脸;
2.精确度低
获取Haar级联数据
D:/opencv/CV/Haar/cascades/haarcascade_frontalface_default.xml
- 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()
CascadeClassifier检测的基本原理
xml中存放的是训练后的特征池,特征size大小根据训练时的参数而定,检测的时候可以简单理解为就是将每个固定大小的检测窗口与输入图像的同样大小区域比较,如果匹配那么就记录这个矩形区域的位置。
然后滑动窗口,检测图像的另一个区域。
重复操作。由于输入的图像中特征大小不定,比如在输入图像中眼睛是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()
参考资料
使用OpenCV,Haar级联检测器进行面部、眼睛、嘴部检测