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

16 投票
2 回答
4759 浏览
提问于 2025-04-17 05:18

我在用OpenCV的Haar级联人脸检测器(cv.HaarDetectObjects)来做一些事情,使用的是Python。

举个例子:

    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)

每一行代表一次检测。前面四个数字是左上角的坐标(x,y),还有检测框的高度和宽度。最后一个数字是(根据OpenCV的说明)邻居的数量。

我有两个问题:

1) 最后那个数字是什么意思?我在网上查找时没有找到相关的信息。

2) (更重要) 有没有办法获取每次检测的置信度分数?也就是说,检测器有多确定这个检测是一个真实的人脸?

谢谢!

2 个回答

0

非常感谢你的提问和回答,我已经找了一整天关于opencv人脸检测和置信度评分的资料。你的问题和回答给了我一些解决问题的思路。

正如Palmstrom所说,最后一个数字表示这个聚类中对象位置的数量。你可以把它当作置信度评分来使用。

据我所知,只有旧版的python 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)
7

1) 检测代码会对一个物体产生多个检测结果,比如在不同的大小、稍微偏移的位置等情况下。然后,这些检测结果会被归类在一起,最后返回的数字就是这个组里邻近的检测数量。你可以参考Viola Jones的论文,第5.6段落,了解更多信息。这里有个链接可以查看:http://research.microsoft.com/en-us/um/people/viola/Pubs/Detect/violaJones_IJCV.pdf,还有OpenCV的源代码。

2) 你可以把邻近的数量当作一种信心的指标。

撰写回答