在上篇文章中,简单的介绍了
人脸识别综述之人脸检测
的原理,虽然Viola-Jones算法已经算是老掉牙的技术,但是本着学习的态度,本文还是想通过简单的代码来加深对该算法的印象。
本文主要通过OpenCV进行人脸检测工作,关于OpenCV的安装教程,请自行百度,以下内容只作为人脸检测的Hello World案例。
这里对OpenCV和Cascade做一些简单的介绍。
OpenCV
OpenCV是最流行的计算机视觉库,原本用C和C++开发,现在也支持python。
它使用机器学习算法在图像中搜索人的面部。对于人脸这么复杂的东西,并没有一个简单的检测能对是否存在人脸下结论,而需要成千上万的特征匹配。算法把人脸是被任务分解成数千个小任务,每个都不难处理。这些任务也被称为分类器。
对于类似于人脸的对象,你或许需要不少于 6000 个分类器,每一个都需要成功匹配(当然,有容错率),才能检测出人脸。但这有一个问题:对于人脸识别,算法从左上角开始计算一个个数据块,不停问“这是张脸吗”。每个数据块有超过 6000 个检测,加起来的计算量会达到数百万级别,计算机很可能会让你等得花儿都谢了。
OpenCV 使用 cascades 来避免这种情况。Cascade 是什么?最佳答案已经在字典里了:一条瀑布或者连续瀑布。
好比连续瀑布,OpenCV cascade 把人脸检测问题分解为好几步。对于每个数据块,它都进行一个粗略、快速的检测。若通过,会再进行一个更仔细的检测,以此不断类推。该算法有 30 到 50 个这样的阶段,或者说 cascade。只有通过全部阶段,算法才会判断检测到人脸。这样做的好处是:大多数图形都会在头几步就产生否定反馈,算法因而不需要在它上面测试所有 6000 个特征,大大节省了时间。相对于“正常流程”耗费数个小时,这可以实时实现人脸检测。
Cascade
它的理论也许听起来很复杂,实际操作起来其实是很简单的。这些 cascades 只是一系列包含 OpenCV 数据的 XML 文件。你用想要的 cascade 初始化代码,它自会替你做你想要的事。
由于人脸识别的普遍性,OpenCV 有一系列能检测各种东西的内置 cascade,从眼睛到手到腿都可以检测。甚至还有针对非人体物体的 cascade。比如说,如果你经营一家卖香蕉的水果店,想要监测偷香蕉的人,就有一个家伙开发了一个针对这一场景的算法!
以下代码主要分为两个部分:
1:静态图片的人脸检测
2:视频流的人脸检测
Talk is cheap,Show me the code!
静态图片人脸检测
关于代码的详细解析,已经在文章中有所体现。
视频图像人脸检测
领取专属 10元无门槛券
私享最新 技术干货