摘要
主要介绍了该文章的贡献——即致力于识别Unconstrained的脸。首先要加入一个新的特征—”Normalized Pixel Difference(NPD)”,解释没看懂。第二,要用一个深度二叉树来学习最优NPD特征的子集和这些NPD子集的结合(combinations),并且声明了这样做可以把分类器的使用独立开来,用一个soft-cascade分类器即可套用这些新方法。最后,要展示NPD特征可以很好的被获取,利用一个look up table,并且检测模板可以轻松缩放,所以这个分类器运行也很快。
1.介绍
介绍中当然先提及了VJ分类器,毕竟VJ能做到的基本也就不用在搞了,要做肯定要做VJ做不到的,就是识别复杂的脸了。这里定义了一个无约束的脸(unconstrained face)的概念,即各种各样的脸部变化——表情变化、姿势变化、光照变化、遮挡、低分辨率,乃至丧病的把散焦导致的变化也算进来了,VJ在识别这些脸时候表现很糟,然后这个论文就是要讲他们是怎么识别这些脸的了。
接着,文章又提到了很多其他想要替换haar-like特征来提高性能的论文,然后批评他们只在很小的范围内获得扩展,却往往大幅提高了分类器训练的开销。
然后又提到有些人修改分类器的结构来识别更多的脸的变化,比如侧脸等,然后指出这些方法局限性很大,因为很难定义所有的脸,而且增加分类器也会提高开销(侧脸和正脸用的是不同的分类器),最后,这些方法还需要人工收集侧脸的样本,十分不便。
说完别人的不好,接下来就是讲自己的方案怎么好了。这篇论文的核心主要就是将这个NPD特征的应用的,这个NPD说是启发自心理学的韦伯分数。NPD说是计算任意两个像素和它们的和的比率(暂时看不懂啥意思)。NPD特征有几个理想的地方,如标度不变性、有界性、还可以重构原图(啥?)。然后NPD可以用一个look up table来获得,然后得到的检测模板可以轻松地缩放来识别各种尺度的脸部。(听起来不错的样子)
然后,这个论文提议的分类器需要一个深度二叉树结构来对脸进行判断,每个判断节点是一个弱NPD特征分类器,不同的脸的类型会自动的成为一个叶子结点(这么强?怎么做的?),不需要预先手动标记各种不同类型的脸。这个分类器训练好后就可以鲁棒的搞定前面提到的各种难搞的脸。
介绍的最后还总结了下这个识别器的优点:
1.NPD特征评估非常快,只用一次内存调用就可以出结果。
2.利用预缩放的检测模板可以轻松应对多个尺寸的脸部识别
3.不需要预先分类脸的种类
4.可以搞定各种难办的识别
2.相关工作
总结了一下人脸检测研究领域的一些工作,基本都基于VJ的论文展开,有的换特征,有的改adaboost算法。然后谈了谈对于VJ做不到的多角度,工作基本上都围绕着对于每个角度都标记并训练的低效方式展开。尽管有人把复杂结构简化并集成在一个cascade中,仍然避免不了要手动标记样本。有人想要避免手动标记样本,想到了用无监督学习来为样本自动分类,然而分类结构并不理想。
3.NPD特征空间
NPD的特征就是靠下式计算的
该式有几个特点,一个是x和y的反对称性,就是把x和y换过来,等会只是改变了符号,所以对于两个不同的像素只要计算一次就行了(如果要对称的那个直接加个负号就得到了,不需要重复计算,所以干脆这个反对称的特征给不要了),由此,对于有p个像素点的窗口,一共有p(p-1)/2个特征。
该式另外一个特点就是缩放不变性,该不变性就是当等式左边为一个常量时,x和y成比例缩放时该等式的结果不变,由此可以得到一个很好的特性就是对光照变化不敏感,使得NPD特征在不同光照条件下都能有很好的检测率。
还有一个特性即该特征有界,为[-1,1]。
基于以上几个特性,很容易知道通过这个NPD特征可以重构出原图,只要知道x1和xt的比值,又知道x1的值(不知道可以设一个),就能通过x1*比值=xt这样把所有的像素点计算出来。据说这说明了该特征很全面的利用了原图的信息。
4.利用NPD来实现人脸检测
首先这个论文用了一种新的双阈值的方式来构建二叉树,不得不说这个方法还挺有意思的,基于的是一个2元不等式:
其中abc是常量,x是特征值,t是阈值。
然后是用了一种叫深度2叉树的结构来进行训练和预测
这个2叉树的结构可以说是给该方法提供了边训练,边分类的能力,该论文中使用的8层树就能得到最多2的7次方种分类,对于人脸来说可谓绰绰有余。
那么这个阈值如何计算呢,其实就是对(2)进行求解,求一个最适合的t,在该t时,分类器f(x)对样本的预测正确率达到最高,这个基本是恒久不变的求阈值思想。
求完阈值,对于一个20*20的探测窗口来说,79800个特征值显然是不需要全部具备的,那么又是轮到资深人资adaboost来挑最适合的特征。最后将这些特征组合成一个soft cascade结构来进行预测。(说实在的这一步我不怎么懂,或者说还没想明白他们是怎么利用这个8阶树做cascade的)(又看了一次,一个8层的2叉树是作为一个weak classifier的,而不是像[1]中那样每一个特征作为一个weak classifier,然后每层貌似还得有一个阈值???来拒绝false输入)
这里论文总结了一下它是怎么做到无约束人脸检测的:
1.姿势:通过深度二叉树,不同的姿势会去到不同的leaves
2.遮挡:NPD特征考虑到输入的每个像素,即使被遮掉了很多,前面的特征仍然是有用的(其实就是剩下半张脸的像素信息也已经很多了的意思,然而后面的实验中证明对遮挡仍然不是很有效)
3.光照:就是利用NPD的不变性这个特性,光照改变时特征值变化很小(这个我其实不是很相信的,因为特别是毛发和皮肤颜色对比度很大的人,在变暗后,这个对比度会大幅下降,极限就是都变黑了,相当于原理黑的地方还是黑的,但原来不黑的地方变黑了,它再怎么不变性都没辙)
4.散焦和低解析度:说NPD只用了两个像素,所以不需要很多纹理信息。(这个我就不怎么能认同了,如果不需要很多纹理信息几乎必然意为着false positive的比重会增大,后面实验也确实验证了在对付这点上其实这个论文的方法也不是很有效)
5.实验
太长不说了,总之就是性能还可以,但也就那样,亏我看前面吹的那么厉害还以为真的能达到很高的识别度。
6.总结
基本就是我上面干的事情,总之就是想法很美好,但是实现起来还是比想着要复杂,但是这个论文里面的想法还是很有参考价值的,同时论文中提到自己的运行速度和训练速度都很快,这两点也是很有价值的。
[1]L. Bourdev and J. Brandt, “Robust object detection via soft
cascade,” in IEEE Computer Society Conference on Computer
Vision and Pattern Recognition, vol. 2, 2005, pp. 236–243.