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个随机形状。

每次随机选择非本帧图像的形状向量,以本帧实际的形状向量,对随机挑选的形状向量进行了翻转、旋转、平移缩放操作(归一化),再对齐本帧实际大小的形状向量。

R 建立的随机森林模型能否保存 随机森林的建模过程_alignment

2、样本划分

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

R 建立的随机森林模型能否保存 随机森林的建模过程_Face Alignment_02

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个标记点的随机森林。区别在于,级数越高,生成的随机点离关键点的固定半径越小。级数越高,随机点的个数也会不一样。级别越高,对人脸的定位效果越好。

所有层级的随机森林生成。

 

每个节点会记录节点的阈值,是否被分裂、是否是叶节点等信息。