面部识别系列-三期-Viola–Jones 实时面部识别框架

背景

Viola-Jones Framework 是实时面部识别的算法之一。实际上如果不考虑数学部分,只从抽象理解和代码实践,感觉并没有那么难。这可能要成为我最短的系列了。。。。

Viola-Jones其包含了下面四个步骤:

Haar Feature Selection HAAR特征提取Creating an Integral Image 某种形式的图片处理(不好翻译)Adaboost Training Adaboost Classifier 训练Cascading Classifiers Cascade Classifier 梯度Classifier

另外,需要注意的是Viola-Jones实现的是real-time,所以速度 与 效率对其尤其重要

Haar Feature

任何图片处理的算法,面对的第一个问题就是特征提取,现在比较火的CNN也是如此。

我们知道图片是一些像素点的集合,那么就是一个0~255范围的矩阵(假设是黑白图片)。当然,这些像素本身就是最原始的特征值。但是很明显 real-time的面部识别不能使用这些最原始的特征值。

Viola-Jones提出一种叫做Haar Feature的特征。该特征就是将下图中的,黑白的形状在图片中扫描。

然后如下图计算出,像素差的均值。也就是黑色像素点- 白色框框的像素点 ,再除以n

当然Faar Feature 特征的提取是用上图的框,去扫描整张图。同时,这个框的大小也会变化。

大致的计算过程如上面解释的。那么接下来的问题是,为什么要这么设计特征呢?

我们的任务是识别面部。那么人的脸是有明显的特征的。比如鼻梁之间像素差、眼睛的像素差、嘴巴也是。 如下图,Haar Feature最终捕捉到的就是像素差较大的地方。对于下图可能最终形成的就是一个非常模糊的五官。这就是为什么要使用Haar Feature的原因

Integral Image

上一部分提到了为了得到Haar Feature,我们需要用 黑白相间的框框去扫描图片。 但是这会带来一个问题,就是计算量的问题。因为,我们要用不同的size的框框去扫描,没扫描一次都要重新把黑色部分-白色部分。其计算两集是 N的平方

Integral Image的方法很直接,他将图片的数字进行转换。每个格子的数字等于所有左上角的总和。

那么当我要计算下图黄色部分的合计时,我只需要用3.7+0.2-0.5-1.7.

这样只需要四个角的数字 的加减就能算出 这个部分的像素和。

Integral Image的最大意义在于能够快速算出特征值。 记得,目标是real-time的面部识别

Adaboost Training &Cascading Classifiers

上一期有详细的解释Adaboost,就是将很多个weak classifier 组合在一起成为一个Strong Classifier。当然其中一个很重要的一步是 每一个Weak Classifier之后,都要将分类错误的数据 权重加大,这样后面的classifier自然就更关注上一次错误的数据。

那么这对于Viola-Jones模型的意义是什么呢?

在实时的面部识别中,一个图片中大部分特征是不包括面部的。如果要做到实时,一个合理的做法是, 能够快速的判断不是面部, 对于有疑虑的再慢慢看。

这就是Cascading Classifier的意义,如下图,每一个Classifier 如果是No,那么判断结束;如果是Yes进入下一个环节。这么做最大的好处能快速过滤掉否定的答案。

同时Cascading Classifier梯度判断 也 于Adaboosting Training结合起来了。

总结下

首先呢,Viola-Jones的模型采用了Haar Feature 这种特征,对于面部识别非常有效,毕竟于面部的特征和契合;

其次呢,Viola-Jones采用了Integral Image能够快速的计算出特征值;

然后呢,它还采用了 梯度判断,能够快速的筛选掉 不含面部的像素特征;

最终呢,Viola-Jones 做到了Real-time

下期预告

下一期肯定就是本系列最后一期了,本期已经把Viola-Jones模型的框架概念讲完了。

下一期只能带来代码了。等我周末琢磨下吧。