给定一张输入图像,要完成人脸检测这个任务,我们通常分成三步来进行:
1、选择图像上的某个(矩形)区域作为一个观察窗口;
2、在选定的窗口中提取一些特征对其包含的图像区域进行描述;
3、根据特征描述来判断这个窗口是不是正好框住了一张人脸。
检测人脸的过程就是不断地执行上面三步,直到遍历所有需要观察的窗口。如果所有的窗口都被判断为不包含人脸,那么就认为所给的图像上不存在人脸,否则就根据判断为包含人脸的窗口来给出人脸所在的位置及其大小。
如何选择观察窗口呢?
选择的窗口应该覆盖图像上的所有位置。最直接的方式就是让观察的窗口在图像上从左至右、从上往下一步一步地滑动,从图像的左上角滑动到右下角—即所谓的滑窗。
选好了窗口,我们开始对窗口中的图像区域进行观察,目的是对图像进行特征提取。由于机器看到的只是一堆数值,能够处理的也只有数值,因此对于图像所提取的特征具体表示出来就是一个向量,称之为特征向量,其每一维是一个数值,这个数值是根据输入(图像区域)经由某些计算(观察)得到的,例如进行求和、相减、比较大小等。总而言之,特征提取过程就是从原始的输入数据(图像区域颜色值排列组成的矩阵)变换到对应的特征向量的过程,特征向量就是我们后续用来分析和寻找真相的证据。
特征提取之后,就到了进行判断的时刻:判别当前的窗口是否恰好包含一张人脸。我们将所有的窗口划分为两类,一类是恰好包含人脸的窗口,称之为人脸窗口,剩下的都归为第二类,称之为非人脸窗口,而最终判别的过程就是一个对当前观察窗口进行分类的过程。因为我们的证据是由数值组成的特征向量,所以我们是通过可计算的数学模型来寻找真相的,用来处理分类问题的数学模型我们通常称之为分类器,分类器以特征向量作为输入,通过一系列数学计算,以类别作为输出——每个类别会对应到一个数值编码,称之为这个类别对应的标签,如将人脸窗口这一类编码为1,而非人脸窗口这一类编码为-1;分类器就是一个将特征向量变换到类别标签的函数。
VJ人脸检测之所以器能够获得成功,极大地提高人脸检测速度,其中有三个关键要素:特征的快速计算方法——积分图,有效的分类器学习方法——AdaBoost,以及高效的分类策略——级联结构的设计。VJ人脸检测器采用Haar特征来描述每个窗口,所谓Haar特征,其实就是在窗口的某个位置取一个矩形的小块,然后将这个矩形小块划分为黑色和白色两部分,并分别对两部分所覆盖的像素点(图像上的每个点称为一个像素)的灰度值求和,最后用白色部分像素点灰度值的和减去黑色部分像素点灰度值的和,得到一个Haar特征的值。
参考文献
[1] Viola P, Jones M J. Robust real-time face detection[J]. International journal of computer vision, 2004, 57(2): 137-154.