这篇博客将介绍如何使用预训练好的OpenCVHaar级联人脸、眼睛、嘴部检测器,并将它们应用于图片及实时视频流的检测。
Haar级联算法是OpenCV最流行的目标检测算法,主要优点是速度太快了,尽管许多算法(如HOG+线性SVM、SSDs、更快的R-CNN、YOLO等等)比Haar级联算法更精确。但如果需要纯粹的速度,就是无法打败OpenCV的Haarcascades。
HaarCascades尤其是在资源受限的设备中工作时,当无法使用更昂贵的计算对象检测器时,效果显著。Haar级联的缺点是容易出现假阳性检测,应用于推理/检测时需要进行参数调整。
Haar级联检测的效果如下:
可以看到图中有固定大小的面在移动,就可以“训练”分类器来识别图像的给定区域是否包含人脸。
面部、眼睛、嘴部检测效果图如下:
有时候会有假阳性结果,如下图:可以看到检测并不是最准确的,脸部是准确的,但嘴和眼睛级联发生好几个假阳性。当眨眼时,有两种情况发生:(1)眼睛区域不再被检测到,或者(2)它被错误地标记为嘴巴,在许多帧中往往有多个嘴巴检测结果。
Haar级联检测5个特征:边缘特征、线特征、四角-矩形的特征,计算特征需要从黑色区域下的像素总和中减去白色区域下的像素总和。有趣的是,这些特征在人脸检测中具有实际的重要性:
给定这五个矩形区域及其相应的和差,就可以形成能够对人脸的各个部分进行分类的特征。
Haar级联的一些好处是,由于使用了积分图像(也称为求和面积表),它们在计算类似Haar的特征时非常快。通过使用AdaBoost算法,它们对特征选择也非常有效。最重要的是,它们可以检测图像中的人脸,而不考虑人脸的位置或比例。
Haar级联检测器的问题与局限主要有3点:
还提供了其他经过预训练的Haar级联,包括一个用于俄罗斯牌照,另一个用于猫脸检测。
可以使用cv2.CascadeClassifer从磁盘加载预先训练好的Haar级联检测器:
detector=cv2.CascadeClassifier(path)可以使用detectMultiScale对其进行预测:
results=detector.detectMultiScale(gray,scaleFactor=1.05,minNeighbors=5,minSize=(30,30),flags=cv2.CASCADE_SCALE_IMAGE)