【深度分析之harr级联分类器】

一、 什么是级联分类器?

分类器需要对图像的多个特征进行识别。例如,在识别一个动物是狗(正类)还是其他动物(负类)时,直接根据多个条件进行判断流程是非常烦琐的。

如果先判断该动物有几条腿,有四条腿的动物被判断为可能为狗,并对此范围内的对象继续进行分析和判断。没有四条腿的动物直接被否决,即不可能是狗。只通过比较腿的数目就能排除样本集中大量的负类(如鸡、鸭、鹅等不是狗的动物的实例)。

级联分类器就是基于这种思路将多个简单的分类器按照一定的顺序级联而成的。

Haar级联分类器是一种基于机器学习的目标检测算法,特别在人脸检测领域具有广泛的应用。下面将从多个方面对其进行详细介绍:

基本概念:

Haar级联分类器由多个弱分类器组成,通过级联结构实现高效的目标检测。
它主要依赖于Haar特征和AdaBoost算法进行训练和检测。

Haar特征:

Haar特征是一种在计算机视觉中常用于对象检测的特征描述方法。
它通过计算图像中不同区域间的像素和之差来描述图像的局部信息,如边缘、线条和角等。
常见的Haar特征包括边缘特征、线条特征和中心特征等。

级联分类器结构:

级联分类器由多个层级联而成,每个层级包含一系列弱分类器。
检测过程中,图像通过每个层级的弱分类器进行逐步筛选,只有被当前层级判定为正例的样本才会进入下一层级继续检测。
这种结构可以大大降低错误检测率,并提高检测速度。

训练过程:

训练过程包括准备正样本集和负样本集、特征提取、训练分类器和级联生成等步骤。
AdaBoost算法用于训练级联分类器,通过迭代调整弱分类器的权重,并将它们组合成一个强分类器。

优点:

快速:Haar级联分类器使用积分图方法进行特征计算,可以快速计算出矩形区域的像素值之和,提高了特征值的计算速度。
准确:通过AdaBoost训练方法,Haar级联分类器可以更准确地识别出目标对象。
简单:其原理简单易懂,易于实现和与其他方法结合使用。

缺点:

计算复杂度高:在较大的图像上进行检测时,需要消耗大量的计算资源。
对光照和姿态变化敏感:当图像中的光照条件或目标姿态发生较大变化时,可能会影响检测性能。

应用场景:

Haar级联分类器主要应用于人脸检测领域,但也可以用于其他物体的识别。

综上所述,Haar级联分类器是一种基于Haar特征和AdaBoost算法的目标检测算法,具有高效、准确和简单的特点。然而,它也存在计算复杂度高和对光照、姿态变化敏感等缺点。在实际应用中,需要根据具体需求和环境条件进行选择和优化。

二、harr级联检测在人脸检测领域中的应用

1. 图像人脸检测

代码

函数说明:

'''------分类器检测实现人脸识别-----'''
#objects =cv2.CascadeClassifier,detectMultiScale( imagel,scaleFactorl,minNeighborsl,flagsl,minSize.maxSize]]]])
# 其中,各个参数及证回值的含义如下。
# image:待检测图像,通常为灰度图像
#·scaleFactor:表示在前后两次相继扫描中搜索窗口的缩放比例、识别、扫播、按照不同比例来进行扫描
# #·minNeighbors:表示构成检测目标的相邻矩形的最小个数。在默认情况下,该参数的值为3.表示有 3 个以上的检测标记存在时才认为存在人脸。
#                   如果希望提高检测的准确率可以将该参数的值设置得更大格但这样做可能会让一些人脸无法被检测到。
#flags:该参数通常被省略、在使用低版本0pencV(openCV 1.X 版本)时,该参数可能会被设置为
# #CV_HAAR_DO_CANNY_PRUNING,表示使用Canny 边缘检测器拒绝一些区域
# #·minSize:目标的最小尺寸,小于这个尺寸的目标将被忽路。
# maxSize:目标的最大尺寸,大于这个尺寸的目标将被忽略。通常情况下,将该可选参数省略即可
#           若maxSize 和minSize 大小一致,则表示仅在一个尺度上查找目标。
# #·objects:返回值、目标对象的矩形向量组。该是一组矩形信息,
#           包含每个检测到的人脸对应的矩形框的信息(x轴方向位置、y轴方向位置、宽度、高度)
import cv2

image = cv2.imread('img.jpg')
gray = cv2. cvtColor(image, cv2.COLOR_BGR2GRAY)

# cv2.CascadeClassifier用于加载Haar或LBP特征的训练好的分类器
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

faces = faceCascade.detectMultiScale(gray,
                                     scaleFactor = 1.05,
                                     minNeighbors = 7,
                                     minSize = (8,8))


print("发现{0}张人脸!".format(len(faces)))
print("其位置分别是: ", faces)

'''-------------标注人脸及显示-----'''
for(x,y,w,h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0,255,0), 2) #对应的颜色、粗度

cv2.imshow("result", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b076a70806a74b39b096500171b65ac3.png

注意!!

对于不同图片中的人脸检测,检测的效果可能不同。原因就是代码中的参数需要调整。
也就是 faceCascade.detectMultiScale()函数中的minNeighbors参数的值需要调整,该参数的意义就是:

  • minNeighbors: 表示构成检测目标的相邻矩形的最小个数。在默认情况下,该参数的值为3.表示有 3 个以上的检测标记存在时才认为存在人脸。

2. 人脸微笑检测

代码

import cv2

faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') #open创建出人脸检测对象
smile=cv2.CascadeClassifier('haarcascade_smile.xml')#创建smile微笑检测对象

cap=cv2.VideoCapture(0)#初始化摄像头
while True:  #处理每一帧
    ret, image = cap.read() #读取一帧
    image = cv2.flip(image, 1)  # 图片翻转,水平翻转
    # 没有读到,直接退出
    if ret is None:
        break
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  #灰度化(彩色BGR->灰度Gray)
    faces = faceCascade.detectMultiScale(gray,
                                         scaleFactor = 1.1,
                                         minNeighbors = 5,#最小的人脸检测
                                         minSize = (5, 5))  #人脸检测

    # ==================处理每个人脸=======================
    for (x, y, w, h) in faces:
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
        roi_gray_face = gray[y:y + h, x:x + w]
        # 微笑检测,仅在人脸区域内检测
        smiles = smile.detectMultiScale(roi_gray_face,
                                        scaleFactor = 1.5,
                                        minNeighbors = 10,
                                        minSize = (50, 50))

        for (sx, sy, sw, sh) in smiles:
            #显示文字“smile"表示微笑了
            cv2.putText(image, "smile", (x, y), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1,
                        (0, 255, 255), thickness = 2)

    # 显示结果
    cv2.imshow("dect", image)
    key = cv2.waitKey(25)
    if key == 27:
        break

cap.release()
cv2.destroyAllWindows()

结果

1. 摄像头检测的人脸画面不微笑:

在这里插入图片描述

2. 摄像头检测的人脸画面微笑:

在这里插入图片描述

注意!!

和人脸检测类似,微笑检测也需要通过调整detectMultiScale()函数中minNeighbors参数的值来实现检测率的改变,数值越小,检测的灵敏度越高,(一点点微笑可能就会被检测出来);数值越大,灵敏度越低。实际使用的时候课通过改变参数的值达到最优的检测效果


xue

  • 36
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值