传统人脸检测的原理
什么是传统的方法呢?所谓传统方法是相对于眼下方兴未艾的深度学习的技术路线而言的,指用传统的机器学习的方法,采用了某种意义上讲需要一定程度的“人工设计”的特征检测模板(例如Haar特征),也没有使用到更先进更自动的多层深度网络的技术方式。
听起来似乎很古老,但古老不等于简单,它同样有相当多的技术路线,不同的算法,应用了各不相同的数学理论,是个大家庭。所以为免以偏概全,这里我们同样只能说是介绍其中的一个特例,这个特例也是OpenCV中使用到的一种方法:使用Haar级联分类器的人脸检测。这里我可能会引用到各种各样的书籍和资料,后续会仔细把它们标注出来。
那么我们接下来就来介绍一下“Haar级联分类器”这个复合名词。所以说,有时候一个好的名字对人们学习某些概念是一项相当的便利,短短的这么一个复合词汇,就把“传统图像检测方法”中应用到的技术都概括完了,理解了这个词,也就理解了图像检测了。
前面已经说了,这篇文章我们侧重原理的介绍。那么这里我们先讲清楚“Haar级联分类器”是什么,再来论证它背后的数学原理:为什么它能够完成图像检测的任务。
传统的图像检测方法它基本干了两件事:一件事是在图像中提取物体的特征。什么叫做特征呢?在这里你可以把它理解为一种共性,就是输入了多张样本图像,使用同一方法,都能够提取到这一共同特征。举例来说,田野里有一群小朋友在偷西瓜,你对着田头大喊一声,主人来啦,所有人全都会大惊而逃,这个就叫做特征,如果有一个小朋友不跑,那么这就不能叫特征,用专业术语说,因为这样你会漏检,以为这不是一个小朋友。但是初步提取出来的特征通常都是非常微不足道的,你不能根据一个单一特征就判定输入数据属于某个分类。
它做的另一件事是执行一种分类算法,根据这些提取到的特征,判断图像属于哪个分类,或者对于二分类问题来说,是否属于某个分类。
Haar级联分类器是一个复合词汇,我们把这个词拆出来,Haar指的是Haar特征检测,干的就是第一件事,特征提取的任务。这里使用到一个“Haar特征模板”的工具,这个工具或者说技术我一开始看到的时候觉得非常聪明,或者说非常有智慧,用一个极简单的蒙板,即能完成极复杂的任务,而且适应性非常好。后面我们会仔细地说明这个概念的原理及其演进知识。
那么提取到众多的微小特征之后,需要根据这些特征对图像进行分类,如何分类呢?这里使用到级联分类器这种方法。级联是什么意思呢,就是把多个简单的判断方法/函数级联到一起,组成一个复合的高可靠性的判断方法,如果输入通过了第一个判断方法(被判定为真)则继续使用第二个判断方法对其进行判定,当有一个判断方法没有通过时,即判定为假,直到输入数据通过所有判断方法,才判定为真。这里假设一批错误样本中,使用某单一判断方法的误检率为10%,即100张图片,有10张被错误地判断为真,看起来挺高的。但是当这10张图片进入下一个判断方法时,假设其他的判断方法误检率仍然为10%,则这10张图只有一张图片会被误判为真,所以即使单一判断方法的错误率高达10%,当多个判断方法级联起来时,其误检率仍然可以降到很低。当然,反过来在正确样本中进行级联判断,则要求单一判断方法的准确率要高得多,但是当然我们也可以通过多次检测,来提高准确率,例如人脸识别的时候多刷几次脸。
这里每个单一判断方法中所有的参数都需要我们通过训练的方式,使用统计学的方法,通过多次迭代直到其错误率低于我们要求的阈值。
下面我们就先来学习第一个关键技术:Haar特征模板。而想要弄明白它,首先要了解另一个名词Haar变换。我们知道,比较一幅图片是很困难的,图片可能会出现平移、缩放、旋转、扭曲等等,使得比较它们费时费力,而结果不准确。而Haar变换可以在不丢失图片主要信息的情况下,更简单地提取到图片的特征,简单点说,不管图像怎么样扭曲缩放,使用Haar变换这种分析方法,仍然能够认出图像是什么。下面的章节将详细说明其原理。