opencv adaboost人脸检测训练程序阅读笔记(LBP特征)

合集下载

人脸检测学习笔记(数据集-DLIB人脸检测原理-DLIBOpenCV人脸检测方法及对比)

人脸检测学习笔记(数据集-DLIB人脸检测原理-DLIBOpenCV人脸检测方法及对比)

⼈脸检测学习笔记(数据集-DLIB⼈脸检测原理-DLIBOpenCV⼈脸检测⽅法及对⽐)1.Easily Create High Quality Object Detectors with Deep Learning2016/10/11dlib中的MMOD实现使⽤HOG特征提取,然后使⽤单个线性过滤器。

这意味着它⽆法学习检测出具有复杂姿势变化的物体。

HOG:⽅向梯度直⽅图(Histogram of oriented gradient)是在计算机视觉和图像处理领域⽤于⽬标检测的特征描述器。

⼈脸检测基准FDDB有两种模式:10倍交叉验证和不受限制。

两者都在同⼀数据集上进⾏测试,但在10倍交叉验证模式下,您只能对FDDB 数据集中的数据进⾏训练。

在⽆限制模式下,您可以训练您喜欢的任何数据,只要它不包含来⾃FDDB的图像。

FDDB站点:⼈脸数据集:FDDB、ImageNet、AFLW、Pascal VOC、VGG、WIDER 、Ibug(https:///resources/facial-point-annotations/)、facescrub()等。

2.dlib-models(1)mmod_human_face_detector是在这个数据集上训练的:http:///files/data/dlib_face_detection_dataset-2016-09-30.tar.gz。

作者通过在许多公开可⽤的图像数据集(不包括FDDB数据集)中查找⼈脸图像来创建数据集。

特别是,有来⾃ImageNet,AFLW,Pascal VOC,VGG数据集,WIDER和facescrub的图像。

数据集中的所有注释都是由作者使⽤dlib的imglab⼯具创建的。

mmod_human_face_detector 包含两种模式。

不能⼈脸识别。

(2)shape_predictor_68_face_landmarks.dat.bz2这是在ibug 300-W数据集上训练的()。

matlab学习:人脸识别之LBP(LocalBinaryPattern)

matlab学习:人脸识别之LBP(LocalBinaryPattern)

matlab学习:⼈脸识别之LBP(LocalBinaryPattern)1.算法简介 LBP是⼀种简单,有效的纹理分类的特征提取算法。

LBP算⼦是由Ojala等⼈于1996年提出的,主要的论⽂是"Multiresolution gray-scale and rotation invariant texture classification with local binary patterns", pami, vol 24, no.7, July 2002。

LBP就是"local binary pattern"的缩写。

关于论⽂的讲解可参考链接 从纹理分析的⾓度来看,图像上某个像素点的纹理特征,⼤多数情况下是指这个点和周围像素点的关系,即这个点和它的邻域内点的关系。

从哪个⾓度对这种关系提取特征,就形成了不同种类的特征。

有了特征,就能根据纹理进⾏分类。

LBP构造了⼀种衡量⼀个像素点和它周围像素点的关系。

  对图像中的每个像素,通过计算以其为中⼼的3*3邻域内各像素和中⼼像素的⼤⼩关系,把像素的灰度值转化为⼀个⼋位⼆进制序列。

具体计算过程如下图所⽰,对于图像的任意⼀点Ic,其LBP特征计算为,以Ic为中⼼,取与Ic相邻的8各点,按照顺时针的⽅向记为 I0,I1,...,I7;以Ic点的像素值为阈值,如果 Ii 点的像素值⼩于Ic,则 Ii 被⼆值化为0,否则为1;将⼆值化得到的0、1序列看成⼀个8位⼆进制数,将该⼆进制数转化为⼗进制就可得到Ic点处的LBP算⼦的值。

基本的LBP算⼦只局限在3*3的邻域内,对于较⼤图像⼤尺度的结构不能很好的提取需要的纹理特征,因此研究者们对LBP算⼦进⾏了扩展。

新的LBP算⼦LBP(P,R)可以计算不同半径邻域⼤⼩和不同像素点数的特征值,其中P表⽰周围像素点个数,R表⽰邻域半径,同时把原来的⽅形邻域扩展到了圆形,下图给出了四种扩展后的LBP例⼦,其中,R可以是⼩数,对于没有落到整数位置的点,根据轨道内离其最近的两个整数位置像素灰度值,利⽤双线性差值的⽅法可以计算它的灰度值。

LBP人脸特征提取算法研究及应用

LBP人脸特征提取算法研究及应用

LBP人脸特征提取算法研究及应用LBP(Local Binary Patterns)是一种常用的人脸特征提取算法。

它是一种基于局部纹理的算法,通过分析图像中每个像素点的局部纹理信息,将其转换为二进制编码来描述图片特征。

LBP算法具有计算速度快、鲁棒性强等优点,因此在人脸识别、人脸表情识别等领域得到了广泛的研究和应用。

LBP算法的基本步骤如下:1.将图像转换为灰度图像,并对其进行归一化处理,使得每个像素的像素值在0-255之间。

2.对每一个像素点,选择其周围8个像素点作为参考点,根据参考点的灰度值与当前像素点的灰度值大小关系,通过比较生成一个8位的二进制编码。

3.统计图像中所有像素点生成的二进制编码的直方图,得到一个特征向量。

LBP特征具有以下优点:1.计算速度快:LBP算法只需要遍历图像的像素点进行比较和编码,因此计算速度较快。

2.鲁棒性强:LBP算法对于光照、表情等外界因素的影响较小,能够有效提取图像中的纹理特征,对于人脸的检测和识别具有较好的鲁棒性。

3.维度低:LBP特征是通过统计直方图生成的,因此维度较低,不易受到数据维度灾难的困扰。

LBP算法在人脸识别和表情识别等领域得到了广泛应用。

在人脸识别方面,LBP算法能够有效提取人脸图像的纹理特征,通过与数据库中已有的人脸特征进行比对,实现人脸的识别和认证。

在表情识别方面,LBP算法能够捕捉人脸图像中的细微纹理变化,通过与预先定义的表情特征模板进行匹配,实现对人脸表情的准确识别。

除了人脸识别和表情识别,LBP算法还可以应用于人脸表情合成、人脸美化等方面。

通过对人脸图像中的LBP特征进行分析和处理,可以实现对人脸表情的合成和美化,进一步丰富和改善人脸图像的应用。

总之,LBP人脸特征提取算法是一种基于局部纹理的算法,具有计算速度快、鲁棒性强等优点,广泛应用于人脸识别、表情识别等领域。

未来,随着计算能力的提升和算法的优化,LBP算法在人脸图像处理方面将会有更广泛的应用前景。

LBP算法(人脸识别特征提取)

LBP算法(人脸识别特征提取)

LBP算法(人脸识别特征提取)LBP(Local Binary Patterns)算法是一种用于人脸识别中的特征提取算法。

该算法能够有效地描述图像局部纹理特征,通过将图像划分为不同的区域,并计算每个区域的局部二值模式(Local Binary Pattern),从而提取出图像的纹理特征。

本文将介绍LBP算法的原理、应用以及算法的优缺点。

LBP算法的原理是基于图像局部纹理的分布统计。

算法首先将图像划分为若干个重叠的圆形区域,然后选取每个区域的中心像素点作为参考点,根据参考点和周围像素的灰度值大小关系,将周围像素的灰度值二值化。

具体而言,如果周围像素的灰度值大于或等于参考点的灰度值,则将其对应位置的二值设置为1,否则设置为0。

这样,就得到了一个局部二值模式。

对于每个局部二值模式,在其周围像素形成的二进制数中,可以计算出一个十进制的值,该值即为对应的LBP值。

然后,可以统计整个图像中不同LBP值的出现次数,以得到该图像的纹理特征向量。

为了保持LBP特征的旋转不变性,通常将计算得到的纹理特征向量进行旋转不变模式(Rotation-Invariant Patterns)的处理。

LBP算法在人脸识别中的应用非常广泛。

通过提取图像的纹理特征,LBP算法能够有效地区分人脸图像中不同的区域,从而实现人脸检测、人脸识别等任务。

与其他特征提取算法相比,LBP算法具有计算简单、计算效率高以及对光照变化、表情变化等具有较强的鲁棒性的优点。

然而,LBP算法也存在一些缺点。

首先,LBP算法提取的特征主要反映了图像的纹理信息,对于人脸的形状、结构等特征没有很好的表达能力。

其次,LBP算法对于像素点近邻选择的问题较为敏感,不同的近邻选择可能会导致特征的差异。

最后,LBP算法没有考虑像素点的空间关系,在一些图像中可能导致特征提取不准确。

为了克服这些缺点,研究人员对LBP算法进行了改进和扩展,提出了许多改进的LBP算法。

例如,Extended LBP(ELBP)算法结合了LBP算法和傅里叶描述子,融合了纹理和形状信息;Uniform LBP(ULBP)算法通过将LBP值分为不同的均匀模式,增强了特征的区分能力和鲁棒性;Multi-scale LBP(MLBP)算法在不同尺度下提取LBP特征,增强了特征的描述能力。

opencv adaboost人脸检测训练程序阅读笔记(LBP特征)

opencv adaboost人脸检测训练程序阅读笔记(LBP特征)

1、训练程序整体流程(1)读输入参数并打印相关信息(2)进入训练程序最外层入口classifier.train1)读正负样本,将正负样本放入imgLiast中,先读正样本,后读负样本2)load( dirName )判断之前是否有已训练好的xml文件,若有,不在重新训练该stage的xml文件,没有返回false,初始化参数3)计算requiredLeafFARate = pow(maxFalseAlarm,numStages)/max_depth,该参数是stage停止条件(利用训练样本集来计算tempLeafFARate,若tempLeafFARate小于这一参数,则退出stage训练循环);4)Stage训练循环5)更新训练样本集,计算tempLeafFARate(负样本被预测为正样本的个数除以读取负样本的次数,第一次没有训练之前,这个比值为1,因为没训练之前,所有负样本都被预测成了正样本,当第一层训练好以后,负样本采集时会先用第一层的分类器预测一次,若能分类,则不选用,选用负样本的数目是固定的,但选用这么多负样本总共要选的次数会随着层数的增多而加大,因为层数越大,分类器的分类能力也要求越大,说需要的样本就是前面分类器所不恩呢该识别的,故在采集时也比较困难。

)6)判断stage是否退出训练,若tempLeafFARate<requiredLeafFARate则退出stage训练,否则继续;7)强训练器训练入口tempStage->train()a.建立训练数据data = new CvCascadeBoostTrainData(主要是一些参数的设置,还有特征值的计算)b.初始化样本权重update_weights( 0 );c.弱分类器训练循环i)tree->train—》do_trainai) 根节点的初始root = data->subsample_data( _subsample_idx );(主要是对根节点的一些参数进行初始化,parent 0,count 1,split 0,value 0,class_idx 0,maxlr 0,left = right = 0,等等)bi) CV_CALL( try_split_node(root)),根据根节点计算整颗数的各节点的参数配置aii) calc_node_value( node );计算节点的回归值,类似于分类投票值sum(w*class_lable),正样本的class_lable取,负样本的class_lable取-1;计算节点的风险值node_risk,noderisk is the sum of squared errors: sum_i((Y_i -<node_value>)^2)bii) 判断节点是否可以分裂(判断依据:样本值和设计的节点最大深度);再利用node_risk与regression_accuracy,如果这个节点的所有训练样本的节点估计值的绝对差小于这个参数,节点不再进行分裂cii) 找出最佳分裂best_split = find_best_split(node);aiii) 定义DTreeBestSplitFinder finder( this, node );biii) parallel_reduce(cv::BlockedRange(0, data->var_count), finder);此时调用DTreeBestSplitFinder类的操作符DTreeBestSplitFinder::operator()(constBlockedRange& range)aiv) 遍历所有特征vi = vi1; vi< vi2; vi++biv) res = tree->find_split_cat_reg()得到特征为split->var_idx = vi的最佳分裂的质量split->quality(split->quality越大越好)av) 将特征为vi所有样本的特征值返回到cat_labelsbv) 计算每个特征值取值不权值和和响应和,例如特征值为,则将所有特征值列表中特征值为的样本权值相加,LBP的特征值范围是0~255,故有256个categorycv) 计算每个category的平均响应值,即将每个category的响应和除以每个category的样本权值和dv) icvSortDblPtr( sum_ptr, mi, 0 );把256个值进行升序排序,注意sum_ptr里存的是sum[i]的地址,这里排序的依据是特征值还是按照每个特征值的平均响应来排序???个人感觉是按特征值的平均响应来排序fv) 将每个特征值的平均响应值乘以该特征值的总权值得到每个特征值的总响应gv) 遍历subset_i = 0; subset_i< mi-1; subset_i++avi) 计算索引是subset_i在排序前的idxbvi) 获取索引idx对应的样本总权重cvi) 获取索引idx对应的样本总响应dvi) 以subset_i为分裂点,计算分裂质量(sumL*sumL)/ weightL +(sumR*sumR)/ weightRfvi) 若最佳分裂质量小于这个质量,则更新最佳分裂质量hv) 经过训练得到最佳分裂点和最佳分裂质量,将遍历得到的值更新到split结构体各参数。

