在本章中,我们将展示两个独立的例子,一个用于人脸检测,另一个用于动态检测,以及如何快速地将这些功能添加到应用程序中。
在这一章中,我们将讨论:
面部检测
动态检测
将检测添加到应用程序中
面部检测人脸检测,是人脸识别的第一部分。如果你不能从屏幕上的所有东西中识别出一个或多个人脸,那么你将永远无法识别那是谁的脸。
首先让我们看一张我们的应用程序截图:
上图中,通过摄像头我们已经捕获到一张图像,接下来启用面部跟踪,看看会发生什么:
物体面部特征正在被追踪。我们在物体周围看到的是面部追踪器(白色线框),它告诉我们我们这里有一张脸;以及我们的角度探测器(红线),它提供了一些关于我们脸所处水平方向的参考。
当我们移动物体时,面部追踪器和角度探测器会追踪他。这一切都很好,但是如果我们在真实的人脸上启用面部跟踪会发生什么呢?
如下图,面部追踪器和角度探测器正在追踪人的面部。
当我们把头从一边移到另一边时,面部追踪器会跟踪这个动作,可以看到角度探测器会根据它所识别的面部水平角度进行调整。
可以看到,在这里我们的颜色是黑白的,而不是彩色的。因为这是一个直方图的反向投影,而且它是一个可以更改的选项。
即使我们远离摄像机,让其他物体也进入视野中,面部追踪器也能在诸多噪音中跟踪我们的脸,如下图所示。这正是我们在电影中看到的面部识别系统的工作原理,尽管它更为先进。
现在让我们深入程序内部,看看它到底是如何工作的。
首先,我们需要问自己一个问题,我们想要解决的问题到底是什么。到底是人脸识别还是人脸检测。这里不得不提到Viola-Jones算法,因为,首先它有很高的检出率和很低的误报率,然后它非常擅长对数据的实时处理,最终要的一点是,它非常善于从非人脸中分别出人脸。
要永远记住,人脸检测只是人脸识别的第一步!
这个算法要求输入一个完整的正面,垂直的脸。脸部需要直接指向采集设备,头部尽量不要歪,不要昂头或低头。
这里有必要在强调一次,我们要做的只是在图像中检测出人脸即可。
我们的算法需要经过四个步骤来完成这件事:
Haar 特征选择
创建一个完整的图像
AdaBoost算法(通过迭代弱分类器而产生最终的强分类器的算法) 训练分类器
级联分类器
在正式开始之前,让我们先捋一捋面部检测到底是如果工作的。所有的脸,无论是人的,动物的还是其他的,都有一些相似的特征。例如,都有一个鼻子,两个鼻孔,一张嘴巴,两个眼睛,两个耳朵等等。我们的算法通过Haar特征来匹配这些内容,我们可以通过其中任一项找到其他的特征。
但是,我们这里会遇到一个问题。在一个24x24像素的窗口中,一共有162336个可能的特征。如果这个计算结果是正确的,那么计算他们的时间和成本将非常之高。因此,我们将会使用一种被称为adaptive boosting(自适应提升法)的算法,或者更为常见的AdaBoost算法。如果你研究过机器学习,我相信你听说过一种叫做boosting(提升)的技术。我们的学习算法将使用AdaBoost来选择最好的特征并训练分类器来使用它们。
AdaBoost可以与许多类型的学习算法一起使用,并且被业界认为是许多需要增强的任务的最佳开箱即用算法。通常在切换到另一种算法并对其进行基准测试之前,您不会注意到它有多好和多快。实际上这种区别是非常明显的。
在继续之前,我们先来了解一下什么是boosting(提升)技术。