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

您可能感兴趣的与本文相关的镜像

PyTorch 2.7

PyTorch 2.7

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shiter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值