以LBP为基础的图像集人脸识别算法分析

以LBP为基础的图像集人脸识别算法分析

以LBP为基础的图像集人脸识别算法分析在计算机视觉和图像处理领域,人脸识别一直是一个备受关注的研究领域。

人脸识别技术应用于各种场景,如安防监控、身份验证、社交媒体等。

而且人脸识别技术也是计算机视觉领域的一个重要研究方向之一。

在图像集人脸识别中,以局部二值模式(Local Binary Pattern,简称LBP)为基础的算法是一种常用的方法。

本文将介绍以LBP为基础的图像集人脸识别算法的原理和分析。

1. LBP算法原理局部二值模式(LBP)是一种用来描述图像局部纹理特征的算法。

LBP算法的基本思想是以每个像素点为中心,利用周围像素的灰度值与中心像素的灰度值进行比较,得到二值编码。

具体来说,以图像中的一个像素点为中心,将周围8个像素的灰度值与中心像素的灰度值进行比较,若周围像素的灰度值大于中心像素的灰度值,则将该像素点编码为1,否则编码为0,得到一个8位的二进制数,称为该像素点的LBP码。

将LBP码转换为十进制数,就得到了该像素点的LBP特征值。

通过这种方式,可以描述图像中每个像素点的纹理特征。

2. 以LBP为基础的图像集人脸识别算法在图像集人脸识别中,以LBP为基础的算法通常包括以下几个步骤:- 特征提取:对每张输入图像进行LBP特征提取,得到每张图像的LBP特征向量。

