Spanish Reconocimiento facial

JordiCP

Expert
Licensed User
Longtime User
Creo que no existe nada 'facil' y ya hecho para reconocimiento facial en B4A

Lo que sí podrás encontrar son ejemplos de detección de rostros (face-detection), que sólo es una parte del proceso.
Si buscas 'face-recognition', verás que hay un problema de semántica, pues muchos de los posts se refieren solamente a la detección, y no a la comparación de los rostros respecto a otros guardados.

Las direcciones que podrías tomar (no las he explorado):
  • Utilizar un servicio online para el proceso, que pueda ser atacado mediante algina API con HTTP. No suelen ser gratis, pero depende del uso que le quieras dar podría simplificar las cosas.
  • Con OpenCV. Hay unos módulos dedicados a la extracción de landmarks faciales, a partir de los cuales se podría (de hecho hay algún proyecto por internet) hacer un sistema de clasificación de caras. El problema es que estos módulos no forman parte de la distribución 'oficial' de OpenCV (son unos módulos opcionales dentro de un grupo llamado contrib), y mi librería de OpenCV para B4A sólo expone los módulos estándar.
  • Tensorflow o otros modelos de DNN: Teóricamente es posible clasificar las caras 'candidatas' entrenando un modelo con varias imágenes de cada cara. Existe una implementación de TensorflowLite para Android de @moster67. La parte 'difícil' es que se debe construir el modelo (normalmente en un PC, como trabajo previo), proporcionando al mismo un número suficientemente grande de fotografías de cada persona para que el sistema aprenda a clasificarlas
En todos los casos, todos los sistemas de clasificación/reconocimiento no son perfectos, y el resultado suele ser en forma de probabilidades. La fiabilidad del sistema dependerá de la imagen a clasificar, el 'entrenamiento' del sistema para la construcción del modelo, y los criterios que utilice la app para aceptar un resultado como válido a partir de una probabilidad
 
Creo que no existe nada 'facil' y ya hecho para reconocimiento facial en B4A

Lo que sí podrás encontrar son ejemplos de detección de rostros (face-detection), que sólo es una parte del proceso.
Si buscas 'face-recognition', verás que hay un problema de semántica, pues muchos de los posts se refieren solamente a la detección, y no a la comparación de los rostros respecto a otros guardados.

Las direcciones que podrías tomar (no las he explorado):
  • Utilizar un servicio online para el proceso, que pueda ser atacado mediante algina API con HTTP. No suelen ser gratis, pero depende del uso que le quieras dar podría simplificar las cosas.
  • Con OpenCV. Hay unos módulos dedicados a la extracción de landmarks faciales, a partir de los cuales se podría (de hecho hay algún proyecto por internet) hacer un sistema de clasificación de caras. El problema es que estos módulos no forman parte de la distribución 'oficial' de OpenCV (son unos módulos opcionales dentro de un grupo llamado contrib), y mi librería de OpenCV para B4A sólo expone los módulos estándar.
  • Tensorflow o otros modelos de DNN: Teóricamente es posible clasificar las caras 'candidatas' entrenando un modelo con varias imágenes de cada cara. Existe una implementación de TensorflowLite para Android de @moster67. La parte 'difícil' es que se debe construir el modelo (normalmente en un PC, como trabajo previo), proporcionando al mismo un número suficientemente grande de fotografías de cada persona para que el sistema aprenda a clasificarlas
En todos los casos, todos los sistemas de clasificación/reconocimiento no son perfectos, y el resultado suele ser en forma de probabilidades. La fiabilidad del sistema dependerá de la imagen a clasificar, el 'entrenamiento' del sistema para la construcción del modelo, y los criterios que utilice la app para aceptar un resultado como válido a partir de una probabilidad

Saludos, muchas gracias por tu excelente respuesta. Voy a investigar y seguir tu recomendación.

Que librería me recomiendas para que ÚNICAMENTE tome la foto del usuario. No comparar imágenes. Que la app solo tome la foto de forma automática cuando esta mirando la cámara (como algunas que pone un cuadrito alrededor de la cara) Hay algún ejemplo fácil en OpenCV...?

Donde consigo documentación sobre tu librería OpenCV?

Gracias
 
Creo que no existe nada 'facil' y ya hecho para reconocimiento facial en B4A

Lo que sí podrás encontrar son ejemplos de detección de rostros (face-detection), que sólo es una parte del proceso.
Si buscas 'face-recognition', verás que hay un problema de semántica, pues muchos de los posts se refieren solamente a la detección, y no a la comparación de los rostros respecto a otros guardados.

