这里的t就是前面所说的“某个数值”,其决定了分类器在给定特征向量下的输出结果,我们称其为分类器的参数。不同形式和类型的分类器会有不同的参数,一个分类器可以有一个或者多个参数,参数或者其取值不同则对应到不同的分类器。选定了一个分类器之后,紧接着的一个问题就是:参数该怎么设置?具体到我们正在考虑的情况,就是:t的值该如何选取?
要做出选择,就要有一个目标,在分类问题中,目标当然就是尽可能正确地进行分类,即分类的准确率尽可能高。然而,尽管我们对目标非常明确,我们也仍然没法给出一个最优的参数取值,因为我们并不使用机器所采用的二进制语言系统,我们并不懂什么才是对机器最好的。于是我们只有一种选择:把我们的目标告诉机器,举一些例子向其进行解释,然后让机器自己去学习这个参数,最后我们给机器设计一场考试,测试其是否满足了我们的要求。我们从一些图像上选出一部分人脸和非人脸窗口的样例,用对应的类别标签对其进行标注,然后将这些样例划分成两个集合,一个集合作为分类器学习所使用的训练集,另一个集合作为最终考查分类器能力的测试集,同时我们设定一个目标:希望分类的准确率能够在80%以上。
学习过程开始时,我们先给分类器的参数设定一个初始值,然后让分类器通过训练集中带有“答案”(类别标签)的样例,不断去调整自己参数的取值,以缩小其实际的分类准确率和目标准确率之间的差距。当分类器已经达到了预先设定的目标或者其它停止学习的条件——期末考试的时间是不会因为你没有学好而推迟的,或者分类器觉得自己已经没有办法再调整了,学习过程就停止了,这之后我们可以考查分类器在测试集上的准确率,以此作为我们评判分类器的依据。这一过程中,分类器调整自己参数的方式和分类器的类型、设定的目标等都有关,由于这部分内容超出了本文所讨论的范畴,也并不影响读者对人脸检测方法的理解,因此不再展开进行讲述。
在确定了选择窗口的策略,设计好了提取特征的方式,并学习了一个针对人脸和非人脸窗口的分类器之后,我们就获得了构建一个人脸检测系统所需要的全部关键要素——还有一些小的环节相比之下没有那么重要,这里暂且略去。
由于采用滑动窗口的方式需要在不同大小的图像上的每一个位置进行人脸和非人脸窗口的判别,而对于一张大小仅为480*320的输入图像,窗口总数就已经高达数十万,面对如此庞大的输入规模,如果对单个窗口进行特征提取和分类的速度不够快,就很容易使得整个检测过程产生巨大的时间开销,也确实就因为如此,早期所设计的人脸检测器处理速度都非常慢,一张图像甚至需要耗费数秒才能处理完成——视频的播放速度通常为每秒25帧图像,这给人脸检测投入现实应用带来了严重的障碍。
人脸检测技术的突破:VJ人脸检测器及其发展
人脸检测技术的突破发生在2001年,两位杰出的科研工作者Paul Viola和Michael Jones设计了出了一个快速而准确的人脸检测器:在获得相同甚至更好准确度的同时,速度提升了几十上百倍——在当时的硬件条件下达到了每秒处理15张图像的速度,已经接近实时速度25fps(即25帧每秒)。这不仅是人脸检测技术发展的一个里程碑,也标志着计算机视觉领域的研究成果开始具备投入实际应用的能力。为了纪念这一工作,人们将这个人脸检测器用两位科研工作者的名字命名,称之为Viola-Jones人脸检测器,或者简称为VJ人脸检测器。
VJ人脸检测之所以器能够获得成功,极大地提高人脸检测速度,其中有三个关键要素:特征的快速计算方法——积分图,有效的分类器学习方法——AdaBoost,以及高效的分类策略——级联结构的设计。VJ人脸检测器采用Haar特征来描述每个窗口,所谓Haar特征,其实就是在窗口的某个位置取一个矩形的小块,然后将这个矩形小块划分为黑色和白色两部分,并分别对两部分所覆盖的像素点(图像上的每个点称为一个像素)的灰度值求和,最后用白色部分像素点灰度值的和减去黑色部分像素点灰度值的和,得到一个Haar特征的值。