Классификаторы доверия в OpenCV лицо детектор - PullRequest
15 голосов
/ 31 октября 2011

Я использую хар-каскадный детектор лица opencv (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) ( более важно ) Есть ли способ получить показатель достоверности для каждого обнаружения? Насколько классификатор лица уверен, что обнаружение соответствует реальному лицу?

Спасибо

Ответы [ 2 ]

7 голосов
/ 31 октября 2011

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

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

0 голосов
/ 14 мая 2016

Большое спасибо за ваш вопрос и ответ, я искал 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)
...