Удостоверение классификаторов в детекторе лица opencv

Я использую opencv har cascade face detector (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)

Где каждая строка представляет собой обнаружение. Первые 4 числа - это местоположение x, y верхней левой точки и высота, ширина ограничивающего прямоугольника. Последнее число (цитирует из документации openCV) количество соседей.

У меня есть два вопроса:

1) Что означает последнее число? Я не мог найти никакой ссылки на это при поиске в Интернете.

2) (более важно) Есть ли способ получить оценку доверия для каждого обнаружения? Сколько стоит классификатор лица, что обнаружение соответствует реальному лицу?

Спасибо

Ответы

Ответ 1

1) Код обнаружения производит более одного обнаружения для объекта - например, в разных масштабах, слегка сдвинуты и т.д. Затем данные группируются и число соседей в такой группе - это число, возвращаемое. См. Также статью Viola Jones, п. 5.6 (http://research.microsoft.com/en-us/um/people/viola/Pubs/Detect/violaJones_IJCV.pdf) и источник OpenCV.

2) Вы можете использовать количество соседей как некоторую меру доверия.

Ответ 2

Большое спасибо за ваш вопрос и ответ, я искал опознавательное распознавание лица с оценками доверия за день. Ваш вопрос и ответ дают мне некоторое руководство для решения проблемы.

Как и Palmstrom, последнее число означает количество позиций объекта в этом кластере. и вы можете использовать это как показатель доверия.

Насколько я знаю, в старом API-интерфейсе python существует только такой API. Новый API не имеет этого (количество объектов в кластере).

Я ставлю свой код здесь, если он поможет некоторым другим людям. Это старый API-интерфейс python, учебник которого трудно найти.

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)