OpenCV人脸检测器中的分类器置信度

16
我正在使用Python中的OpenCV哈尔级联人脸检测器(cv.HaarDetectObjects)。
例如:
    faces = cv.HaarDetectObjects(grayscale, cascade, storage, 1.2, 2,
    cv.CV_HAAR_DO_CANNY_PRUNING, (50,50))

       for f in faces:
           print(f)
这将以以下形式打印检测列表:
 ((174, 54, 114, 114), 53)
 ((22, 51, 121, 121), 36)
 ((321, 56, 114, 114), 21)
 ((173, 263, 125, 125), 51)
 ((323, 272, 114, 114), 20)
 ((26, 271, 121, 121), 36)
每一行都代表一个检测结果。前4个数字表示边界框左上角的x、y坐标及其高度和宽度。最后一个数字是(引用openCV文档中的说法)邻居数。
我有两个问题:
1)最后一个数字是什么意思?在谷歌搜索时我找不到任何参考资料。
2)(更为重要)有没有办法获得每个检测结果的置信度分数呢?人脸分类器对于检测结果与真实人脸相符的程度有多大把握?
谢谢。

2
可能会有用:http://haoxiang.org/2013/11/opencv-detectmultiscale-output-detection-score/ - Shai
2个回答

7
1) 检测代码对于一个对象可能会产生多个检测结果,例如在不同的比例、稍微移动等情况下。然后将这些检测结果进行分组,组内相邻的数量就是返回的结果。详见 Viola Jones 论文第 5.6 段 (http://research.microsoft.com/en-us/um/people/viola/Pubs/Detect/violaJones_IJCV.pdf) 和 OpenCV 源码。
2) 可以使用相邻数量作为某种置信度的衡量标准。

0
非常感谢您的问题和答案,我已经寻找了一天带有置信度分数的opencv人脸检测。您的问题和答案给了我一些解决问题的指导。
就像Palmstrom所说,最后一个数字表示该聚类中对象位置的数量。您可以将其用作置信度分数。
据我所知,只有旧的Python API中才有这种类型的API。新API没有此(聚类中对象的数量)值。
我在这里放置了我的代码,以防它能够帮助其他人。这是一个旧的Python API,其教程很难找到。
import sys
import cv

def detect_face(image):
    image_size = cv.GetSize(image)
    # # create grayscale version
    grayscale = cv.CreateImage(image_size, 8, 1)
    cv.CvtColor(image, grayscale, cv.CV_BGR2GRAY)
    # # equalize histogram
    cv.EqualizeHist( grayscale,grayscale )

    #parameters to the detection function    
    cascade = cv.Load('haarcascade_frontalface_alt.xml')
    haar_scale = 1.1
    min_neighbors = 3
    haar_flags = cv.CV_HAAR_DO_CANNY_PRUNING
    min_size = (30,30)

    faces = cv.HaarDetectObjects(grayscale, cascade, cv.CreateMemStorage(0),
                                haar_scale, min_neighbors, haar_flags, min_size)

    print faces

    if len(faces) > 0:
        print '=> ' +  str(len(faces)) + ' face detected!'
        for ((x,y,width,height), n) in faces:
            pt1 = (x,y)
            pt2 = (x + width, y + height)
            cv.Rectangle(image, pt1, pt2, cv.RGB(255, 0, 0), 3, 8, 0) 


if __name__ == '__main__':

    filename = sys.argv[1]
    image = cv.LoadImage(filename,cv.CV_LOAD_IMAGE_COLOR);
    detect_face(image)

    cv.ShowImage("cam", image)
    cv.WaitKey(0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接