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

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

1、训练程序整体流程

(1)读输入参数并打印相关信息

(2)进入训练程序最外层入口classifier.train

1)读正负样本,将正负样本放入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

7)强训练器训练入口tempStage->train()

a.建立训练数据data = new CvCascadeBoostTrainData(主要是一些参

数的设置,还有特征值的计算)

b.初始化样本权重update_weights( 0 );

c.弱分类器训练循环

i)tree->train—》do_train

ai) 根节点的初始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,node

risk is the sum of squared errors: sum_i((Y_i -

)^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_labels

bv) 计算每个特征值取值不权值和和响应和,例如特征值为,则

将所有特征值列表中特征值为的样本权

值相加,LBP的特征值范围是0~255,故

有256个category

cv) 计算每个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在排序前的idx

bvi) 获取索引idx对应的样本总权重

cvi) 获取索引idx对应的样本总响应

dvi) 以subset_i为分裂点,计算分裂质量

(sumL*sumL)/ weightL +

(sumR*sumR)/ weightR

fvi) 若最佳分裂质量小于这个质量,则更新最佳分裂质量

hv) 经过训练得到最佳分裂点和最佳分裂质量,

将遍历得到的值更新到split结构体各参数。

Iv) 得到该特征对应的split->subset,for( i = 0; i

<= best_subset; i++ )

avi) 计算索引是i在排序前的idx

bvi) split->subset[idx>> 5] |= 1 << (idx& 31);

subset[8],每个数组里存放32位的整

数,整数值由idx决定,idx也就是特

征值大小

civ) 若bestSplit->quality < split->quality,将split拷

贝到bestSplit

ciii) 初始化一个bestSplit,将finder.bestSplit拷贝到bestSplit,并返回bestSplit

dii) 将bestSplit赋给node->split

eii) 计算节点方向quality_scale = calc_node_dir( node );

相关文档
最新文档