77范文网 - 专业文章范例文档资料分享平台

浅析人脸检测之Haar分类器方法(3)

来源:网络收集 时间:2019-06-05 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

全部人脸样本的权重的和t1; 全部非人脸样本的权重的和t0;

在此元素之前的人脸样本的权重的和s1; 在此元素之前的非人脸样本的权重的和s0; 2)最终求得每个元素的分类误差

在表中寻找r值最小的元素,则该元素作为最优阈值。有了该阈值,我们的第一个最优弱分类器就诞生了。

在这漫长的煎熬中,我们见证了一个弱分类器孵化成长的过程,并回答了如何得到弱分类器以及二叉决策树是什么。最后的问题是强分类器是如何得到的。

2.2.3 弱分类器的化蝶飞

首先看一下强分类器的代码结构:

1 /* internal stage classifier */ 2 typedef struct CvStageHaarClassifier 3 {

4 CV_INT_HAAR_CLASSIFIER_FIELDS() 5 int count; 6 float threshold;

7 CvIntHaarClassifier** classifier; 8 }CvStageHaarClassifier;

/* internal weak classifier*/ typedef struct CvIntHaarClassifier {

CV_INT_HAAR_CLASSIFIER_FIELDS() } CvIntHaarClassifier;

这里要提到的是CvIntHaarClassifier结构: 它就相当于一个接口类,当然是用

C

语言模拟的面向对象思想,利用

CV_INT_HAAR_CLASSIFIER_FIELDS()

CvCARTHaarClassifier强分类器和CvStageHaarClassifier继承于CvIntHaarClassifier。

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

1. 给定训练样本集S,共N个样本,其中X和Y分别对应于正样本和负样本; T为训练的最大循环次数;

2. 初始化样本权重为1/N ,即为训练样本的初始概率分布; 3. 第一次迭代训练N个样本,得到第一个最优弱分类器,步骤见2.2.2节

4. 提高上一轮中被误判的样本的权重;

5. 将新的样本和上次本分错的样本放在一起进行新一轮的训练。 6. 循环执行4-5步骤,T轮后得到T个最优弱分类器。 7.组合T个最优弱分类器得到强分类器,组合方式如下:

相当于让所有弱分类器投票,再对投票结果按照弱分类器的错误率加权求和,将投票加权求和的结果与平均投票结果比较得出最终的结果。

至此,我们看到其实我的题目起的漂亮却并不贴切,强分类器的脱颖而出更像是民主的投票制度,众人拾材火焰高,强分类器不是个人英雄主义的的产物,而是团结的力量。但从宏观的局外的角度看,整个AdaBoost算法就是一个弱分类器从孵化到化蝶的过程。小人物的奋斗永远是理想主义者们津津乐道的话题。但暂时让我们放下AdaBoost继续探讨Haar分类器的其他特性吧。

2.3 强分类器的强强联手

至今为止我们好像一直在讲分类器的训练,实际上Haar分类器是有两个体系的,训练的体系,和检测的体系。训练的部分大致都提到了,还剩下最后一部分就是对筛选式级联分类器的训练。我们看到了通过AdaBoost算法辛苦的训练出了强分类器,然而在现实的人脸检测中,只靠一个强分类器还是难以保证检测的正确率,这个时候,需要一个豪华的阵容,训练出多个强分类器将它们强强联手,最终形成正确率很高的级联分类器这就是我们最终的目标Haar分类器。

那么训练级联分类器的目的就是为了检测的时候,更加准确,这涉及到Haar分类器的另一个体系,检测体系,检测体系是以现实中的一幅大图片作为输入,然后对图片中进行多区域,多尺度的检测,所谓多区域,是要对图片划分多块,对每个块进行检测,由于训练的时候用的照片一般都是20*20左右的小图片,所以对于大的人脸,还需要进行多尺度的检测,多尺度检测机制一般有两种策略,一种是不改变搜索窗口的大小,而不断缩放图片,这种方法显然需要对每个缩放后的图片进行区域特征值的运算,效率不高,而另一种方法,是不断初始化搜索窗口size为训练时的图片大小,不断扩大搜索窗口,进行搜索,解决了第一种方法的弱势。在区域放大的过程中会出现同一个人脸被多次检测,这需要进行区域的合并,这里不作探讨。

无论哪一种搜索方法,都会为输入图片输出大量的子窗口图像,这些

子窗口图像经过筛选式级联分类器会不断地被每一个节点筛选,抛弃或通过。

它的结构如图所示。

我想你一定觉得很熟悉,这个结构不是很像一个简单的决策树么。 在代码中,它的结构如下:

1 /* internal tree cascade classifier node */ 2 typedef struct CvTreeCascadeNode 3 {

4 CvStageHaarClassifier* stage; 5 struct CvTreeCascadeNode* next; 6 struct CvTreeCascadeNode* child; 7 struct CvTreeCascadeNode* parent;

8 struct CvTreeCascadeNode* next_same_level; 9 struct CvTreeCascadeNode* child_eval; 10 int idx; 11 int leaf;

12 } CvTreeCascadeNode;

13 /* internal tree cascade classifier */ 14 typedef struct CvTreeCascadeClassifier 15 {

16 CV_INT_HAAR_CLASSIFIER_FIELDS() 17 CvTreeCascadeNode* root; /* root of the tree */

18 CvTreeCascadeNode* root_eval; /* root node for the filtering */ 19 int next_idx;

20 } CvTreeCascadeClassifier;

级联强分类器的策略是,将若干个强分类器由简单到复杂排列,希望经过训练使每个强分类器都有较高检测率,而误识率可以放低,比如几乎99%的人脸可以通过,但50%的非人脸也可以通过,这样如果有20个强分类器级联,那么他们的总识别率为0.99^20 98%,错误接受率也仅为0.5^20

0.0001%。这样的效果就可以满足现实的需要了,但是如何使每

个强分类器都具有较高检测率呢,为什么单个的强分类器不可以同时具有较高检测率和较高误识率呢?

下面我们讲讲级联分类器的训练。(主要参考了论文《基于Adaboost的人脸检测方法及眼睛定位算法研究》)

设K是一个级联检测器的层数,D是该级联分类器的检测率,F是该级联分类器的误识率,di是第i层强分类器的检测率,fi是第i层强分类器的误识率。如果要训练一个级联分类器达到给定的F值和D值,只需要训练出每层的d值和f值,这样:

d^K = D,f^K = F

级联分类器的要点就是如何训练每层强分类器的d值和f值达到指定要求。

AdaBoost训练出来的强分类器一般具有较小的误识率,但检测率并不

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库浅析人脸检测之Haar分类器方法(3)在线全文阅读。

浅析人脸检测之Haar分类器方法(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/651029.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: