浅谈随机森林在人脸对齐上的应用~

       在我之前的博客中介绍过随机森林,随机森林在机器学习中的应用十分广泛,它属于非传统的机器学习算法,其他的诸如神经网络,MRF,Adaboost,乃至现在大名鼎鼎的深度学习,越来越取代了传统机器学习算法,如子空间学习,流程学习等的地位。果不其然,在众多基于传统机器学习的人脸对齐算法中,去年CPVR2014也出现了一篇论文,名曰《Face Alignment At 3000fps via Local Binary Features》,正是利用了随机森林对特定点进行定位,取得了与SDM等算法同样的效果,最关键的是,它快啊!!!所以本文专门说说LBF文献中,随机森林的作用。

(转载请注明http://blog.csdn.net/wsj998689aa/article/details/45204599, 作者:迷雾forest)


1. 随机森林回顾

       随机森林由N棵决策树组成,每一棵决策树都具有不同的初始训练样本,在训练过程中,还需要一个属性候选集,训练样本子集根据候选集合中的属性,依据分裂依据进行进一步分类,这一步俗称“分裂”,直至满足人为设定的收敛条件。

       我个人认为,分裂的想法十分重要,它使得决策树成功记忆住如何从头开始,一步一步将样本正确分类。于是在测试的过程中,测试样本完全是按照这种记忆力将自己的类别确定下来。

       不得不说,这是一种傻瓜式的策略,只要训练样本足够多,不断的学习,肯定能把这玩意学会!那么现在有个问题,我在特征点定位的时候,怎么能和随机森林搭上关系呢?或者说,如何利用随机森林建立模型解决人脸对齐问题?我觉得问题可以分解为如下几个子问题。

在应用随机森林做特征点标记的时候
1、候选属性集是什么?
2、特征是什么?
3、分裂依据是什么?
4、叶子节点内存放的是什么?
5、测试过程是什么样?

《Face Alignment At 3000fps via Local Binary Features》一文给出了精彩的回答。

2. 随机森林进行特征点定位

     先大概说说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个样本进行分类,共分为两类!至于论文中选择的信息增益手段,是“maximum variance reduction”,这里不多说,大家自己查查就知道了哈!


    4. 叶子节点中存放的本来是训练样本,但是为了之后的计算方便,要对训练样本与初始值做减法再做平均,于是存放的其实是偏移值。


    5. 训练与测试过程的流程如下,测试样本在每棵决策树中只能抵达一个叶子节点,累加所有叶子节点中的偏移量,得到的就是最终的结果。LBF别出心裁,采用了一个稀疏编码完成这一过程。




3. 一点想法

      特征方面,LBF用的只是灰度差值作为特征,这种特征判别性很弱,很容易受到遮挡和噪声的影响,多亏了随机森林一级一级的训练,以及足够多的样本可以防止算法陷入过拟合才把这个特征的弱势掩盖下去,如果我们在这个特征基础上再加上空间距离,算法性能可能会更好,不信大家试一试看。


后记: 说点这段时间自己的感想,现在在人脸对齐这块深度学习做的不错,深度学习我个人愚见是“一点记忆,疯狂学习”(随机森林是“全凭记忆,从不学习”)。其实我对传统的机器学习算法更加情有独钟,漂亮的严谨的公式推理,复杂的理论背景,子空间学习啊,概率图模型啊,各种优化算法啊!!!这才是人类智慧的集中体现啊,可是不得不面对现实,现在的机器学习已经是深度学习为代表的傻瓜式学习算法的天下喽~ 欢迎大家来喷~~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章