miércoles, diciembre 14, 2005

Detección de rostros en imágenes de color

Desde mi tesis empecé a trabajar en un algoritmo para detectar rostros en imágenes a color. Como parte de la tesis alcancé a desarrollar algo bastante bueno pero todavía le hacían falta bastantes mejoras.

El algoritmo funciona a grandes rasgos así:

Se separa la imagen en tres canales utilizando la teoría de colores oponentes de Hering.
Se descarta el canal blanco - negro por no contener información relevante a nuestros objetivos.

Primero se filtra mediante umbralización el canal azul - amarillo con unos umbrales hallados por experimentación. Al resultado de esto se le extrae el canal rojo - verde y se le aplican otros umbrales diferentes, resultantes de un proceso de experimentación similar.

Como resultado obtenemos los pixeles que tienen color piel o similares (con los umbrales adecuados resultó ser efectivo para todas las razas y pigmentaciones de piel). El siguiente proceso consiste en hacer, luego de eliminación de ruido y suavización de imagen, un algoritmo de segmentación adecuado. En mi caso use una versión modificada por mi mismo del algoritmo de crecimiento de regiones. La definición original de este fue ampliada con el concepto de búsqueda en amplitud de la inteligencia artificial, para hacerlo muchisimo más eficiente en memoria y procesamiento.

El listado de regiones resultante es filtrado: se eliminan las regiones blancas (eliminadas durante la umbralización) y las de dimensiones menores (con un threshold ajustable). Las demás regiones son revisadas para saber si se ajustan a las proporciones de los rostros (1.4:1 aproximadamente) dando cierto margen previniendo oclusiones parciales del rostro. Las que se ajustan son consideradas candidatos a rostros.

Dentro de estas últimas se buscan regiones mas pequeñas filtradas como blancos correspondientes a ojos, cejas y/o boca y las que las posean son marcadas como rostros.

Este algoritmo fue implementado de tal forma que hace todo el proceamiento en sólo tres pasadas sobre la imagen lo cual lo hace bastante eficiente. El grado de confiabilidad está dado por:

  • Porcentaje de falsos positivos (objetos detectados como rostros sin serlo): 1/250

  • Porcentaje de falsos negativos(Rostros no detectados): 1/500


El algoritmo está implementado en C++ y Delphi, pero es facilmente portable a cualquier lenguaje imperativo.

Ahora quiero reducir los falsos positivos a un nivel que permita hacerlo implementable y comercializable, aspiraría a llegar a algo asi como 1/1000 por lo menos.

Si tienes dudas, preguntas, comentarios o sugerencias sobre este tema no dudes en hacermelas llegar, bien por los comentarios o en la cajita "quéjese y no se déjese" de la izquierda.

4 comentarios:

Unknown dijo...

No soy el unico que sabe programar Delphi :)

Néstor dijo...

Camilo, no tenia nadita en español para publicar??? eso en que esta escrito ¿arameo antiguo??

jajajaja

Laureano Remedi dijo...

Hola, encontre esto buscando tema para mi tesis de Ing. Quisiera saber si tienes libros para pasarme o aconsejarme, veo q este articulo esta llegando a los 4 años casi, espero me respondas. Saludos.

Cristian Andres dijo...

Estoy desarrollando mi tesis en un trabajo sobre retencion de rostros, me gustaria que me colaborara con documentos de apoyo, mi correo es cristian.1700512158@ucaldas.edu.co