15

Estoy usando el detector de cara en cascada har de opencv (cv.HaarDetectObjects) en python.Confiabilidad de los clasificadores en el detector de cara de opencv

por ejemplo:

faces = cv.HaarDetectObjects(grayscale, cascade, storage, 1.2, 2, 
    cv.CV_HAAR_DO_CANNY_PRUNING, (50,50)) 

     for f in faces: 
      print(f) 

Esto imprimirá una lista de detecciones en esta forma:

((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) 

donde cada línea representa una detección. Los primeros 4 números son la ubicación x, y del punto superior izquierdo y la altura y el ancho del cuadro delimitador. El último número es (citando de la documentación de openCV) el número de vecinos.

supongo que tengo dos preguntas:

1) ¿Qué significa el último número? No pude encontrar ninguna referencia a eso cuando busco en Google.

2) (más importante) ¿Hay alguna manera de obtener un puntaje de confianza para cada detección? ¿Cuánto está seguro el clasificador de rostros de que la detección corresponde a una cara real?

Gracias

+2

puede ser útil: http://haoxiang.org/2013/11/opencv-detectmultiscale-output-detection-score/ – Shai

Respuesta

7

1) el código de detección produce más de una detección de un objeto - por ejemplo, en diferentes escalas, ligeramente desplazadas, etc. Las detecciones se agrupan y el número de vecinos en dicho grupo es el número devuelto. Ver también el artículo de Viola Jones, párrafo 5.6 (http://research.microsoft.com/en-us/um/people/viola/Pubs/Detect/violaJones_IJCV.pdf) y fuente de OpenCV.

2) Posiblemente pueda usar la cantidad de vecinos como una medida de confianza.

0

Muchas gracias por su pregunta y respuesta, he estado buscando una detección de cara de opencv con puntajes de confianza por un día. Tu pregunta y respuesta me dan una guía para resolver el problema.

Como dijo Palmstrom, el último número significa el número de posiciones de objeto en ese grupo. y puedes usar eso como puntaje de confianza.

Por lo que yo sé, solo existe ese tipo de API en la antigua API de python. La nueva API no tiene este valor (número de objetos en el clúster).

Puse mi código aquí en caso de que pueda ayudar a otras personas. Esta es una antigua API de Python cuyo tutorial es difícil de encontrar.

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) 
Cuestiones relacionadas