Haar特征描述算子 | Datawhale 六月组队学习(task3)

前言

  • 以前的人脸检测都是基于像素,基于统计学的概念进行研究。有了Haar之后,人脸检测分类器才出现,准确率也得到了提高。
  • Haar分类器 = Haar-like小波特征 + 积分图方法 + AdaBoost +级联
  • Haar分类器算法的要点如下:
  1. 使用Haar-like特征做检测。
  2. 使用积分图(Integral Image)对Haar-like特征求值进行加速。
  3. 使用AdaBoost算法训练区分人脸和非人脸的强分类器。
  4. 使用筛选式级联把强分类器级联到一起,提高准确率。

1. 理论

1.1 Haar-like特征

在这里插入图片描述

  • 以上是Haar-like特征定义的特征结构。可以将它们理解成为一个窗口,这个窗口将在图像中做步长为1的滑动,最终遍历整个图像。
  • 比较特殊的一点是,当一次遍历结束后,窗口将在宽度或长度上成比例的放大,再重复之前遍历的步骤,直到放大到最后一个比例后结束。
  • Haar-like特征提取过程就是利用上面定义的窗口在图像中滑动,滑动到一个位置的时候,将窗口覆盖住的区域中的白色位置对应的像素值的和减去黑色位置对应的像素值的和,得到的一个数值就是haar特征中一个维度。

1.2 积分图

  • 积分图的方法能快速计算Haar特征。
  • 积分图是类似动态规划的方法,主要的思想是将图像从起点开始到各个点所形成的矩形区域像素之存在数组中,当要计算某个区域的像素和时可以直接从数组中索引,不需要重新计算这个区域的像素和,从而加快了计算。
    在这里插入图片描述
    分两步计算:
  1. 规定任意点的像素值(x,y)代表其左上角的所有像素的总值,见左图所示。
  2. 当求任意区域的像素和时,只要通过加减运算即可,见右图所示。
  3. 积分图就能快速计算Haar-like特征定义的特征结构,然而特征值往往分布范围很广,所以需要压缩特征值范围,使用“归一化”手段。之后使用归一化的特征值与阈值对比。

1.3 AdaBoost算法

整个Adaboost 迭代算法就3步:

  • 初始化训练数据的权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N。
  • 训练弱分类器。具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被降低;相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
  • 将各个训练得到的弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
    在这里插入图片描述

1.4 筛选式级联

由弱分类器“并联”组成强分类器,而由强分类器“串联”组成级联分类器。
在这里插入图片描述

2. 代码(人脸检测)

import cv2
import numpy as np


#静态图像中的人脸检测
def StaticDetect(filename):
    #创建一个级联分类器 加载一个 .xml 分类器文件. 它既可以是Haar特征也可以是LBP特征的分类器.
    face_cascade = cv2.CascadeClassifier('F:/03-opencv_install/sources/data/haarcascades/haarcascade_frontalface_default.xml')
    
    #加载图像
    img = cv2.imread(filename)
    #转换为灰度图
    gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    #进行人脸检测,传入scaleFactor,minNegihbors,分别表示人脸检测过程中每次迭代时图像的压缩率以及
    #每个人脸矩形保留近似数目的最小值
    #返回人脸矩形数组
    faces = face_cascade.detectMultiScale(gray_img,1.3,5)
    for (x,y,w,h) in faces:
        #在原图像上绘制矩形
        img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    cv2.namedWindow('Face Detected!')
    cv2.imshow('Face Detected!',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
if __name__=='__main__':
    filename = 'D:/python_opencv/people.jpg'
    StaticDetect(filename)

在这里插入图片描述
注意:需要修改的是face_cascade = cv2.CascadeClassifier('F:/03-opencv_install/sources/data/haarcascades/haarcascade_frontalface_default.xml'),这个目录可通过everything搜索haarcascade_frontalface_default.xml的位置,然后筛选data目录下的即可。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42326479/article/details/107092148