OpenCV人脸检测之Haar-like特征提取原理

Haar-like算法

当下的人脸检测主要为以下两种方法:

1.基于知识的检测方法:检测器官特征和器官之间的几何关系

2.基于「统计」的检测方法:像素相似性度量

基于知识的方法主要利用先验知识将人脸看作器官特征的组合,根据眼睛、眉毛、嘴巴、鼻子等器官的特征以及相互之间的几何位置关系来检测人脸。

基于统计的方法则将人脸看作一个整体的模式——二维像素矩阵,从统计的观点通过大量人脸图像样本构造人脸模式空间,根据相似度量来判断人脸是否存在。

本文主要介绍基于统计的检测方法Haar,Haar特征值反映了图像的灰度变化情况。通过改变特征模板的大小和位置,可在图像子窗口中穷举出大量的特征。

Haar分类器=Haar-like特征+AdaBoost算法+级联+积分图; 要理解Haar分类器,那么就需要理解构成它的每一部分。Haar-like特征:检测提供基础特征;积分图:为了加速特征的计算而使用的算法;AdaBoost:训练区分人脸与非人脸强分类器;级联:把强分类器级联在一起,提高准确率。

1.Haar-like特征

Haar-like是一种简单且高效的图像特征,其基于矩形区域相似的强度差异性Haar小波。w=白色区域像素之和-黑色区域像素之和得到的就是这个区域的一个特征值,这个特征值可以用来区分人脸与非人脸。当然,一个特征的区分度是很有限的。为了增加区分度,可以对多个矩形特征计算得到一个区分度更大的特征值,然而在一个窗口中怎样排列能够更好的体现人脸的特征,这是未知的所以需要AdaBoost算法去训练找到,在训练前需要将每种组合穷举出来,为了增加计算特征值的速度,使用了积分图。

Haar-like的特征矩形如下所示:

需要注意的是,当一次遍历结束后,窗口将在宽度或长度上成比例的放大,在重复之前的步骤,直到放大到最后最后一个比例。

设在宽度上可以放大的最大倍数为_{Kw},高度上可以放大的最大倍数为 ^{Kh},计算公式如下:

                                                                                  \huge _{Kw=\frac{_{Wi}}{_{Wwin}}}

                                                                                 \huge _{Kh=\frac{_{hi}}{_{hwin}}}

其中 Wi和hi使整个图像的宽高,Wwin和hwin是haar窗口的初始宽高,可以放大的倍数为_{Kw}^{Kh}

2.AdaBoost算法

一个弱分类器就是一个基本和上图类似的决策树,最基本的弱分类器只包含一个Haar-like特征,也就是它的决策树只有一层,被称为树桩(stump)。

弱分类器的训练即是找到一个分类阈值使其成为最优弱分类器。寻找的步骤:

  1. 对于每个特征f,计算所有训练样本的特征值,并按特征值大小排序。
  2. 扫描排序好的特征值,对排序好的每个元素,计算四个值。
  3. 全部人脸样本的权重之和t1;
  4. 全部非人脸样本的权重之和t0;
  5. 在此元素之前的非人脸样本的权重之和s0
  6. 最终得到每个元素的分类误差r=min((s1+(t0-s0)),(s0+(t1-s1)))
  7. 寻找r值最小的元素作为最优阈值。

补充 这最优的weak classifier是这么得来的,比如说对于特征A 我们用特征A对所有样本取特征值,然后根据特征值排序所有样本,可以想象,具有明显人脸特征的样本和具有明显非人脸特征的样本应该分别处于这个排序的两端,但肯定有一些样本 不是那么明显就能被A特征区分开,我们要做的是在其中取一个阈值。想象一个点在排好序的直线上滑动 滑动到某一个位置,使得我们能够最好的用特征A区分人脸和非人脸,也就是说,错误率最低,若得到这个阈值,则此时我们找到一个相对特征A的最优weak classifier。由此类推,对所有的特征都如法炮制。我们会得到对应于n个特征的n个最优weak classifier,从里面选一个最最优的,最后得出你想要的那个最优weak classifier

