这篇博客将介绍如何使用预训练好的OpenCV Haar级联人脸、眼睛、嘴部检测器,并将它们应用于图片及实时视频流的检测。
人脸检测结果是最稳定和准确的。不幸的是,在许多情况下,眼睛检测和嘴巴检测结果是不可用的――对于面部特征/部分提取,强烈建议使用python,dlib,OpenCV提取眼睛,鼻子,嘴唇及下颌,dlib的检测要比眼睛Haar级联,嘴巴Haar级联本身更稳定,甚至更快。
Haar级联算法是OpenCV最流行的目标检测算法,主要优点是速度太快了,尽管许多算法(如HOG+线性SVM、SSDs、更快的R-CNN、YOLO等等)比Haar级联算法更精确。但如果需要纯粹的速度,就是无法打败OpenCV的Haar cascades。
Haar Cascades尤其是在资源受限的设备中工作时,当无法使用更昂贵的计算对象检测器时,效果显著。Haar级联的缺点是容易出现假阳性检测,应用于推理/检测时需要进行参数调整。
1. 效果图
Haar级联检测的效果如下:
可以看到图中有固定大小的面在移动,就可以“训练”分类器来识别图像的给定区域是否包含人脸。
面部、眼睛、嘴部检测效果图如下:
有时候会有假阳性结果,如下图:
可以看到检测并不是最准确的,脸部是准确的,但嘴和眼睛级联发生好几个假阳性。当眨眼时,有两种情况发生:(1)眼睛区域不再被检测到,或者(2)它被错误地标记为嘴巴,在许多帧中往往有多个嘴巴检测结果。
2. 原理
2.1 Haar级联是什么?
Haar级联检测5个特征:边缘特征、线特征、四角-矩形的特征,计算特征需要从黑色区域下的像素总和中减去白色区域下的像素总和。有趣的是,这些特征在人脸检测中具有实际的重要性:
- 眼睛区域往往比脸颊区域暗。
- 鼻子区域比眼睛区域亮。
给定这五个矩形区域及其相应的和差,就可以形成能够对人脸的各个部分进行分类的特征。
Haar级联的一些好处是,由于使用了积分图像(也称为求和面积表),它们在计算类似Haar的特征时非常快。通过使用AdaBoost算法,它们对特征选择也非常有效。最重要的是,它们可以检测图像中的人脸,而不考虑人脸的位置或比例。
2.2 Haar级联的问题与局限性
Haar级联检测器的问题与局限主要有3点:
- 需要最有效的正面图像的脸;
- 容易出现误报――Viola-Jones算法可以在没有人脸的情况下轻松报告图像中的人脸;
- 调优OpenCV检测参数会非常乏味。有时可以检测出图像中的所有人脸,有时会(1)图像的区域被错误地分类为面部;(2)面部被完全遗漏时。
2.3 Haar级联预训练的模型
OpenCV库维护一个预先训练好的Haar级联库。包括:
- haarcascade_frontalface_default.xml:检测面部
- haarcascade_eye.xml:检测左眼和右眼
- haarcascade_smile.xml:检测面部是否存在嘴部
- haarcascade_eye_tree_eyeglasses.xml:检测是否带墨镜