Las direcciones que podrías tomar (no las he explorado):
  • Utilizar un servicio online para el proceso, que pueda ser atacado mediante algina API con HTTP. No suelen ser gratis, pero depende del uso que le quieras dar podría simplificar las cosas.
  • Con OpenCV. Hay unos módulos dedicados a la extracción de landmarks faciales, a partir de los cuales se podría (de hecho hay algún proyecto por internet) hacer un sistema de clasificación de caras. El problema es que estos módulos no forman parte de la distribución 'oficial' de OpenCV (son unos módulos opcionales dentro de un grupo llamado contrib), y mi librería de OpenCV para B4A sólo expone los módulos estándar.
  • Tensorflow o otros modelos de DNN: Teóricamente es posible clasificar las caras 'candidatas' entrenando un modelo con varias imágenes de cada cara. Existe una implementación de TensorflowLite para Android de @moster67. La parte 'difícil' es que se debe construir el modelo (normalmente en un PC, como trabajo previo), proporcionando al mismo un número suficientemente grande de fotografías de cada persona para que el sistema aprenda a clasificarlas
En todos los casos, todos los sistemas de clasificación/reconocimiento no son perfectos, y el resultado suele ser en forma de probabilidades. La fiabilidad del sistema dependerá de la imagen a clasificar, el 'entrenamiento' del sistema para la construcción del modelo, y los criterios que utilice la app para aceptar un resultado como válido a partir de una probabilidad

Vi tu ejemplo de FaceDetector y funciona muy bien, pero solo te quiero preguntar, en ese ejemplo, como captura la imagen...?

Gracias
 

JordiCP

Expert
Licensed User
Longtime User
En el ejemplo no se está capturando la imagen ya que el propósito del mismo era demostrar cómo hacer el procesado en tiempo real (o casi).

Si quieres que se tome una instantánea en el momento en que el detector detecte al menos una cara, añade este código en el 'frameprocessor_newFrame', después de la línea Dim facesArray() As OCVRect = faces.toArray

(no probado, puede haber errores)
B4X:
Public Sub frameprocessor_newFrame(myMat As OCVMat)

   `... (código existente)

    ' Check detected faces, if any.
    Dim facesArray() As OCVRect = faces.toArray
  
   ' ============= CÖDIGO A INSERTAR, DESPUES DE LA LINEA DE ARRIBA

    If facesArray.Length>0 Then
   
        Dim mUtils As OCVUtils
        Dim resBitmap As Bitmap
        Dim finalMat As OCVMat
       
        Dim soloLacara As Boolean = True        ' True: solo el rectangulo que contiene la cara detectada.    False: Toda la imagen
        If soloLacara Then
            finalMat = mRgba.submat( _        'This does NOT create a copy, but a reference to a region of interest
                facesArray(0).tl.y, _
                facesArray(0).br.y, _
                facesArray(0).tl.x, _
                facesArray(0).br.x)       
        Else
            finalMat = mRgba        ' Toda la imagen
        End If           
       
        resBitmap.InitializeMutable(finalMat.cols, finalMat.rows)
        mUtils.matToBitmap1(finalMat, resBitmap)   
       
        ' Aqui ya tienes el resultado en resBitmap.
        ' El preview seguiirá funcionando como si no se hubiera tomado la imagen.
        ' Se debería proveer un mecanismo tipo flag para que no se llame en cada preview, ya que bloquearia el sistema
    End If

   ' =================== FINAL DEL CÓDIGO A INSERTAR.

   '.... Aquí el resto del código que había

End Sub
 
En el ejemplo no se está capturando la imagen ya que el propósito del mismo era demostrar cómo hacer el procesado en tiempo real (o casi).

Si quieres que se tome una instantánea en el momento en que el detector detecte al menos una cara, añade este código en el 'frameprocessor_newFrame', después de la línea Dim facesArray() As OCVRect = faces.toArray

(no probado, puede haber errores)
B4X:
Public Sub frameprocessor_newFrame(myMat As OCVMat)

   `... (código existente)

    ' Check detected faces, if any.
    Dim facesArray() As OCVRect = faces.toArray
 
   ' ============= CÖDIGO A INSERTAR, DESPUES DE LA LINEA DE ARRIBA

    If facesArray.Length>0 Then
  
        Dim mUtils As OCVUtils
        Dim resBitmap As Bitmap
        Dim finalMat As OCVMat
      
        Dim soloLacara As Boolean = True        ' True: solo el rectangulo que contiene la cara detectada.    False: Toda la imagen
        If soloLacara Then
            finalMat = mRgba.submat( _        'This does NOT create a copy, but a reference to a region of interest
                facesArray(0).tl.y, _
                facesArray(0).br.y, _
                facesArray(0).tl.x, _
                facesArray(0).br.x)      
        Else
            finalMat = mRgba        ' Toda la imagen
        End If          
      
        resBitmap.InitializeMutable(finalMat.cols, finalMat.rows)
        mUtils.matToBitmap1(finalMat, resBitmap)  
      
        ' Aqui ya tienes el resultado en resBitmap.
        ' El preview seguiirá funcionando como si no se hubiera tomado la imagen.
        ' Se debería proveer un mecanismo tipo flag para que no se llame en cada preview, ya que bloquearia el sistema
    End If

   ' =================== FINAL DEL CÓDIGO A INSERTAR.

   '.... Aquí el resto del código que había