- 特征选择:对提取的LBP特征向量进行特征选择,选择最具有判别性的特征。

- 训练分类器:利用选取的LBP特征向量训练分类器,如支持向量机(SVM)或者k最近邻(KNN)等分类器。

- 人脸识别:利用训练好的分类器对输入的人脸图像进行识别,得到识别结果。

3. 算法分析以LBP为基础的图像集人脸识别算法具有以下优点:- 简单高效:LBP算法特征提取过程简单,计算效率高,适合对大规模图像集进行处理。

- 鲁棒性好:LBP特征对灰度变化不敏感,具有一定的鲁棒性,对光照、表情等变化具有一定的稳定性。

- 不受图像几何变换的影响:LBP特征不受图像的平移、旋转等几何变换的影响,具有一定的不变性。

人脸识别算法_几种人脸识别算法的原理概念及其代码特征

人脸识别算法_几种人脸识别算法的原理概念及其代码特征

人脸识别算法_几种人脸识别算法的原理概念及其代码特征一、基于特征分析的人脸识别算法基于特征分析的算法主要通过提取人脸图像的特征信息,然后进行对比匹配。

常用的特征分析算法有主成分分析(PCA)、线性判别分析(LDA)和局部二值模式(LBP)等。

1.主成分分析(PCA)主成分分析是一种经典的人脸识别算法,其主要思想是将原始的高维人脸图像数据降维到低维空间,并通过保留最重要的特征信息来实现对人脸的识别。

