AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图

2023-05-16

目前因为做人脸识别的一个小项目,用到了AdaBoost的人脸识别算法,因为在网上找到的所有的AdaBoost的简介都不是很清楚,让我看看头脑发昏,所以在这里打算花费比较长的时间做一个关于AdaBoost算法的详细总结。希望能对以后用AdaBoost的同学有所帮助。而且给出了关于AdaBoost实现的一些代码。因为会导致篇幅太长,所以这里把文章分开了,还请见谅。

第二部分的地址请见:http://blog.csdn.net/weixingstudio/article/details/7631949

辛苦打字截图不容易,转载请标明出处。

提到AdaBoost的人脸识别,不得不提的几篇大牛的文章可以看看,但是大牛的文章一般都是只有主要的算法框架,没有详细的说明。

大牛论文推荐:

1. Robust Real-time Object Detection, Paul Viola, Michael Jones

2. Rapid Object Detection using a Boosted Cascade of Simple Features, 作者同上。

还有一篇北大的本科生的毕业论文也不错:基于 AdaBoost 算法的人脸检测,赵楠。

另外,关于我写的AdaBoost的人脸识别程序的下载地址:

1. C++版本:http://download.csdn.net/detail/weixingstudio/4350983

说明:需要自己配置opencv2.3.1, 自己配置分类器。在程序运行前会捕捉10帧用户图像,计算人脸平均面积,这个过程不会有显示,但是程序没有出问题,稍等一会就会出现摄像头信息。

 

2. C#版本:http://download.csdn.net/detail/weixingstudio/4351007

说明:使用了emgucv2.3.0的库,需要自己重新添加引用动态链接库文件。

两个版本的程序都能正确运行,没有任何问题。


特别说明:一般进行人脸检测以后,会对检测到的人脸特征进行提取,处理等操作。常用的操作就是人脸特征点定位,嘴角、眼睛、下吧等特征点的定位,这个技术比较成熟的算法是ASM(主动形状模型),关于ASM的详细介绍请见

http://blog.csdn.net/weixingstudio/article/details/8891071

1. Adaboost方法的引入

1.1 Boosting方法的提出和发展

        在了解Adaboost方法之前,先了解一下Boosting方法。

        回答一个是与否的问题,随机猜测可以获得50%的正确率。如果一种方法能获得比随机猜测稍微高一点的正确率,则就可以称该得到这个方法的过程为弱学习;如果一个方法可以显著提高猜测的正确率,则称获取该方法的过程为强学习1994年,KearnsValiant证明,在ValiantPACProbably ApproximatelyCorrect)模型中,只要数据足够多,就可以将弱学习算法通过集成的方式提高到任意精度。实际上,1990年,SChapire就首先构造出一种多项式级的算法,将弱学习算法提升为强学习算法,就是最初的Boosting算法。Boosting意思为提升、加强,现在一般指将弱学习提升为强学习的一类算法。1993年,DruckerSchapire首次以神经网络作为弱学习器,利用Boosting算法解决实际问题。前面指出,将弱学习算法通过集成的方式提高到任意精度,是KearnsValiant1994年才证明的,虽然Boosting方法在1990年已经提出,但它的真正成熟,也是在1994年之后才开始的。1995年,Freund提出了一种效率更高的Boosting算法

1.2 AdaBoost算法的提出

        1995年,Freund和Schapire提出了Adaboost算法,是对Boosting算法的一大提升。Adaboost是Boosting家族的代表算法之一,全称为Adaptive Boosting。Adaptively,即适应地,该方法根据弱学习的结果反馈适应地调整假设的错误率,所以Adaboost不需要预先知道假设的错误率下限。也正因为如此,它不需要任何关于弱学习器性能的先验知识,而且和Boosting算法具有同样的效率,所以在提出之后得到了广泛的应用。

首先,Adaboost是一种基于级联分类模型的分类器。级联分类模型可以用下图表示:

级联分类器介绍:级联分类器就是将多个强分类器连接在一起进行操作。每一个强分类器都由若干个弱分类器加权组成,例如,有些强分类器可能包含10个弱分类器,有些则包含20个弱分类器,一般情况下一个级联用的强分类器包含20个左右的弱分类器,然后在将10个强分类器级联起来,就构成了一个级联强分类器,这个级联强分类器中总共包括200若分类器。因为每一个强分类器对负样本的判别准确度非常高,所以一旦发现检测到的目标位负样本,就不在继续调用下面的强分类器,减少了很多的检测时间。因为一幅图像中待检测的区域很多都是负样本,这样由级联分类器在分类器的初期就抛弃了很多负样本的复杂检测,所以级联分类器的速度是非常快的;只有正样本才会送到下一个强分类器进行再次检验,这样就保证了最后输出的正样本的伪正(false positive)的可能性非常低。

 

也有一些情况下不适用级联分类器,就简单的使用一个强分类器的情况,这种情况下一般强分类器都包含200个左右的弱分类器可以达到最佳效果。不过级联分类器的效果和单独的一个强分类器差不多,但是速度上却有很大的提升。

级联结构分类器由多个弱分类器组成,每一级都比前一级复杂。每个分类器可以让几乎所有的正例通过,同时滤除大部分负例。这样每一级的待检测正例就比前一级少,排除了大量的非检测目标,可大大提高检测速度。

其次,Adaboost是一种迭代算法。初始时,所有训练样本的权重都被设为相等,在此样本分布下训练出一个弱分类器。在第(  =1,2,3, …T,T为迭代次数)次迭代中,样本的权重由第  -1次迭代的结果而定。在每次迭代的最后,都有一个调整权重的过程,被分类错误的样本将得到更高的权重。这样分错的样本就被突出出来,得到一个新的样本分布。在新的样本分布下,再次对弱分类器进行训练,得到新的弱分类器。经过T次循环,得到T个弱分类器,把这T个弱分类器按照一定的权重叠加起来,就得到最终的强分类器。

2. 矩形特征

2.1 Haar特征\矩形特征

AdaBoost算法的实现,采用的是输入图像的矩形特征,也叫Haar特征。下面简要介绍矩形特征的特点。

影响Adaboost检测训练算法速度很重要的两方面是特征的选取和特征值的计算。脸部的一些特征可以由矩形特征简单地描绘。用图2示范:

上图中两个矩形特征,表示出人脸的某些特征。比如中间一幅表示眼睛区域的颜色比脸颊区域的颜色深,右边一幅表示鼻梁两侧比鼻梁的颜色要深。同样,其他目标,如眼睛等,也可以用一些矩形特征来表示。使用特征比单纯地使用像素点具有很大的优越性,并且速度更快。

在给定有限的数据情况下,基于特征的检测能够编码特定区域的状态,而且基于特征的系统比基于象素的系统要快得多。
矩形特征对一些简单的图形结构,比如边缘、线段,比较敏感,但是其只能描述特定走向(水平、垂直、对角)的结构,因此比较粗略。如上图,脸部一些特征能够由矩形特征简单地描绘,例如,通常,眼睛要比脸颊颜色更深;鼻梁两侧要比鼻梁颜色要深;嘴巴要比周围颜色更深。

对于一个 24×24 检测器,其内的矩形特征数量超过160,000 个,必须通过特定算法甄选合适的矩形特征,并将其组合成强分类器才能检测人脸。

常用的矩形特征有三种:两矩形特征、三矩形特征、四矩形特征,如图:

由图表可以看出,两矩形特征反映的是边缘特征,三矩形特征反映的是线性特征、四矩形特征反映的是特定方向特征。

特征模板的特征值定义为:白色矩形像素和减去黑色矩形像素和。接下来,要解决两个问题,1:求出每个待检测子窗口中的特征个数。2:求出每个特征的特征值。

子窗口中的特征个数即为特征矩形的个数。训练时,将每一个特征在训练图像子窗口中进行滑动计算,获取各个位置的各类矩形特征。在子窗口中位于不同位置的同一类型矩形特征,属于不同的特征。可以证明,在确定了特征的形式之后,矩形特征的数量只与子窗口的大小有关[11]。在24×24的检测窗口中,矩形特征的数量约为160,000个。

特征模板可以在子窗口内以“任意”尺寸“任意”放置,每一种形态称为一个特征。找出子窗口所有特征,是进行弱分类训练的基础。

2.2子窗口内的条件矩形,矩形特征个数的计算

如图所示的一个m*m大小的子窗口,可以计算在这么大的子窗口内存在多少个矩形特征。

以 m×m 像素分辨率的检测器为例,其内部存在的满足特定条件的所有矩形的总数可以这样计算:
对于 m×m 子窗口,我们只需要确定了矩形左上顶点A(x1,y1)和右下顶点B(x2,63) ,即可以确定一个矩形;如果这个矩形还必须满足下面两个条件(称为(s, t)条件,满足(s, t)条件的矩形称为条件矩形):

