OpenCV人脸识别算法解析

一、Haar算法概述

OpenCV是一个开源的计算机视觉开发库,当年,在OpenCV实现了著名的Haar特征检测算法,从而在计算机视觉领域获得了广泛的关注。

Haar级联分类器,由Paul Viola和Michael Jones在2001年的论文中提出,依托该算法分类器,我们可以实现人脸识别、定位。

后来,随着深度学习发展,人脸检测,尤其是复杂的检测任务,依靠深度网络能获得更好的性能。但是,深度网络计算复杂,往往需要更强的硬件支持。而Haar级联分类器,因其相对简单的计算方式,且不受硬件条件限制,能够在如嵌入式设备上进行实时的检测。

在实际使用过程中,Haar级联分类器,往往配合其他算法,进行初步的人脸检测和定位,从而提供一个快速且适用的解决方案。

该算法基于特征模板的滑动来计算图像特征,从而区分物体的显著轮廓。这些特征模板形似以下图像:

2fa9c992b1527b311b5a7a0cd785d048.png

二、Haar特征

特征模板往往分成的“黑”“白“区域,试想用这些黑白二值图像”蒙”在你的图像或部分图像上,然后你原来的图像被分成“黑”“白”两类区域,最后用黑色区域和白色区域的像素进行简单的加减运算,便能得到图像的基本特征。

这里的特征模板,和卷积运算中的卷积核异曲同工,但运算更为简单。

例如,我们将模板窗口(3)“蒙”在鼻子部位,便能得到相契合的特征,将模板窗口(4)放在双眼部位,同样能得到与双眼部位契合的特征。

7e5e87ca321523485c0955e7b2a4a342.png

三、Haar特征匹配及其问题

但是如何根据不同图像来确定匹配窗口的大小,和它们应该放置的位置呢。比如上图,我们怎么知道将特定大小的“上黑下白”特征模板固定在图像的高度3/4上?

答案就是,我们让不知劳累的计算机,测试各种位置和大小。

213d24e62ceb3cde47a1c4da7e053118.png

特征模板尝试检测不同位置

这是一个巨大的工作量,首先我们如果确定具体匹配窗口大小为 。我们就将这个窗口在待检测图像上滑动,那么单单一个窗口匹配次数是大于160000,这依然将是一个巨大的工作量。

四、引入积分图

引入积分图,可以简化匹配过程中,不同模板区域间像素值加权求和的计算。

积分图的概念:在积分图" I "中,位于(x,y)处的元素值I(x,y),为原图像" i "从左上角(0,0)点处到右下角(x,y)点处的像素之和。用公式来表示就是

34f6f69194215d6da7264a372298f52c.png

a661aa2bf3a086de17c8b2d4ecc55dd0.jpeg

积分图一旦计算完成,就可以轻易求出原图像任意区域的像素之和。

比如计算下图中的阴影部分像素和:

6e79a6d1b6f91cb313908c7a0093731c.png

f34647628dcb3425c163b20b145cef42.png

五、积分图简化求区域像素和

通过积分图,可以简化在Haar特征匹配时,特征模板区域像素值加权求和的计算量。

但是对于24*24的滑动窗口,依然需要进行多次匹配产生160000+个特征

六、引入级联分类器

引入级联分类器——Cascade Classifiers,会减少单个窗口的检测次数。

拿人脸检测来讲,先用一些特征,确定该区域图像“有脸”以及“无脸“,丢掉”无脸“部分,然后再用其他特征检测,来进一步确定特征的是否存在,以及确定其特征位置。

这个过程使得我们匹配特征的过程产生一个“级联“的工作模式,每往下走一层,就会”丢弃“一些无关的区域,这样特征就越来越精确。

b4fb89129d07d94e4887bbb7bee1f6cf.jpeg

七、分级检测

对于单一图像窗口( 大小),不再是单纯的匹配所有特征,而是将特征分组,用于不同层级。往往在初始层级,使用相对粗略的特征模板进行匹配,将得到的匹配结果综合统计,看是否通过该层级设置的“层级阈值”,如果通过,才会进行下一轮特征匹配,否则就对该区域停止检测——视为“丢弃”。

从上述过程当中我们可以看到,

对于固定窗口,单独一个特征不能确定最终结果,我们把单个特征模板对目标窗口的检测叫做弱分类器(因为它不能单独确定最终结果),弱分类器往往是决策树构成。

把多个弱分类器联合形成强分类器。强分类器在弱分类器的结果上进行统计、投票。

强分类器构成级联分类器的一个层级,多个强分类器分级检测,通过一定层级阈值,进行下级特征模板的匹配。

最终我们能够做出一个快速精准的判断

b39de0732525aee3b68d502e3c796563.jpeg

八、总结Cascade Classifier的工作方式

总结:Cascade Classifier检测过程是,首先把原图像按一定尺寸,划分成窗口,窗口按一定步长在图像中滑动。然后在每一个固定窗口内,采用级联分类器,依次通过该层所有特征模板进行匹配。在匹配过程中,基本特征模板会尝试检测不同的位置。最后对该层级所有匹配结果进行综合统计,决定是否进行下一层级检测。

九、引用

维基百科——积分图

OpenCV文档

Rapid Object Detection using a Boosted Cascade of Simple Features

Face Detection with Haar Cascade。

Haar Cascades, Explained.

Viola Jones Algorithm and Haar Cascade Classifier

猜你喜欢

转载自blog.csdn.net/wangyaninglm/article/details/142932125