人脸检测发展:从VJ到深度学习(上)

  Haar特征反映了局部区域之间的相对明暗关系,能够为人脸和非人脸的区分提供有效的信息,例如眼睛区域比周围的皮肤区域要暗,通过Haar特征就可以将这一特点表示出来。但是由于提取Haar特征时每次都需要计算局部区域内多个像素点灰度值之和,因此在速度上其并不快,为此VJ人脸检测器引入了积分图来加速Haar特征的提取。

  积分图是一张和输入图像一样大的图,但其每个点上不再是存放这个点的灰度值,而是存放从图像左上角到该点所确定的矩形区域内全部点的灰度值之和。

物联网

  积分图所带来的好处是两方面的,一方面它使得每次计算局部区域像素点的灰度值之和仅需要做4次加减法,与局部区域的大小无关;另一方面它避免了在相同像素点上重复求和,只在最开始计算一次——相邻的窗口有很大的重叠部分,对应的Haar特征也会重叠,如果每次都重新计算像素点的灰度值之和,则重叠部分的计算是重复的。积分图极大地加速了Haar特征的提取,向快速的检测器迈出了第一步。

  除了特征提取,分类过程的速度对于检测的速度也至关重要。分类的速度取决于分类器的复杂程度,也即从特征向量变换到类别标签的计算过程的复杂程度。复杂的分类器往往具有更强的分类能力,能够获得更好的分类准确度,但是分类时的计算代价比较高,而简单的分类器虽然计算代价小,但是分类准确度也较低。那么有没有兼顾计算代价和分类准确度两方面的办法呢?当然有,这就是AdaBoost方法。希望计算代价小,所以只用简单的分类器,但是又希望分类准确度高,于是把多个简单的分类器组合起来——聚弱为强,将多个弱分类器组合成一个强分类器,这就是AdaBoost方法的核心理念。通过AdaBoost方法来学习分类器,达到了以更小的计算代价换取同样的分类准确度的目的。

  造成人脸检测速度慢的根本原因还在于输入规模过大,动辄需要处理几十上百万的窗口,如果这样的输入规模是不可避免的,那么有没有可能在处理的过程中尽快降低输入规模呢?如果能够通过粗略地观察快速排除掉大部分窗口,只剩下少部分窗口需要进行仔细的判别,则总体的时间开销也会极大地降低。从这样的想法出发,VJ人脸检测器采用了一种级联结构来达到逐步降低输入规模的目的。

物联网

  具体说来,VJ人脸检测器将多个分类器级联在一起,从前往后,分类器的复杂程度和计算代价逐渐增大,对于给定的一个窗口,先由排在最前面也最简单的分类器对其进行分类,如果这个窗口被分为非人脸窗口,那么就不再送到后面的分类器进行分类,直接排除,否则就送到下一级分类器继续进行判别,直到其被排除,或者被所有的分类器都分为人脸窗口。这样设计的好处是显而易见的,每经过一级分类器,下一级分类器所需要判别的窗口就会减少,使得只需要付出非常少的计算代价就能够排除大部分非人脸窗口。从另一个角度来看,这实际上也是根据一个窗口分类的难度动态地调整了分类器的复杂程度,这显然比所有的窗口都用一样的分类器要更加高效。

  VJ人脸检测器通过积分图、AdaBoost方法和级联结构取得的巨大成功对后续的人脸检测技术研究产生了深远的影响,大量的科研工作者开始基于VJ人脸检测器进行改进,这些改进也分别覆盖了VJ人脸检测器的三个关键要素。

  特征的改进和变迁

  虽然Haar特征已经能够刻画人脸的一些特点,但是相比于人脸复杂的变化模式,VJ人脸检测器所采用的5种Haar特征还是过于简单。光考虑姿态上的变化,人脸可能是斜着的(平面内旋转),也可能是仰着的或者侧着的(平面外旋转),同一个Haar特征在不同姿态的人脸上差异可能非常大,而同时又可能和非人脸区域上的特征更相近,这就很容易在分类的时候引起误判。于是人们开始对Haar特征进行扩展,使得其能够刻画更加丰富的变化模式:

  1. 环形的黑白区域划分模式,而不仅仅是上下或者左右型;

  2. 旋转的Haar的特征,即将原来提取Haar特征的局部小块顺时针或逆时针旋转45度;