该算法将人脸图像看作向量,通过对人脸样本进行协方差矩阵分析,得到一组特征向量,通常称为特征脸。

然后通过计算待测人脸与特征脸的距离来判断身份。

2.线性判别分析(LDA)线性判别分析是一种将高维空间数据映射到低维空间的方法,在保留类别内部信息的同时,还具有良好的分类性能。

在人脸识别中,LDA将人脸图像看作样本,通过计算类别内均值和类别间均值的差异,找到能最好区分不同类别的投影方向。

最后,通过计算待测人脸与特征向量的距离来进行识别。

3.局部二值模式(LBP)局部二值模式是一种用于纹理分析的特征描述符,其主要思想是使用局部区域的像素值与中心像素值进行比较,然后按照比较结果生成二进制编码。

在人脸识别中,LBP算法通过将人脸图像划分为小的局部区域,计算每个区域的LBP特征向量,然后将不同区域的特征向量连接起来形成一个长向量。

最后通过计算待测人脸与训练样本的LBP特征向量的距离来进行识别。

二、基于深度学习的人脸识别算法随着深度学习的快速发展,基于深度学习的人脸识别算法逐渐成为主流。

这类算法通过设计并训练深度神经网络,可以自动学习人脸图像的特征表示,从而实现更准确的人脸识别。