1) x 方向边长必须能被自然数s 整除(能均等分成s 段);
2) y 方向边长必须能被自然数t 整除(能均等分成t 段);
则 , 这个矩形的最小尺寸为s×t 或t×s, 最大尺寸为[m/s]·s×[m/t]·t 或[m/t]·t×[m/s]·s;其中[ ]为取整运算符。

2.3条件矩形的数量

我们通过下面两步就可以定位一个满足条件的矩形:

由上分析可知,在m×m 子窗口中,满足(s, t)条件的所有矩形的数量为:

实际上,(s, t)条件描述了矩形特征的特征,下面列出了不同矩形特征对应的(s, t)条件:

下面以 24×24 子窗口为例,具体计算其特征总数量:

下面列出了,在不同子窗口大小内,特征的总数量:

3. 积分图

3.1 积分图的概念

在获取了矩形特征后,要计算矩形特征的值。Viola等人提出了利用积分图求特征值的方法。积分图的概念可用图3表示:

坐标A(x,y)的积分图是其左上角的所有像素之和(图中的阴影部分)。定义为:

   

其中ii(x,y)表示积分图,i(x,y)表示原始图像,对于彩色图像,是此点的颜色值;对于灰度图像,是其灰度值,范围为0~255

在上图中,A(x,y)表示点(x,y)的积分图;s(x,y)表示点(x,y)的y方向的所有原始图像之和。积分图也可以用公式(2)和公式(3)得出:

3.2 利用积分图计算特征值

3.3 计算特征值

由上一节已经知道,一个区域的像素值,可以由该区域的端点的积分图来计算。由前面特征模板的特征值的定义可以推出,矩形特征的特征值可以由特征端点的积分图计算出来。以“两矩形特征”中的第二个特征为例,如下图,使用积分图计算其特征值:

