您的位置:首页 > 其它

Face Alignment at 3000 FPS通俗易懂讲解一 随机森林的生成

2016-12-27 19:28 375 查看
Face Alignment at 3000 FPS通俗易懂讲解
思想:先局部,再整体。

局部:获取标记点的局部二值特征。
具体做法:
若干个样本N,每个样本有n个标记点(如68)。
对这N个样本划分成m个小样本,小样本数N/m个。
对小样本中每一个标记点附近生成K个随机点,共有K*N/m个点(K*N/m矩阵)。对这些点的像素插值(局部二值)建立模型,就有了m个决策树,形成1个随机森林。
n个标记点,每个点有1个随机森林(m个决策树),组成n个随机森林。
可根据随机森林得到一个特征点的LBP特征。
 
整体:对这所有的特征进行线性回归。
 
一、随机森林的生成
这章先讲获取局部的步骤。实例讲解第一级随机森林的生成。
1、训练数据
训练集,也就是样本,有770个,进行5倍随机增强之后,得到3850个样本。(样本少的时候常用的办法)
示例:对其中的一个样本,实际标记的样本为最后一张图,增强后的样本为前5个,对应的是5个随机形状。原始共有770个样本,增强就有了3850张图片,分别对应5个随机形状。
每次随机选择非本帧图像的形状向量,以本帧实际的形状向量,对随机挑选的形状向量进行了翻转、旋转、平移缩放操作(归一化),再对齐本帧实际大小的形状向量。



2、样本划分
因为要训练10个决策树,所以将样本划分为10个小样本。这里划分的方式如图所示。对每一个小样本(642个)训练出一个决策树,就有了10个决策树。



3、决策树与随机森林
对第一个小样本的某一个标记点生成决策树。
树的深度为5,所以一共有31个节点。
比如在0-641编号(642训练集)的每张图的一个关键点的固定半径(第一级会在较大的范围内取值,如实例中第一级的半径为0.4,第二级到第七级是0.3、0.2、0.1、0.15、0.12、0.08、0.05)内,随机生成M=500个点(如实例中第一级的500,第二级到第七级是500、500、300、300、200、200、200),并记录其坐标。
组成一个500×642的输入矩阵,每一列代表的是一个样本内的500个像素差值;每一行代表的是642个样本中,每个样本间随机选择的一个像素差值。
 
决策树的阈值确定:最大方差衰减
max(分裂前的样本方差总和-分裂后左样本集的方差-分裂后右样本集的方差)
即argmax (Var-Var_Left-Var_right)
① 
一个决策树的生成
首先找根节点的分类阈值。找阈值,分裂。
500×642矩阵每一行,随机选任意一个样本的像素差值做分类阈值,用这个分类阈值将第一行642个样本分成两类:大于分类阈值的样本
和 小于分类阈值的样本,分别放在左右子集。
计算642个样本的方差,左子集的方差,右子集的方差。
依次对500行,即计算矩阵的每一行,随机产生阈值,分类,计算方差。
得到500个
(var_overall - var_lc - var_rc),选择其中最大的值,作为根节点的分裂阈值。
根据根节点的阈值真正分裂这642个,分为左右两类
 
叶节点的分类阈值同理
对根节点分类出来的左右子集的样本再分别计算方差,确定决策树的其他节点。确定一棵树的分裂节点和叶子节点。更具体的,假如左节点有79个样本,那么对这79个样本的这个关键点固定半径内随机生成500点,组成一个500×79的输入矩阵,每一列代表的是一个样本内的500个像素差值;每一行代表的是79个样本中,每个样本间随机选择的一个像素差值。选择500个
( var_overall - var_lc - var_rc)最大的值,作为此左节点的分裂阈值。将这左节点的样本再次分别左右子节点…知道完成31个节点。
一个标记点的第一个决策树生成。
 
② 
一个随机森林的生成
然后对剩下的样本输入训练第二个决策树(如384-1025编号的样本),循环知道所有样本都处理,得到随机森林的结构。
一个标记点的随机森林生成。
 
③ 
所有特征点随机森林的生成
同样的样本,对所有标记点训练相应的随机森林,得到68个随机森林。
所有标记点的随机森林生成。
 
④ 
级联的随机森林。
训练时共七级,分别对每一级生成68个标记点的随机森林。区别在于,级数越高,生成的随机点离关键点的固定半径越小。级数越高,随机点的个数也会不一样。级别越高,对人脸的定位效果越好。
所有层级的随机森林生成。
 
每个节点会记录节点的阈值,是否被分裂、是否是叶节点等信息。
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: