特征提取之Haar特征

特征提取之Haar特征特征提取之 Haar 特征一 前言 废话 很久没有写博客了 一晃几年就过去了 为了总结一下自己看的一些论文 以后打算写一些自己读完论文的总结 那么 今天就谈一谈人脸检测最为经典的算法 Haar like 特征 Adaboost 这是最为常用的物体检测的方法 最初用于人脸检测 也是用的最多的方法 而且 OpenCV 也实现了这一算法 可谓路人皆知 另外网上写这个算法的人也不在少数 二 概述首先说明 我主要看了

特征提取之Haar特征

一、前言(废话)

很久没有写博客了,一晃几年就过去了,为了总结一下自己看的一些论文,以后打算写一些自己读完论文的总结。那么,今天就谈一谈人脸检测最为经典的算法Haar-like特征+Adaboost。这是最为常用的物体检测的方法(最初用于人脸检测),也是用的最多的方法,而且OpenCV也实现了这一算法,可谓路人皆知。另外网上写这个算法的人也不在少数。

二、概述

首先说明,我主要看了《Rapid Object Detection using a Boosted Cascade of Simple Features》和《Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object Detection》这两篇论文。

2.1为什么需要Haar特征,为什么要结合Adaboost算法

我们知道人脸检测是很不容易的,我们在实际进行人脸检测的时候,需要考虑算法的运行速度,以及算法的准确度,单单实现这两个指标就已经很不容易了。传统的人脸检测方法(指的是在Haar-like特征出来之前的方法,也就是2001年之前了)一般都是基于像素级别进行的,常见的方法有基于皮肤颜色的方法,这些方法的缺点就是速度慢,几乎不能实现实时性。

2.2算法的大体流程

接下来就对算法的关键的步骤进行介绍。

3具体介绍

3.1图像预处理(归一化或者称为光照修正)

我们知道不同的光照对于所处理的图像有影响,为了减低这种影响我们需要首先对图像进行归一化(在《Rapid Object Detection using a Boosted Cascade of Simple Features》中称之为归一化,而在《Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object Detection》中称之为Lighting Correction,即光照修正)。

i¯(x,y)=i(x,y)μcσ



上述公式中 i¯(x,y) 表示归一化之后的图像,而 i(x,y) 表示原始的图像,其中 μ 表示图像的均值,而 σ 表示图像的标准差。计算方法很简单,均值就是图像中的所有像素值相加,然后除以像素的个数,而方差假定每个像素的概率相等如果一幅图像中有N个像素,那么每个像素的概率为 1N σ2=1Nxx2μ2 ,注意这里的x是指的每个像素值, x 表示对所有的像素值求和。

其实这里我看到《Rapid Object Detection using a Boosted Cascade of Simple Features》中第六页它写成了 σ2=μ21Nxx2

3.2提取特征

计算特征很简单,就是拿黑色部分的所有的像素值的和减去白色部分所有像素值的和。得到的就是一个特征值。

说的很简单,但是在工程中需要进行快速计算某个矩形内的像素值的和,这就需要引入积分图的概念。

(1)使用积分图加速计算特征

需要注意的是这里的积分图输入的图像是经过归一化的图像哈。与上面用到的符号不一样了。

ii(x,y)=xx,yyi(x,y)


上述含义是指在位置 (x,y) 上,对应的积分图中的像素为该位置的左上角所有的像素的之和。

s(x,y)=s(x,y1)+i(x,y)ii(x,y)=ii(x1,y)+s(x,y)


初始值 s(x,1)=0,ii(1,y)=0 .

上面这两个递归公式是什么意思呢?就是首先每一行都递归计算s(x,y)(公式中也可以看出是按行计算的),每一行首先都是计算s,计算完毕之后在每一列都计算ii(x,y)。这样扫描下去就可以计算好了积分图了。这种方法跟动态规划的思想有点类似。

好了计算好了积分图,我们接下来就可以利用积分图来加速计算某个方块内部的像素的和了。

(2)计算方块内的像素和

计算某个方块内的像素和
图2 计算某个方块内的像素和

图中的大框是积分图,为了讲解如何计算任意矩形内的像素值,我们画出四个区域A、B、C、D,并且图中有四个位置分别为1、2、3、4。我们要计算D区域内部的像素和该怎么计算?

我们记位置4的左上的所有像素为 rectsum(4) ,那么
D位置的像素之和就是 rectsum(1)+rectsum(4)rectsum(2)rectsum(3)
是不是有了积分图,就可以很快地计算出了任意矩形内的像素之和了?

(3)提取的特征的个数有多少?

AB:2w=112h=124(242w+1)(24h+1)+C:2w=18h=124(243w+1)(24h+1)D:w=112h=112(242w+1)(242h+1)


加起来一共有大约16000多个(不止16000哈)。可以自己算一下。

3.3使用Adaboost进行训练

在输入图像之后首先计算积分图,然后通过积分图在计算上述三种特征,如果窗口的大小为24*24像素,那么生成的特征数目有16000之多。

(1)弱分类器的定义

Adaboost算法中需要定义弱分类器,该弱分类器的定义如下:

