Удостоверение классификаторов в детекторе лица 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)