2012-02-26 34 views
5

Estoy trabajando en un proyecto en el que debería diseñar una aplicación que pueda detectar todas las caras de las personas que pasan ... Tengo una base de datos muy grande que incluye varias personas conocidas ... He utilizado el EigenObjectRecognizer para reconocer el marco de la imagen capturado por la cámara web ... Pero el problema es que a veces reconoce erróneamente a algunas personas ... Entonces, si obtengo el valor de confianza de esta coincidencia facial ... Entonces puedo escribir un ciclo condicional para que, si es mayor más del 75%, entonces solo lo detecto si no es así. También sé que el reconocimiento basado en PCA es básico, definitivamente pasaré a otros algoritmos nuevos. Pero debido a la fecha límite del proyecto, debo enviarlo rápidamente ... .Por favor, dígame cómo obtener el valor de confianza de este reconocimiento facial de EigenObjectRecognizer ....¿Cómo obtener el valor de Confianza en el reconocimiento facial usando EMGU CV?

Respuesta

7

No existe un valor de confianza exacto sin embargo th Hay una escala variable que puede usarse e interpretarse de forma aproximada como tal, que es la Distancia Eigen.

El valor que se clasifica como una buena coincidencia cambia según la cantidad de datos que tenga y los parámetros de entrenamiento, por lo que deberá probar los valores con diferentes caras para calcular su umbral.

Deberá agregar una función a la clase Eigen para obtener este valor. Primero, sobrescribiremos el EigenObjectRecognizer que usamos. Esto es realmente simple: se incluye el archivo EigenObjectRecognizer.cs, se ubica en el directorio de \ EMGU Installation \ Emgu.CV o, donde sea que hayas extraído los archivos, podrás ubicarlo ya que está en la misma carpeta que la carpeta bin con todos los .dlls que usas

Agregue el archivo a su proyecto haciendo clic derecho en el nombre del proyecto en el explorador de soluciones en el estudio visual y seleccionando Agregar> Elemento existente ... Navegue hasta el archivo y agréguelo. Su proyecto utilizará esto automáticamente en lugar de aquel que tiene EMGU.CV.dll en sus referencias.

Abra EigenObjectRecognizer.cs ahora en su proyecto, no se preocupe, es una copia del original, por lo que cualquier cambio que realice no afectará a la fuente original. Para empezar, haga las cosas más fáciles manteniendo presionada la tecla Ctrl presionando la tecla m seguida de la tecla o, esto colapsará todos los campos del método.

Para empezar, necesitamos sobrescribir el espacio de nombres al que llamé Emgu.Custom.

Ahora en la parte superior del código Agregue la siguiente variable por debajo de los demás

private float eigenDistance; 

añade el siguiente método a la clase,

/// <summary> 
    /// Get the calculated Eignen Distance for the last proceessed frame 
    /// </summary> 
    public float GetEignenDistance 
    { 
     get { return eigenDistance; } 
    } 

Se puede colocar en cualquier lugar que usted, pero, obviamente, dentro de la clase y fuera de un método, ahora el bit importante. Hemos hecho que eigenDistance sea global, pero se crea de manera privada cuando llamamos al método .Recognize (Imagen de imagen).

Encuentra este método dentro EigenObjectRecognizer.cs y cambiar

float eigenDistance; 

a

eigenDistance = -1; 

que podría eliminar el flotador eigenDistance; línea, pero me gusta asegurar que se sobrescriba con un valor que puedo observar para un error, ya que siempre debe ser positivo si el reconocimiento se ha aplicado correctamente.Usted se dará cuenta de que la siguiente sección de código incluye:

FindMostSimilarObject(image, out index, out eigenDistance, out label); 
  • índice
  • eigenDistance
  • etiqueta

¿Son todas las salidas disponibles para su uso con un poco de codificación adicional.

Nos hay necesidad de señalar nuestra variable reconocedor Eigen a la escritura uno:

Emgu.Custom.EigenObjectRecognizer recognizer; 

Ahora podemos obtener el EigenDistance con esta llamada de función:

float EigenDistance = recognizer.GetEignenDistance; 

Espero que esto aclare las cosas,

Cheers,

Chris

+0

Señor, en mi código reconocedor es el nombre de la referencia a EigenObjectRecognizer ... Intenté usar recognizer.Get_Eigen_Results. Pero no pude encontrar ningún miembro con el nombre "Get_Eigen_Results". ¿Me falta agregar una referencia aquí? –

+0

Hola, lo siento, Surya es una función que agregué a la clase Eigen. Actualizaré mi respuesta en consecuencia. – Chris

+0

Hola, ¿crees que podría funcionar si quisiera comparar imágenes si hay la misma persona? Comprueba la distancia contra la base de datos con uno, que con el otro y finalmente comparar estas distancias? O de todos modos cómo comparar 2 fotos de la persona que no está en la base de datos? –

Cuestiones relacionadas