End Sub

UN millón de gracias por tu ayuda. Voy a probar y luego te comento.
Una sola mas: hay un url de documentación de la librería...? para conocer todos las probabilidades que ofrece..

Gracias
 

JordiCP

Expert
Licensed User
Longtime User
Una sola mas: hay un url de documentación de la librería...? para conocer todos las probabilidades que ofrece..
OpenCV se compone de decenas de módulos, cada uno con muchas clases y cada una de ellas con muchos métodos. En total hay mas de mil.
Ya que me era imposible generar documentación para cada método en B4A, la librería está hecha de manera que cada uno de los métodos (siempre que es posible) tiene el mismo nombre que en la librería OpenCV Java, y los packages también, con la única diferencia que empiezan con el prefijo "OCV"

En este Link están documentados todos los packages, clases y métodos de la versión 3.4.1 de OpenCV en Java.
https://docs.opencv.org/3.4.1/javadoc/index.html

Esta documentación es la documentación general de OpenCV Java. Esto quiere decir que incluye más cosas que las que verás en la distribución para Android.
  • Packages non-free. No están incluídos en la distribución oficial. Normalmente requieren algún tipo de licencia.
  • Packages contrib. Tampoco están incluidos en la distribución oficial. Suele ser de ramas 'experimentales' o que por alguna otra razón no están incluidas en la distr. oficial.
  • Packages que dependen de la plataforma o de capacidades hardware de la misma: por ejemplo, el módulo 'highgui' no está incluido en Android, y sí para distribuciones sobre Windows, por ejemplo.
  • Packages comunes: están todos en la distribución de Android. Los más importantes, son 'Core' y 'imgProc '. Seleccionándolos, verás que aparecen la mayoría de las clases utilizadas en los ejemplos.
  • (*) Hay un package incluído en la librería para B4A Android y que no está en la documentación, que es el package 'Android'. La clase más relevante del mismo es JavaCameraView. En este caso concreto, se puede deducir el funcionamiento a partir de los ejemplos.:)


La mejor manera de aprender es intentar seguir los ejemplos en B4A, o de alguna otra plataforma con la que te sientas cómodo (Java, Python, C/C++), asegurándote que los mismos utilicen módulos que estén incluídos en la distribución de Android.
 
OpenCV se compone de decenas de módulos, cada uno con muchas clases y cada una de ellas con muchos métodos. En total hay mas de mil.
Ya que me era imposible generar documentación para cada método en B4A, la librería está hecha de manera que cada uno de los métodos (siempre que es posible) tiene el mismo nombre que en la librería OpenCV Java, y los packages también, con la única diferencia que empiezan con el prefijo "OCV"

En este Link están documentados todos los packages, clases y métodos de la versión 3.4.1 de OpenCV en Java.
https://docs.opencv.org/3.4.1/javadoc/index.html

Esta documentación es la documentación general de OpenCV Java. Esto quiere decir que incluye más cosas que las que verás en la distribución para Android.
  • Packages non-free. No están incluídos en la distribución oficial. Normalmente requieren algún tipo de licencia.
  • Packages contrib. Tampoco están incluidos en la distribución oficial. Suele ser de ramas 'experimentales' o que por alguna otra razón no están incluidas en la distr. oficial.
  • Packages que dependen de la plataforma o de capacidades hardware de la misma: por ejemplo, el módulo 'highgui' no está incluido en Android, y sí para distribuciones sobre Windows, por ejemplo.
  • Packages comunes: están todos en la distribución de Android. Los más importantes, son 'Core' y 'imgProc '. Seleccionándolos, verás que aparecen la mayoría de las clases utilizadas en los ejemplos.
  • (*) Hay un package incluído en la librería para B4A Android y que no está en la documentación, que es el package 'Android'. La clase más relevante del mismo es JavaCameraView. En este caso concreto, se puede deducir el funcionamiento a partir de los ejemplos.:)


La mejor manera de aprender es intentar seguir los ejemplos en B4A, o de alguna otra plataforma con la que te sientas cómodo (Java, Python, C/C++), asegurándote que los mismos utilicen módulos que estén incluídos en la distribución de Android.

Gracias, gracias un millón de gracias.
 

Ingeniero Cognitivo

