人脸检测中AdaBoost算法详解

人脸检测中的AdaBoost算法,供大家参考,具体内容如下

第一章:引言   

2017.7.31。英国测试人脸识别技术,不需要排队购票就能刷脸进站。据BBC新闻报道,这项英国政府铁路安全标准委员会资助的新技术,由布里斯托机器人实验室(Bristol Robotics Laboratory) 负责开发。这个报道可能意味着我们将来的生活方式。虽然人脸识别技术已经研究了很多年了,比较成熟了,但是还远远不够,我们以后的目标是通过识别面部表情来获得人类心理想法。   长期以来,计算机就好像一个盲人,需要被动地接受由键盘、文件输入的信息,而不能主动从这个世界获取信息并自主处理。人们为了让计算机看到这个世界并主动从这个世界寻找信息,发展了机器视觉;为了让计算机自主处理和判断所得到的信息,发展了人工智能科学。人们梦想,终有一天,人机之间的交流可以像人与人之间的交流一样畅通和友好。   而这些技术实现的基础是在人脸检测上实现的,下面是我通过学习基于 AdaBoost 算法的人脸检测,赵楠的论文的学习心得。

第二章:关于Adaptive Boosting 

AdaBoost 全称为Adaptive Boosting。Adaptively,即适应地,该方法根据弱学习的结果反馈适应地调整假设的错误率,所以Adaboost不需要预先知道假设的错误率下限。Boosting意思为提升、加强,现在一般指将弱学习提升为强学习的一类算法。实质上,AdaBoost算法是通过机器学习,将弱学习提升为强学习的一类算法的最典型代表。

第三章:AdaBoost算法检测人脸的过程

先上一张完整的流程图,下面我将对着这张图作我的学习分享:

1.术语名词解析:

弱学习,强学习:随机猜测一个是或否的问题,将会有50%的正确率。如果一个假设能够稍微地提高猜测正确的概率,那么这个假   设就是弱学习算法,得到这个算法的过程称为弱学习。可以使用半自动化的方法为好几个任务构造弱学习算法,构造过程需要数量巨大的假设集合,这个假设集合是基于某些简单规则的组合和对样本集的性能评估而生成的。如果一个假设能够显著地提高猜测正确的概率,那么这个假设就称为强学习。特征模版:我们将使用简单矩形组合作为我们的特征模板。这类特征模板都是由两个或多个全等的矩形相邻组合而成,特征模板内有白色和黑色两种矩形(定义左上角的为白色,然后依次交错),并将此特征模板的特征值定义为白色矩形像素和减去黑色矩形像素和。最简单的 5 个特征模板:

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

积分图:主要是为了利用积分图计算矩形特征值,提高程序运行效率。下面给出非常形象的积分图的来计算矩形特征值:

区域 D 的像素和可以用积分图计算为: K1+K4 - (K2+K3)
K1=区域A 的像素值
K2=区域A 的像素值+区域B 的像素值
K3=区域A 的像素值+区域C 的像素值
K4 =区域A 的像素值+区域B 的像素值+区域C 的像素值+区域D 的像素值

2.算法基本描述

对照上面的流程图:A给定一系列训练样本,B初始化权重,C归一化权重,都挺好理解的。我现在需要着重说的是接下来的步骤,即如何选取,训练弱分类器:
现在我们假设我们的计算机读取一张图片进来,在这张图片上遍历所有的特征,(例如20X20像素的图片,一共有78460个特征),当遍历到x个特征时,计算该特征在所有的训练样本中(人脸和非人脸图)的特征值。并且将这些特征值排序,通过扫描一遍排好序的特征值,可以为这个特征确定一个最优的阈值,从而训练成一个弱分类器。那么为什么扫描一遍就可以得出最优阈值?因为在扫描到每一个特征值时,当选取当前元素的特征值和它前面的一个特征值 之间的数作为阈值时,计算这个阈值所带来的分类误差为
                  e = min( S 1+ (T 2- S 2 ), S2 + (T 1- S 1 ))
其中:
全部人脸样本的权重的和T 1
全部非人脸样本的权重的和T 2
在此元素之前的人脸样本的权重的和S 1
在此元素之前的非人脸样本的权重的和S 2
将最小误差记录下来,选取该最小误差的特征值,选取当前元素的特征值和它前面的一个特征值 之间的数作为阈值,那么x特征的最小误差的弱分类器将出来了!以此类推,当遍历了所以的特征了,就在这些弱分类器中找到误差最小的分类器,就是最佳弱分类器。

接下来,就进入到调整最佳弱分类器的权重了。设置一个循环,用刚刚得到的最佳弱分类器去分类所有的训练样本,按照最上面的流程图中的调整权重的部分来调整权重。

以上的步骤就是一个完整的adaboost算法的训练过程!

最后,实验结果表明,当T=200 时,构成的强分类器可以获得很好的检测效果。经过 200次迭代后,获得了 200个最佳弱分类器 ,可以按照下面的方式组合成一个强分类器:

那么,这个强分类器对待一幅待检测图像时,相当于让所有弱分类器投票,再对投票结果按照弱分类器的错误率加权求和,将投票加权求和的结果与平均投票结果比较得出最终的结果。

第4章、个人总结

前前后后将近花了3天时间来学习adaboost算法的人脸识别。在网上找了很多的资料,发现大部分关于每一个特征的弱分类器和所有图像的最佳弱分类器的概念含糊不清,以及怎么用编程的思想来解读这个算法的意识不明确,具体来说,只考虑算法的过程,而不考虑怎么用编程来实现这些过程。这也是我写这个博客的主要目的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • OpenCV实现人脸检测
  • 基于openCV实现人脸检测
  • C++利用opencv实现人脸检测
(0)

相关推荐

  • OpenCV实现人脸检测

    前段日子,写了个人脸检测的小程序,可以检测标记图片.视频.摄像头中的人脸.效果还行吧,用的是opencv提供人脸库.至于具体的人脸检测原理,找资料去啃吧. 环境:VS2013+OPENCV2.4.10+Win8.1 一.基于对话框的MFC 首先,新建一个基于对话框的MFC应用程序,命名为myFaceDetect(取消"安全开发周期(SDL)检查"勾选,我自己习惯取消这个). 放置Button,设置Button的ID和Caption. 图片按钮--ID:IDC_FACEDETECT 视频

  • C++利用opencv实现人脸检测

    小编所有的帖子都是基于unbuntu系统的,当然稍作修改同样试用于windows的,经过小编的绞尽脑汁,把刚刚发的那篇python 实现人脸和眼睛的检测的程序用C++ 实现了,当然,也参考了不少大神的博客,下面我们就一起来看看: Linux系统下安装opencv我就再啰嗦一次,防止有些人没有安装没调试出来喷小编的程序是个坑, sudo apt-get install libcv-dev sudo apt-get install libopencv-dev 看看你的usr/share/opencv

  • 基于openCV实现人脸检测

    openCV的人脸识别主要通过Haar分类器实现,当然,这是在已有训练数据的基础上.openCV安装在 opencv/opencv/sources/data/haarcascades_cuda(或haarcascades)中存在预先训练好的物体检测器(xml格式),包括正脸.侧脸.眼睛.微笑.上半身.下半身.全身等. openCV的的Haar分类器是一个监督分类器,首先对图像进行直方图均衡化并归一化到同样大小,然后标记里面是否包含要监测的物体.它首先由Paul Viola和Michael Jon

  • 人脸检测中AdaBoost算法详解

    人脸检测中的AdaBoost算法,供大家参考,具体内容如下 第一章:引言    2017.7.31.英国测试人脸识别技术,不需要排队购票就能刷脸进站.据BBC新闻报道,这项英国政府铁路安全标准委员会资助的新技术,由布里斯托机器人实验室(Bristol Robotics Laboratory) 负责开发.这个报道可能意味着我们将来的生活方式.虽然人脸识别技术已经研究了很多年了,比较成熟了,但是还远远不够,我们以后的目标是通过识别面部表情来获得人类心理想法.   长期以来,计算机就好像一个盲人,需要

  • java 中归并排序算法详解

    java 中归并排序算法详解 归并排序算法,顾名思义,是一种先分再合的算法,其算法思想是将要排序的数组分解为单个的元素,每个元素就是一个单个的个体,然后将相邻的两个元素进行从小到大或从大到小的顺序排序组成一个整体,每个整体包含一到两个元素,然后对相邻的整体继续"合"并,因为每个整体都是排过序的,因而可以采用一定的算法对其进行合并,合并之后每个整体包含三到四个元素,继续对相邻的整体进行合并,直到所有的整体都合并为一个整体,最终得到的整体就是将原数组进行排序之后的结果. 对于相邻的整体,其

  • C语言中冒泡排序算法详解

    目录 一.算法描述 二.算法分析 三.完整代码 总结 一.算法描述 比较相邻两个元素,如果第一个比第二个大则交换两个值.遍历所有的元素,每一次都会将未排序序列中最大的元素放在后面.假设数组有 n 个元素,那么需要遍历 n - 1 次,因为剩下的一个元素一定是最小的,无需再遍历一次.因此需要两层循环,第一层是遍历次数,第二层是遍历未排序数组. 动图如下: 黄色部分表示已排好序的数组,蓝色部分表示未排序数组 核心代码如下: /** * @brief 冒泡排序 * * @param arr 待排序的数

  • Python+OpenCV人脸检测原理及示例详解

    关于opencv OpenCV 是 Intel 开源计算机视觉库 (Computer Version) .它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV 拥有包括 300 多个 C 函数的跨平台的中.高层 API .它不依赖于其它的外部库 -- 尽管也可以使用某些外部库. OpenCV 对非商业应用和商业应用都是免费 的.同时 OpenCV 提供了对硬件的访问,可以直接访问摄像头,并且 opencv 还提供了一个简单的 GUI(graph

  • 基于Python的人脸检测与分类过程详解

    目录 人脸识别 算法简介 人脸检测 简述 数据集介绍 算法介绍 测试网络 结果预览 人脸识别 算法简介 我们的算法可以分成两个部分,识别人脸位置和确定人脸分类.这两个部分可以看成:1.检测出人脸之间相似性.2.检测出人脸之间不同性.由于这两项工作截然相反,所以我们使用了两个网络来分别完成这两项工作. 人脸检测 简述 我们的人脸检测网络采用了和Faster RCNN类似的策略,但我们在ROI Polling上进行了创新,兼顾了小目标检测和大目标检测,为此,我们还使用了改进后的RESNET101_V

  • python中实现k-means聚类算法详解

    算法优缺点: 优点:容易实现 缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢 使用数据类型:数值型数据 算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就会放到同一个类别中去. 1.首先我们需要选择一个k值,也就是我们希望把数据分成多少类,这里k值的选择对结果的影响很大,Ng的课说的选择方法有两种一种是elbow method,简单的说就是根据聚类的结果和k的函数关系判断k为多少的时候效果最好.另一种则是根据具体的需求确定,比如说进行衬衫尺寸的聚

  • Python自然语言处理之切分算法详解

    一.前言 我们需要分析某句话,就必须检测该条语句中的词语. 一般来说,一句话肯定包含多个词语,它们互相重叠,具体输出哪一个由自然语言的切分算法决定.常用的切分算法有完全切分.正向最长匹配.逆向最长匹配以及双向最长匹配. 本篇博文将一一介绍这些常用的切分算法. 二.完全切分 完全切分是指,找出一段文本中的所有单词. 不考虑效率的话,完全切分算法其实非常简单.只要遍历文本中的连续序列,查询该序列是否在词典中即可.上一篇我们获取了词典的所有词语dic,这里我们直接用代码遍历某段文本,完全切分出所有的词

  • Python集成学习之Blending算法详解

    一.前言 普通机器学习:从训练数据中学习一个假设. 集成方法:试图构建一组假设并将它们组合起来,集成学习是一种机器学习范式,多个学习器被训练来解决同一个问题. 集成方法分类为: Bagging(并行训练):随机森林 Boosting(串行训练):Adaboost; GBDT; XgBoost Stacking: Blending: 或者分类为串行集成方法和并行集成方法 1.串行模型:通过基础模型之间的依赖,给错误分类样本一个较大的权重来提升模型的性能. 2.并行模型的原理:利用基础模型的独立性,

  • redis配置文件中常用配置详解

    此次安装的版本为: 5.0.3 [root@localhost local]# redis-server --version Redis server v=5.0.3 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=afabdecde61000c3 打开redis.cof NETWORK # 指定 redis 只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求 bind 127.0.0.1 #是否开启保护模式,默认开启.要是配置

  • opencv canny边缘检测算法详解

    目录 一.边缘检测原理 二.canny算法原理 三.opencv函数支持Canny() 四.代码示例: 一.边缘检测原理 图像的边缘由图像中两个相邻的区域之间的像素集合组成,是指图像中一个区域的结束和另外一个区域的开始.也可以这么理解,图像边缘就是图像中灰度值发生空间突变的像素的集合.梯度方向和幅度是图像边缘的两个性质,沿着跟边缘垂直的的方向,像素值的变化幅度比较平缓:而沿着与边缘平行的方向,则像素值变化幅度变化比较大.于是,根据该变化特性,通常会采用计算一阶或者二阶导数的方法来描述和检测图像边

随机推荐