1.卷积神经网络(CNN)卷积神经网络是一种前馈神经网络,其主要特点是通过卷积层和池化层来提取图像的局部特征,使得神经网络能够更好地适应图像的结构信息。

在人脸识别中,CNN通过输入人脸图像到网络中,网络会自动提取各种特征,然后通过全连接层进行分类或验证。

以LBP为基础的图像集人脸识别算法分析

以LBP为基础的图像集人脸识别算法分析

以LBP为基础的图像集人脸识别算法分析随着人工智能技术的快速发展,图像识别技术也得以持续提升。

人脸识别作为人工智能技术中的重要应用之一,能够解决身份认证、安全监管等领域的问题。

本文将介绍一种以LBP为基础的图像集人脸识别算法,在人脸识别领域拥有一定的研究和应用价值。

1、LBP特征LBP(Local Binary Pattern)特征是一种用于纹理描述的局部特征。

LBP特征的基本思想是以像素点为中心,按照一定的邻域半径和点的数量统计该中心像素点与邻域点的灰度值大小关系,再将这些大小关系编码为二进制数,从而产生由二进制数构成的本征模式,表示该中心像素点所在位置的局部纹理特征。

以一个8邻域为例,可以按照如下的方式计算LBP特征值:(1)将像素点的邻域设置为$r$半径内的8个像素点。

(2)计算邻域内8个像素点的灰度值差异。

设像素点$p(x,y)$的灰度值为$I(x,y)$,邻域内第$i$个像素点$(x_i,y_i)$的灰度值为$I(x_i,y_i)$,则第$i$个像素点与中心像素点$P$的灰度值差异可以用$I(x_i,y_i)-I(x,y)$表示,即:$d_i=I(x_i,y_i)-I(x,y)$(3)将邻域内8个像素点与中心像素点的灰度值差异进行二值化。

如果灰度值差异小于等于0,则将其二值化为0,否则将其二值化为1。

二值化后得到的8位二进制数可以表示当前二进制数所对应的LBP特征值。

