Haar Cascade 分类器无法检测简单正面图片中的人脸

Haar Cascade classifier does not detect faces in simple frontal pictures

尝试使用 opencv + python 使用 Haar 级联分类器进行一些简单的人脸检测。

下面的代码完美地检测了 image1, image2 but fails to detect in image3

中的人脸

请帮助我了解image3

中未检测到人脸的原因是什么
import numpy as np
import cv2

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

img = cv2.imread('/home/swiftguy/computer-vision/image3.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.3, 3)
for (x,y,w,h) in faces:
    img2 = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

haar cascades 的工作原理是二元的,如果你通过documentation,它解释了人脸检测的整个过程,为了参考目的,我附上了简单介绍的示例图像。

从图像中可以看出,灰度图像经过处理以匹配预定义的图案,黑色和白色框分别代表较暗和较亮像素的像素密度,因此该过程完全取决于形成特定特征或图案的像素的亮度。

为了确定一个像素应该被视为黑色还是白色,设置了一个阈值。现在考虑第二张快照中右下角的图像,它使用了一个明显的事实,即眉毛比肤色更暗,因此我们眼睛周围的区域可以简化为 BWB(Black White Black),其中第一个 B 代表左边眉毛像素较深,W代表眉毛之间的肤色,最后一个B代表右边眉毛,但是这样的haar特征很多。

现在来看你的图像,图像的亮度有点高,并且缺少突出的黑色特征,例如:眉毛,嘴唇等。所以有应该构成 haar 特征的像素的亮度值有可能大于阈值,因此某些 BWB 特征可能看起来像 WWW 特征,因此不符合给定图像中人脸的标准。

这主要是因为人脸亮度高,孩子的脸上(主要是鼻梁周围)没有明显的特征。人脸检测前的直方图均衡可以提高像这样的图像的检测精度。

如果您的检测器需要在此类图像上表现良好,一种可能性是使用一组相似图像来训练分类器。