Active Member
Creo que no existe nada 'facil' y ya hecho para reconocimiento facial en B4A

Lo que sí podrás encontrar son ejemplos de detección de rostros (face-detection), que sólo es una parte del proceso.
Si buscas 'face-recognition', verás que hay un problema de semántica, pues muchos de los posts se refieren solamente a la detección, y no a la comparación de los rostros respecto a otros guardados.

Las direcciones que podrías tomar (no las he explorado):
  • Utilizar un servicio online para el proceso, que pueda ser atacado mediante algina API con HTTP. No suelen ser gratis, pero depende del uso que le quieras dar podría simplificar las cosas.
  • Con OpenCV. Hay unos módulos dedicados a la extracción de landmarks faciales, a partir de los cuales se podría (de hecho hay algún proyecto por internet) hacer un sistema de clasificación de caras. El problema es que estos módulos no forman parte de la distribución 'oficial' de OpenCV (son unos módulos opcionales dentro de un grupo llamado contrib), y mi librería de OpenCV para B4A sólo expone los módulos estándar.
  • Tensorflow o otros modelos de DNN: Teóricamente es posible clasificar las caras 'candidatas' entrenando un modelo con varias imágenes de cada cara. Existe una implementación de TensorflowLite para Android de @moster67. La parte 'difícil' es que se debe construir el modelo (normalmente en un PC, como trabajo previo), proporcionando al mismo un número suficientemente grande de fotografías de cada persona para que el sistema aprenda a clasificarlas
En todos los casos, todos los sistemas de clasificación/reconocimiento no son perfectos, y el resultado suele ser en forma de probabilidades. La fiabilidad del sistema dependerá de la imagen a clasificar, el 'entrenamiento' del sistema para la construcción del modelo, y los criterios que utilice la app para aceptar un resultado como válido a partir de una probabilidad
Los sistemas de reconocimiento facial que he visto yo, son casi perfectos.
 

Situ LLC

Active Member
Licensed User
Saludos y buenas tardes. Alguien que por favor me ayude a conseguir la forma de hacer reconocimiento facial en B4A...

He eintentabndo con este (https://www.b4x.com/android/forum/t...using-google-mobile-vision-api.66469/#content) pero no funciona, me da full errores.

Quiero algo mas simple o mas explicado para poder probar.

Quiero tomar una foto guardarla y compararla luego con otra y saber si so la misma persona, o algo asi.

Muchas gracias.

Estimado Ocando

Mira yo tengo uns aplicacion y trabaja muy bien , de echo la uso con Azure, abres una cuenta con ellos y luego te dan un llaves de acceso, la utilizas, el costo en relidad es muy bajo.

Te explico hay 2 eventos registrar la foto y veriifacion cada acceso cuenta y te dan 1000 accesos por centavos de dolar. Ademas la verificacion tambien cuenta y eso es importante pues yo pague por 1230 accesos 45 centavos de dolar.

Se usatambien la libreria de camara B4A y tomas la foto y la envias al algoritmo de Azure te devuleve una numero que siempre sera el mismo y esto lo guardas en una tabla en un base de datos , luego le pones un mombre del cliente de la foto . Luego cuando verificas desde una table, o movil tomas la foto y este te retona una el mismo numero(sie es la misma cara ovio ) y lo comparas con lo que habias guardado en la registracion y listo ya lo tienes. Yo tomo la foto , la proceso y la bajo a baja resolucion cerca de 54 k luego la subo en menos de un segundo me la procesa me da el resultado en un Azure_ID que es algo asi ca4d7b1a-f97a-49a3-83d2-f94f247aef29.

Si la foto que envias no existe(No ha sido registrada.. ) te devuelve un error, asi que este api es exelente.

Es sumamente seguro y rapido.

Yo la tengo un server y ahi hace accesos desde cualquier movil o tablet lo proceso en un .jar en b4J , ademas tambien acceso las tablas y grabo y verifico usando jRDC2 que es un rayo, claro lo puedes hacer desde mysql , inclusive desde el mismo movil con sqllite pero tendrias que mover las base de datos, por eso mejor tener los registros en un server mysql externo asi esta disponibles siempre

Yo tome lo servicios al Sr Enrique muy buen programador y me enzeño hacer las cosas , lo mas dicifil en realidad es utilizar una serie de procedimiento para la coneccion el resto es pan comido es una maravilla.

Yo solo no podria hacerlo porque si te lo digo.. anduve dando tumbos y con el resolvio .

Echale un email a enrique@prodig.io


Video de deteccion facil B4A.

Ver archivo adjunto
Abajo te muestro como te devulve el Azure_Id ya procesada la foto y es lo que guardas y luego comparas.
Muy rapido y seguro
 
Last edited:
Top