强分类器的诞生需要T轮的迭代,具体操作如下:

  1. 给定训练样本集S,共N个样本,其中XY分别对应于正样本和负样本;T为训练的最大循环次数;
  2. 初始化样本权重为1/N ,即为训练样本的初始概率分布;
  3. 第一次迭代训练N个样本,得到第一个最优弱分类器。
  4. 提高上一轮中被误判的样本的权重;
  5. 将新的样本和上次分错的样本放在一起进行新一轮的训练。
  6. 循环执行4-5步骤,T轮后得到T个最优弱分类器。
  7. 组合T个最优弱分类器得到强分类器。

 3.级联

通过组合多个强分类器来进一步处理图片信息,增加识别的准确率,级联的强分类器的复杂度逐渐增加来提高算法的识别准确度。 

4.积分图

积分图是类似动态规划的方法,主要的思想是将图像从起点开始到各个点所形成的矩形区域像素之存在数组中,当要计算某个区域的像素和时可以直接从数组中索引,不需要重新计算这个区域的像素和,从而加快了计算。积分图求和公式如下:

 

其中 I(x,y)I(x,y) 表示图像 (x,y) 位置的像素值。积分图像可以采用增量的方式计算:

定义了积分图的概念,就可以很方便的计算任意区域内的像素和,如下图所示:

积分图数组初始化之后, 我们就得到了一张积分图:

为了计算某个矩形像素和,比如区域 Rd 内所有点的像素值之和(积分)可以表示为:

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是您的第一个问题:掌握经典图像特征描述符HOG、LBP、Haar-like的基本原理和各自特点。 1. HOG(Histogram of Oriented Gradients) 特征描述符 HOG 特征描述符是一种用于在图像中检测对象的特征描述符。其基本原理是通过计算图像中每个像素点的梯度方向和大小,然后将其转换为每个像素所在区域的直方图。这些直方图在后续的分类器中使用。HOG 特征描述符最常用于行人检测人脸检测。 HOG 特征描述符的特点是:它对于光照、旋转和缩放的变化具有一定的不变性。 2. LBP(Local Binary Pattern) 特征描述符 LBP 特征描述符是一种用于在图像中检测纹理的特征描述符。其基本原理是通过比较每个像素的灰度值与其周围像素的灰度值,将这些比较结果组成一个二进制编码的模式。这些模式在后续的分类器中使用。LBP 特征描述符最常用于人脸检测和纹理分类。 LBP 特征描述符的特点是:它对于光照和噪声的变化具有一定的不变性。 3. Haar-like 特征描述符 Haar-like 特征描述符是一种用于在图像中检测边缘和纹理的特征描述符。其基本原理是通过计算图像中不同大小和形状的矩形区域的灰度值之和的差异,将这些差异组成一个特征向量。这些特征向量在后续的分类器中使用。Haar-like 特征描述符最常用于人脸检测Haar-like 特征描述符的特点是:它对于光照变化具有一定的不变性。 这些特征描述符可以用于图像分类、物体检测和目标跟踪等任务。 接下来是您的第二个问题:利用这些特征描述符进行特征提取,编程实现基于Adaboost的目标检测算法。 基于Adaboost的目标检测算法是一种经典的机器学习算法,它可以使用上述特征描述符进行特征提取,并在后续的分类器中使用。下面是该算法的步骤: 1. 收集样本数据,并将其标记为正样本或负样本。 2. 提取样本数据的特征描述符,包括HOG、LBP和Haar-like等。 3. 使用Adaboost算法进行特征选择和分类器训练。 4. 使用训练好的分类器对新的图像进行目标检测。 在具体实现时,可以使用Python语言和OpenCV库来实现该算法。其中,OpenCV库提供了各种特征描述符的实现,以及Adaboost算法的实现。下面是一个简单的示例代码: ``` python import cv2 # 加载正样本和负样本数据 positive_samples = [] negative_samples = [] # 提取HOG特征描述符 hog = cv2.HOGDescriptor() # 提取LBP特征描述符 lbp = cv2.CascadeClassifier() # 提取Haar-like特征描述符 haar = cv2.CascadeClassifier() # 训练分类器 classifier = cv2.CascadeClassifier() # 加载待检测的图像 image = cv2.imread() # 进行目标检测 rects = classifier.detectMultiScale(image) # 输出检测结果 for rect in rects: cv2.rectangle(image, rect, (0, 255, 0), 2) cv2.imshow('Object Detection', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上代码仅供参考,具体实现方式可以根据实际需求进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值