在我之前的博客中介绍过随机森林,随机森林在机器学习中的应用十分广泛,它属于非传统的机器学习算法,其他的诸如神经网络,MRF,Adaboost,乃至现在大名鼎鼎的深度学习,越来越取代了传统机器学习算法,如子空间学习,流程学习等的地位。果不其然,在众多基于传统机器学习的人脸对齐算法中,去年CPVR2014也出现了一篇论文,名曰《Face Alignment At 3000fps via Local Binary Features》,正是利用了随机森林对特定点进行定位,取得了与SDM等算法同样的效果,最关键的是,它快啊!!!所以本文专门说说LBF文献中,随机森林的作用。
先大概说说LBF算法的背景,LBF是中科大的几位学者提出来的算法,发表在CVPR2014上,这个会议大家都知道,里面的文章都是很靠谱的。LBF虽然没有提供源码但我们实现过,可以说效果与当前流行的其他算法如ESR,SDM基本保持一致,速度虽然说打不到3000fps,但也有300FPS,可以说实用意义很强。其算法思想是基于学习理论,将每个特征点用一个标准随机森林训练,使得森林能够记住各种姿态下的“特征点走势”,得到特征点的稀疏编码,再通过全局优化得到最终的标定结果。本文主要说一说我对随机森林这块的理解。
主要还是回答一下上面的几个子问题。
1. 随机森林的重点是挑选属性进行节点分裂,LBF将候选属性集定义为“当前特征点周围圆形邻域内的随机撒点”,如下图所示:
这样做的目的很直白,就是通过比较各个随机撒点(比如有500个)的信息增益值,挑选最小的那一个作为分裂属性,效果是使得初始的不准确特征点一点一点的向真实位置靠近。与众不同的地方在于,LBF将像素位置作为候选属性,这么做很灵活。
2. 在文中给出的特征是“pixel-difference feature”,看过它的引用文献,发现这个特征十分的简单,就是两个像素之间的灰度差,这恰好解释了LBF快速的原因(SDM用的是sift特征,大家想想吧!!),和其他人脸对齐算法一样,始终要利用纹理信息。
3. 分裂的依据就是信息增益值,这里举个例子,比如随机森林共有50棵树,候选属性个数为500,每棵树的训练样本个数为1000,那么在根节点上,我就要将这1000个样本的当前特征点与每个候选属性进行计算,也就是得到了500 * 1000个pixel-difference feature,然后对每一组pixel-difference feature计算信息增益值,也就是说得到了500个信息增益值,然后挑选出最小的那个值所对应的候选属性作为当前节点的分裂属性,进一步,有了分裂属性,与事先设定的阈值进行比较,将1000个样本进行分类,共分为两类!
4. 叶子节点中存放的本来是训练样本,但是为了之后的计算方便,要对训练样本与初始值做减法再做平均,于是存放的其实是偏移值。
5. 训练与测试过程的流程如下,测试样本在每棵决策树中只能抵达一个叶子节点,累加所有叶子节点中的偏移量,得到的就是最终的结果。LBF别出心裁,采用了一个稀疏编码完成这一过程。