第二部分的地址请见:http://blog.csdn.net/weixingstudio/article/details/7631949

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图 的相关文章

  • 为什么老板对项目时间安排的永远是那么的紧?

    简单分析一下 xff0c 原因基本上也就这么两点 xff0c 一方面 xff0c 可以压缩你的时间 xff0c 大家都知道时间就是公司的最大成本 xff0c 用的时间越少 xff0c 带来的价格也就越高 1年完成的项目 半年提前完成 xff
  • GCC NOT FOUNT

    错误提示 xff1a arm linux gcc Command not found 原因 xff1a 1 xff09 没有在 bashrc 或者 etc environment中添加交叉编译工具链bin文件路径 解决方法 xff1a 使用
  • 记录个人编译DCNv2的过程(windows 10,vs2019, torch1.7.0)

    小白一个 xff0c 因为配FairMOT环境需要用到DCNv2 xff0c 就简单记录一下自己遇到的问题和解决方法 如有错误 xff0c 请多指教 首先主要参考了博客https blog csdn net Ningmoua article
  • 初识CMMI2.0

    初识 CMMI2 0 xff08 以下内容根据网络知识学习和整理而成 xff09 正式发布与获取 xff1a 2018 年 3 月 8 日 xff0c CMMI2 0 正式版本正式上线全新的主页 xff08 https cmmiinstit
  • C++编写杨辉三角

    xff08 1 xff09 美观很重要 xff0c 哈哈哈 include lt iostream gt include lt iomanip gt using namespace std int YangHuiData int n n是杨
  • IP地址的分类及范围详解:A、B、C、D、E五类是如何划分的

    IP地址类型 最初设计互联网络时 xff0c 为了便于寻址以及层次化构造网络 xff0c 每个IP地址包括两个标识码 ID xff0c 即网络ID和主机ID 同一个物理网络上的所有主机都使用同一个网络ID xff0c 网络上的一个主机 包括
  • iscsiadm命令基本用法

    发现目标 iscsiadm m discovery t sendtargets p 192 168 1 1 3260 m discovery 指定模式为discovery p 192 168 1 1 3260 指定目标ip和端口 登入节点
  • linux内核中的睡眠函数*delay、*sleep

    目录 一 睡眠函数种类 1 原子上下文 2 非原子上下文 二 使用环境 1 使用环境的不同 xff0c 选择不同的延时 2 驱动机制不同 3 内核中的计算函数执行的函数 三 实测两类函数的延时以及原因 1 测试系统中的睡眠函数 2 输出结果
  • RTOS 和裸机系统的异同-基于 ESP32 学习双核 FreeRTOS 的使用

    Learning FreeRTOS with esp32 什么是 RTOS 其本质上是运行在小型嵌入式设备上的特殊软件 系统软件 如同手机的安卓系统软件 windows 系统软件 RTOS VS 裸机系统 传统的裸机系统 xff08 无操作
  • FreeRTOS 创建第一个任务

    创建第一个任务 概述 创建任务的函数为 xff1a BaseType t span class token function xTaskCreate span span class token punctuation span TaskFu
  • ACL功能的实现

    ACL 看控制访问列表 xff08 Access Control List xff09 控制指定的用户能否通过指定的接口访问本机的服务 http https ftp ssh telnet xff0c 举个例子 xff1a 没开启ACL功能前
  • STM32 USB 虚拟串口演练

    记录一下 xff0c STM32官方虚拟串口走通流程 第一步 xff0c 在CSDN寻找经验 xff0c 结合实际情况进行计划 为了节省读者时间 xff0c 推荐写的比较好的博文 地址如下 xff1a http blog csdn net
  • Linux smbclient使用详情

    例子 smbclient 192 168 10 2 目录 U 用户名 回车 再输入 密码 参数说明 网络资源 网络资源 的格式为 服务器名称 资源分享名称 密码 输入存取网络资源所需的密码 B lt IP地址 gt 传送广播数据包时所用的I
  • ESP8266获取网络天气

    使用ESP8266模块来获取网络数据 xff08 天气 xff0c 时间等 xff09 xff0c 还是挺简单的 一步一步来 1 初始化串口与相关IO 使得MCU可正常使用串口的发送与接收 xff0c 以及一些IO控制ESP8266的使能端
  • win11环境安装postgreSql数据库

    1 xff0c 下载安装文件后一路next安装 2 数据库初始化 创建data目录 xff0c 保证软件有权限读写和访问 pg ctl D data init 3 启动数据库 pg ctl D data D data start 4 创建初
  • verilog实现38译码器

    module decode 38 input wire 2 0 a output reg 7 0 y integer i always 64 begin for i 61 0 i lt 8 i 61 i 43 1 begin if a 61
  • DiffServ--百度介绍

    区分服务 xff08 DiffServ xff09 是IETF工作组为了克服Inter Serv的可扩展性差在1998年提出的另一个服务模型 xff0c 目的是制定一个可扩展性相对较强的方法来保证IP的服务质量 与综合服务 xff08 In
  • P2P在NAT和防火墙上的穿透

    概述 本文主要讨论关于P2P通信的一些常见问题和解决方案 主要内容包含 xff1a P2P通信与网络设备的关系 不同的网络设备特征对P2P产生的影响 网络地址转换 xff08 NAT xff09 的类型 NAT类型的检测方法 协议防火墙的突
  • conflicting types for 'dev_t'的原因

    在Linux下编译程序有时会遇到这种问题 xff0c 这貌似是一个Linux历史遗留问题 usr include sys types h 62 error conflicting types for dev t usr include li
  • https不能访问时的解决方案

    当 xff08 win7 里 xff09 IE浏览器 https打不开 https不能访问时 1 请保证 IE 工具 高级选项中的TSL 1 0前面不要打上勾就可以了 xff08 注解 xff0c 当你用 IE的 还原高级设置 时 xff0

随机推荐

  • Ubuntu LTS 版本知多少

    原文地址http oss org cn html 79 n 70179 html 特别声明 xff1a 从Ubuntu 12 04开始 xff0c LTS 版本的支持周期策略有所改变 xff0c 具体改变信息见下面的详细说明 先介绍一词 x
  • ubuntu下配置vlan功能--官网vlan how to

    http ubuntuforums org showthread php t 61 703387 ubuntu官网介绍 802 1q VLAN HOWTO Doing 802 1q trunking to an Ethernet switc
  • 万台规模下的SDN控制器集群部署实践

    目前在网络世界里 xff0c 云计算 虚拟化 SDN NFV这些话题都非常热 今天借这个机会我跟大家一起来一场SDN的深度之旅 xff0c 从概念一直到实践一直到一些具体的技术 本次分享分为三个主要部分 xff1a SDN amp NFV的
  • linux-vdso.so.1介绍

    这段时间看Linux内核源码的时候 xff0c 经常碰到vdso这个东西 像在Feature fixup中 xff0c 获取时间等操作时 xff0c 网上搜了一下 xff0c 才知道了含义 xff0c 原来这是Linux为了解决和glibc
  • ECC密钥编程举例,并用它做签名和验签,并生成共享密钥

    下面的例子生成两对ECC密钥 xff0c 并用它做签名和验签 xff0c 并生成共享密钥 include lt string h gt include lt stdio h gt include lt openssl ec h gt inc
  • 最新OmniPeek无线驱动详细列表与下载说明/支持捉空口包的网卡

    OmniPeek无线驱动详细列表与下载 在进行无线网络分析时 xff0c Omnipeek需要安装特殊驱动来捕获管理 控制和数据帧 而且在OmniPeek停止不用时 xff0c 它们将作为普通驱动支持网络服务的正常运行 WildPacket
  • Html自我介绍

    lt doctype html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt 兰博基尼 lt title gt lt style type 61
  • grub2下常见系统初始化错误的分析和解决

    原文连接http tieba baidu com p 2910461207 grub rescue gt grub gt initramfs 是开机错误时 xff0c 常见到的状况 我将分以下几个部份说明 xff1a 一 开机出现 grub
  • MSP-EXP430F5529LP: Error initializing emulator: No USB FET was found

    正常情况下 xff0c 安装了CCS之后 xff0c TI MSP430LaunchPad的驱动都可以自动安装好 主要是 xff1a MSP Application UART 和 MSP Debug Interface 当然 xff0c 非
  • CMakeLists.txt加载第三方库

    生成一个库文件 TgMath h ifndef TGMATH H define TGMATH H include 34 tgmath global h 34 class TGMATHSHARED EXPORT TgMath public T
  • ROS学习之订阅消息——Subscriber_代码分析

    接上篇 xff1a ROS学习之发布消息 Publisher 详解版本 xff1a 本代码文件名为 xff1a subscriber cpp include 34 ros ros h 34 include 34 std msgs Strin
  • LXC 介绍

    转自 xff1a https www cnblogs com xidongyu p 5767020 html LXC又名Linux container xff0c 是一种虚拟化的解决方案 xff0c 这种是内核级的虚拟化 主流的解决方案Xe
  • openstack原生网络和SDN网络对比

    1 原生Neutron架构图 xff1a 2 Networking odl的架构 3 ODL 处理过程 当OpenStack Neutron API接收到用户创建网络等操作请求 xff0c 它会调用ML2的相关方法 ML2已经定义了post
  • 树莓派 Raspberry Pi 3B+安装官方系统(一)

    两年前购买的树莓派 xff08 可看当时我的记录树莓派 3B 43 重装系统并配置 WiFi YouForever xff09 已经在角落里吃灰了好长时间 xff0c 一度以为已经损坏 xff0c 几天前试着拿出来折腾一下 xff0c 竟然
  • Rime——最好的输入法

    同步发布在博客 xff1a https www zhyong cn 9422 最近迷上了五笔输入法 xff0c 于是想找一款好用的五笔输入法软件 xff0c 最终确定鼎鼎大名的Rime输入法 一款跨平台的开源输入法 xff0c 支持Wind
  • Haar特征描述算子-人脸检测

    Haar特征描述算子 人脸检测 详细资料 3 1简介 Haar like特征最早是由Papageorgiou等应用于人脸表示 xff0c 在2001年 xff0c Viola和Jones两位大牛发表了经典的 Rapid Object Det
  • HTML(css+div)登录界面

    xff08 1 xff09 这是当时做的一个课程设计 xff0c 很多人想要图片 xff0c 在这里我把用到的所有图片资源分享下 xff08 2 xff09 链接 xff1a https pan baidu com s 1nUX1DQe a
  • 基于Matlab的GPU加速---for循环处理

    采用GPU加速时 xff0c 如遇for循环 xff0c 则很容易增加代码在GPU上运行的时间开销 在编程时 xff0c 使用矩阵和向量操作或arrayfun bsxfun pagefun替换循环操作来向量化代码 1 arrayfun函数
  • android ndk extern "C"

    C 43 43 的代码里面 xff1a extern 34 C 34 这是因为生成的二进制文件中 xff0c C和C 43 43 的符号表不相同造成的 Jni是按照C的生成规则去找函数的 xff0c 所以要加上extern C使编译器把函数
  • AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图

    目前因为做人脸识别的一个小项目 xff0c 用到了AdaBoost的人脸识别算法 xff0c 因为在网上找到的所有的AdaBoost的简介都不是很清楚 xff0c 让我看看头脑发昏 xff0c 所以在这里打算花费比较长的时间做一个关于Ada