¡Hola Pythonista! Soy Darío Guzmán, co-organizador de Python Barranquilla y en esta ocasión quiero contarte acerca de la charla realizada por el Ing. Edgar Flórez CEO de la empresa Ebenezer Technologies, especializada en el desarrollo de productos que optimizan el funcionamiento y control de establecimientos, vías y productos a través de visión por computadora, inteligencia artificial e internet de las cosas.

En este artículo tendrás la oportunidad de aprender cuales son los conceptos necesarios para detectar y reconocer rostros con una microcomputadora.

¿Que veremos hoy?

  • ¿Que es una microcomputadora?
  • ¿Cómo detectar un rostro?
  • ¿Cómo reconocer un rostro?

¿Que es una microcomputadora?

Imagen de raspberry pi

Una microcomputadora es un computador pequeño muy parecido a tu teléfono móvil o tablet, en aspectos técnicos tiene un procesador, una memoria ram y diferentes accesorios dependiendo de la microcomputadora que estés usando, como por ejemplo un módulo para wi-fi o un módulo de almacenamiento interno.

¿Por qué y cuándo usar una microcomputadora?

Debido a su reducido tamaño y poder son ideales para usarlas en proyectos donde no se cuente con mucho espacio como por ejemplo crear un centro multimedia para reproducir tus vídeos, música e imágenes y verlas desde tus dispositivos (¡Cómo Netflix, y Spotify juntos pero en tu casa!) Aquí te dejo 13 ideas realizadas con Raspberry Pi.

Modelos de microcomputadoras

En el mercado hay disponibles diferentes opciones que nos brindan prestaciones para varios tipos de proyectos, entre los modelos más conocidos se encuentran la Raspberry Pi y las odroid (esta última fue la usada en la charla).

¿Cómo detectar un rostro?

Ejemplo de Haar cascade

Primero hay que diferenciar el detectar un rostro de reconocerlo, en la detección se busca identificar si en una imagen existe o no un rostro, mientras que en el reconocimiento lo que se intenta es identificar la identidad de una persona en específico.

Por ahora debes saber que para detectar un rostro se usa el método haar cascade el cual consiste en repasar la imagen buscando un grupo de características o (features) en dicha imagen, no te preocupes si tienes alguna duda adelante lo explicaré más detallado.

¿Cómo interpreta las imágenes una computadora?

Pero antes de explicarte un poco más a fondo cómo funciona el método haar cascade me gustaría que entendieras la forma en la que una computadora "ve" lo que nosotros conocemos como imagen.

Seguramente en algún lado has escuchado que la resolución de las imágenes y videos se mide en píxeles, bueno para una computadora tus fotos de las vacaciones, cumpleaños, etc. Son solo eso píxeles, estos están organizados en un vector con un número de columnas y filas determinadas por su ancho y alto, por ejemplo una imagen full HD tiene una resolución de 1920 x 1080 píxeles, en este caso el vector que representa la imagen tendría 1920 columnas y 1080 filas.

Además para que las imágenes tengan color una computadora debe crear 3 vectores uno para cada canal de color RGB (Rojo, Verde y Azul) por lo que al final terminamos con un vector que contiene 3 vectores dentro cada uno con un canal de color.

Ahora que sabes cómo interpreta las máquinas una imagen, quiero que imagenes por un momento tener que hacer una operación (multiplicación, adición, etc.) de tres vectores de 1920 columnas y 1080 filas, esto 30 veces por segundo (recuerda que trabajamos con video en ¡tiempo real!).

Si se te explota la cabeza con solo pensarlo tranquilo es normal y es que para una computadora tampoco es tarea fácil, por este motivo vamos a cambiar el tamaño de la imagen a 320 x 240 y a reemplazar los tres canales RGB por escala de grises, así solo tendremos 1 vector de 320 columnas y 240 filas algo mucho más aceptable para la microcomputadora que estamos usando.

¿Cómo funciona el método haar cascade?

Como te explicaba antes lo que vamos a hacer es recorrer la imagen en busca de características, pero primero ¿A que me refiero con una característica?

Las características son los patrones que están presentes en el objeto que intentamos detectar, como por ejemplo la distancia que hay entre los ojos, nariz y boca, la cantidad de luz que ilumina la frente, etc.

Vale perfecto, pero... ¿cómo es que una computadora sabe cuales son las características que estamos buscando?

Aquí viene lo interesante, la computadora no lo sabe, nosotros como programadores debemos darle un modelo de características y entrenar este modelo con varias imágenes, entre las cuales algunas deben tener rostros y otras no, para enseñarle a la computadora lo que es un rostro y lo que no.

*Nota: Por simplicidad el modelo que se uso viene dado por opencv, pero es posible crear uno propio.

Una vez entrenado el modelo, podremos recorrer la imagen en busca de las características definidas en él.

Ejemplo de haar cascade

Video mostrando ejemplo de haar cascade

¿Notas como se vuelve un poco más lento cuando se acerca al rostro? eso es porque el algoritmo es muy eficiente y si no detecta ninguna de las características simplemente se mueve a otro lado.

¿Cómo reconocer un rostro?

Ejemplo de eigenfaces

Ahora eres capaz de detectar si en una imagen hay un rostro, ¿Pero y si quisieras ir más allá y saber a quién pertenece?

Para esto lo primero que debes hacer es etiquetar las imágenes de muestra que usaste para entrenar el modelo. Esto se hace para una vez detectado algún rostro lo puedas comparar con los demás y mostrar el nombre de la persona a la que se parece más.

ok, pero ¿Cómo comparo dos rostros?

Calma, ya podrás comparar dos rostros una vez entiendas que son los eigenfaces y los eigenvectors.

Eigenvectors y Eigenfaces

Los eigenvectors son vectores en los que se guardan las características de un rostro. Los eigenfaces por su parte son el conjunto de eigenvectors que hacen referencia al mismo rostro

Los conceptos anteriores son importantes, debido a que el cálculo para comparar rostro detectado con los de nuestra base de datos sigue siendo muy costoso para nuestra microcomputadora, por esto lo que haremos será extraer sus eigenvectors y luego agruparlos en eigenfaces.

Esto que te acabo de mencionar quiere decir 2 cosas, la primera es que cada rostro será convertido en un eigenface y la segunda es que no vamos a comparar los rostros en sí mismos, sino sus eigenfaces.

Comparando rostros

Para saber de quien es el rostro que detectaste, debes restar la distancia entre su eigenface con cada uno de los eigenfaces extraídos de los rostros en la base de datos.

La distancia entre los vectores predice la probabilidad de que dos rostros sean de la misma persona.

*Nota: Entre más corta sea la distancia entre dos eigenfaces hay más posibilidad de que se trate de la misma persona.

Para terminar solo debes tomar la etiqueta que pusiste al rostro en el entrenamiento y mostrarla en pantalla.

Espero hayas disfrutado leyendo este artículo, si tienes dudas u opiniones sobre el tema, estaré aquí abajo (en los comentarios) para ayudarte. No olvides compartir este artículo con tus amigos interesados en la programación.

Recuerda que puedes descargar el código de la charla desde el repositorio en github y así interactúes con el.

Agradedemos especialmente a Koombea en esta oportunidad por ayudarnos con el espacio para la charla.

Referencias

Si quieres profundizar un poco más en el tema, te dejo las fuentes en las que está basado este artículo.

  1. Detección de rostros con opencv.
  2. Reconocimiento de rostros con opencv.
  3. Eigenfaces y eigenvectors.