hj(x)={
10ifpjfj(x)<pjθjotherwise


上述公式中的 pj 是为了控制不等式的方向而设置的参数。
fj(x) 表示输入一个窗口 x ,比如24*24像素的窗口,通过

fj
提取特征,得到若干特征。通过一个阈值 θ 判定该窗口是不是所要检测的物体。

(2)adaboost算法

假设训练样本图像为 (x1,y1),,(xn,yn) ,其中 yi=0,1 ,0表示负样本,1表示正样本。

首先初始化权重 w1,i=12m ,初始化 yi22l ,其中m表示负样本的个数,l表示正样本的个数。


For t=1,,T :
(1).首先归一化权重: wt,i=wt,inj=1wt,j
(2)对于每一个特征,我们都训练一个分类器(记为 hj ),每个分类器都只使用一种特征进行训练。
那么对于该特征的误差 ϵj 可以这么衡量: ϵj=iwi|hj(xi)yi| ( j 表示的是某个特征的索引,而

i
表示的是所有的所有的窗口。)
(3)选择拥有最低误差的那个分类器记为 ht
(4)更新权重 wt+1,i=wt,iβ1eit (如果分类正确则 ei=1 ,错误 ei=0 )。
End For






h(x)=10t=1Tαtht12t=1Tαtotherwise



其中 αt=log1βt

4其他一些参数的确定

4.1如何确定有多少个级联的分类器,有多少个特征,阈值如何确定的。

如图3可以看出在训练过程当中需要确定究竟有多少个分离器级联才是最佳的,以及使用多少个特征,每个弱分类器的阈值如何确定,这些参数的确定基本不可能实现。

4.2 扫描窗口的时候的缩放如何确定

假设扫描的时候的步长为 Δ ,尺度为 s
那么当前的步长= [

s
Δ ]。一般 Δ=1.5 ,尺度需要根据图像大小以及窗口大小来确定。

4.3 合并检测出的多个窗口

检测到的子窗口的集合分成若干不相交的子集(每个子集中的子窗口都是相互重叠的),这些子集中的子窗口进行合并,集合中所有子窗口的左上角的坐标的平均即为该集合所确定的窗口的左上角的坐标。

5 补充说明

5.1 Haar-like特征的分类(Haar-like特征的变种)

图4中给出了四种分类分为将边缘特征、线特征、中心环绕特征以及对角线特征。

X=W/wY=H/h


X

Y
称之为最大缩放因子。
计算公式如下

XY(W+1wX+12)(H+1hY+12)


对于旋转45 °的特征其计算公式如下:

XY(W+1zX+12)(H+1zY+12)


其中 z=w+h

至于怎么计算旋转45°的特征值,这里先挖个坑。过一段时间在补充上来。

5.2 Adaboost的变种

《Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object Detection》中介绍了三种变种分为Real Adaboost ,Discrete Adaboost以及Gentle Adaboost。差别不是很大。具体参考该论文。

6 参考文献

7 想要说的话

后期会分析一下Haar进行人脸检测的代码(matlab和OpenCV的实现),看时间允许不允许了。

http://www.mathworks.com/matlabcentral/fileexchange/29437-viola-jones-object-detection















版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203199.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午10:21
下一篇 2026年3月19日 下午10:21


相关推荐

  • Pycharm的debug单步调试

    Pycharm的debug单步调试首先设置断点 点击行号显示的一侧 在指定行设置断点 比如这里 我们设断点在创建对象时 如果这时我们直接右键 run 这个代码 他还是会直接运行 不会理会断点结果所以要右键选择 run 下面的 debug3 这几个红框的意思依次是 有绿点表示程序运行中 还没有结束 Debuger 窗口表示现在在 debug 调试界面 Console 表示这是控制台 也就是看打印的界面 右下的箭头是执行下一

    2026年3月27日
    3
  • java JDBC连接数据库步骤及代码

    java JDBC连接数据库步骤及代码JDBC连接数据库,包含7个步骤(1)加载JDBC驱动程序在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(StringclassName)实现,成功加载后,会将Driver类的实例注册到DriverManager类中。代码如下:static{ try{ …

    2022年7月26日
    6
  • IntelliJ IDEA2018版下载安装教程以及详细步骤

    版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/cms18374672699/article/details/84957252本篇适合新手对于idea的下载安装和配置,因为近期博主正在学习Maven,而业界公认最适合搭配Maven的IDE便是JetBrains公司发行的IntelliJIDEA,所有博主现在也积极参与到博客大军交流,所以写下这…

    2022年4月8日
    1.3K
  • 安全 | 几种wifi密码破解的思路

    从一个攻击者的视角,多种方案,讲述破解一台路由器进而控制对方网络的过程,以此提醒广大用户,提高安全意识,做好安全措施。

    2022年4月13日
    171
  • 函数防抖与函数节流

    函数防抖与函数节流

    2022年4月3日
    53
  • C++ 实现图片base64编解码

    C++ 实现图片base64编解码最近使用人脸识别 restfulAPI 遇到了要求图片 base64 编码后传输问题 借此机会了解下什么是 base64 编码 部分内容参考自阮一峰 blog http www ruanyifeng com blog 2008 06 base64 html1 什么是 base64 编码所谓 Base64 就是说选出 64 个字符 小写字母 a z 大写字母 A Z 数字 0 9 符号 再加上作为垫字的

    2026年3月20日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号