假设二进制数的第$i$位的值为$b_i$,则当前二进制数的LBP特征值可以表示为:$LBP_8=P(\{b_0,b_1,b_2,…,b_7\})=\sum\limits_{i=0}^{7} b_i 2^i$对于选定的像素点来说,计算得到的LBP特征值作为该像素点的特征描述符,反映了该像素点所在位置的局部纹理特征。

(1)图像预处理首先需要将原始的人脸图像进行预处理。

预处理主要包括图像归一化、直方图均衡化、去除噪声等步骤。

归一化能够使得不同大小的人脸图像有相同的尺寸,从而方便后续的特征提取和识别。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、训练程序整体流程(1)读输入参数并打印相关信息(2)进入训练程序最外层入口classifier.train1)读正负样本,将正负样本放入imgLiast中,先读正样本,后读负样本2)load( dirName )判断之前是否有已训练好的xml文件,若有,不在重新训练该stage的xml文件,没有返回false,初始化参数3)计算requiredLeafFARate = pow(maxFalseAlarm,numStages)/max_depth,该参数是stage停止条件(利用训练样本集来计算tempLeafFARate,若tempLeafFARate小于这一参数,则退出stage训练循环);4)Stage训练循环5)更新训练样本集,计算tempLeafFARate(负样本被预测为正样本的个数除以读取负样本的次数,第一次没有训练之前,这个比值为1,因为没训练之前,所有负样本都被预测成了正样本,当第一层训练好以后,负样本采集时会先用第一层的分类器预测一次,若能分类,则不选用,选用负样本的数目是固定的,但选用这么多负样本总共要选的次数会随着层数的增多而加大,因为层数越大,分类器的分类能力也要求越大,说需要的样本就是前面分类器所不恩呢该识别的,故在采集时也比较困难。

)6)判断stage是否退出训练,若tempLeafFARate<requiredLeafFARate则退出stage训练,否则继续;7)强训练器训练入口tempStage->train()a.建立训练数据data = new CvCascadeBoostTrainData(主要是一些参数的设置,还有特征值的计算)b.初始化样本权重update_weights( 0 );c.弱分类器训练循环i)tree->train—》do_trainai) 根节点的初始root = data->subsample_data( _subsample_idx );(主要是对根节点的一些参数进行初始化,parent 0,count 1,split 0,value 0,class_idx 0,maxlr 0,left = right = 0,等等)bi) CV_CALL( try_split_node(root)),根据根节点计算整颗数的各节点的参数配置aii) calc_node_value( node );计算节点的回归值,类似于分类投票值sum(w*class_lable),正样本的class_lable取,负样本的class_lable取-1;计算节点的风险值node_risk,noderisk is the sum of squared errors: sum_i((Y_i -<node_value>)^2)bii) 判断节点是否可以分裂(判断依据:样本值和设计的节点最大深度);再利用node_risk与regression_accuracy,如果这个节点的所有训练样本的节点估计值的绝对差小于这个参数,节点不再进行分裂cii) 找出最佳分裂best_split = find_best_split(node);aiii) 定义DTreeBestSplitFinder finder( this, node );biii) parallel_reduce(cv::BlockedRange(0, data->var_count), finder);此时调用DTreeBestSplitFinder类的操作符DTreeBestSplitFinder::operator()(constBlockedRange& range)aiv) 遍历所有特征vi = vi1; vi< vi2; vi++biv) res = tree->find_split_cat_reg()得到特征为split->var_idx = vi的最佳分裂的质量split->quality(split->quality越大越好)av) 将特征为vi所有样本的特征值返回到cat_labelsbv) 计算每个特征值取值不权值和和响应和,例如特征值为,则将所有特征值列表中特征值为的样本权值相加,LBP的特征值范围是0~255,故有256个categorycv) 计算每个category的平均响应值,即将每个category的响应和除以每个category的样本权值和dv) icvSortDblPtr( sum_ptr, mi, 0 );把256个值进行升序排序,注意sum_ptr里存的是sum[i]的地址,这里排序的依据是特征值还是按照每个特征值的平均响应来排序???个人感觉是按特征值的平均响应来排序fv) 将每个特征值的平均响应值乘以该特征值的总权值得到每个特征值的总响应gv) 遍历subset_i = 0; subset_i< mi-1; subset_i++avi) 计算索引是subset_i在排序前的idxbvi) 获取索引idx对应的样本总权重cvi) 获取索引idx对应的样本总响应dvi) 以subset_i为分裂点,计算分裂质量(sumL*sumL)/ weightL +(sumR*sumR)/ weightRfvi) 若最佳分裂质量小于这个质量,则更新最佳分裂质量hv) 经过训练得到最佳分裂点和最佳分裂质量,将遍历得到的值更新到split结构体各参数。

Iv) 得到该特征对应的split->subset,for( i = 0; i<= best_subset; i++ )avi) 计算索引是i在排序前的idxbvi) split->subset[idx>> 5] |= 1 << (idx& 31);subset[8],每个数组里存放32位的整数,整数值由idx决定,idx也就是特征值大小civ) 若bestSplit->quality < split->quality,将split拷贝到bestSplitciii) 初始化一个bestSplit,将finder.bestSplit拷贝到bestSplit,并返回bestSplitdii) 将bestSplit赋给node->spliteii) 计算节点方向quality_scale = calc_node_dir( node );aiii) 获取最佳特征的索引vibiii) 遍历所有样本i = 0; i < n; i++aiv) 计算第i个样本的特征为vi的特征值idxbiv) 获取第i个样本的权重wciv)d=idx>=0?CV_DTREE_CA T_DIR(idx,subset) :0CV_DTREE_CA T_DIR(idx,subset) = (2*((subset[(idx)>>5]&(1 << ((idx) & 31)))==0)-1)(d = 1或者 d = -1)div) sum += d*w; sum_abs += (d & 1) * wfiv) dir[i] = (char)d;ciii) R =(sum_abs + sum)*0.5;(取向正样本的所有权重和)diii) L=(sum_abs- sum)*0.5;;(取向负样本的所有权重和)fiii) node->maxlr = MAX( L, R );giii) 返回node->split->quality/(L + R);fii) split_node_data( node );aiii) complete_node_dir(node);对每个样本的归类属性再一次定义,确保每个样本要么分到左边要么分到右边biii) 遍历样本,得到左节点和右节点的样本数nl和nrciii) 对左节点和右节点初始化diii) 分别计算左节点和右节点的每个特征对应的分类样本数(这中间的代码不是很懂!!!)gii) try_split_node( node->left );Iii) try_split_node( node->right );ii)cvSeqPush( weak, &tree );将训练好的树添加到弱分类器重iii)update_weights( tree );更新样本权重ai) weak_eval[i] = f(x_i) in [-1,1]对应代码为weak_eval->data.db[i]*= -orig_response->data.i[i];i为0~n-1,n为样本数目bi) w_i *= exp(-y_i*f(x_i))iv)trim_weights();调整权重,但在程序中未看出调整,该函数是根据更新后的权重调整subsample_mask的数据,即利用阈值判断正样本被检测正确的将subsample_mask的数据赋值为1;v)强制退出循环判断cvCountNonZero(subsample_mask),若subsample_mask中数据全为0,则直接退出弱分类器循环,这种情况应该不会出现d.弱分类器训练循环终止条件判断while( !isErrDesired() && (weak->total<params.weak_count) );(isErrDesired()计算负样本的虚警率,若小于maxfalserat返回true,反之返回false;isErrDesired()还计算stage阈值,具体计算过程:对正样本进行预测,预测值放在eval向量中,对向量中的预测值排序(本人默认为升序),计算阈值索引intthresholdIdx =(int)((1.0F - minHitRate) * numPos);threshold = eval[ thresholdIdx ];这样在检测时,根据叶子节点的预测值小于这个阈值即认为是负样本)8)如果强分类器重弱分类器的个数大于0,返回ture,否则返回false9)返回ture时输出和打印相关信息,否则退出stage循环10)保存stage的xml文件(3)输出和打印相关信息。

相关文档
最新文档