Detección de caras
Detección de caras
Algoritmo de detección de objetos
Hoy en día la detección y reconocimiento de caras en imágenes es una parte fundamental dentro del procesado de imagen y los sistemas de visión por ordenador. De hecho, hace ya años que las cámaras fotográficas y web suelen traer algoritmos para reconocimiento de caras.
En general, la detección de objetos se basa en la detección de una serie de características que identifiquen a los objetos a detectar (bordes, color, etc.) con el menor error posible. En el caso concreto de la detección de caras, el problema es que no presentan unas características tan uniformes (diferencia de color e iluminación, presencia de gafas, barba, bigote, etc.) como otro tipo de objetos (una puerta, por ejemplo). Esto dificulta el poder encontrar un modelado estadístico sencillo que identifique una cara.
Una de las técnicas típicas de detección de objetos está basada en los algoritmos propuestos por Paul Viola y Michael Jones en 2001, mejorados posteriormente por Rainer Lienhart en 2002. Estos algoritmos se basan en la extracción de características parecidas a las Integrales de Haar. Estas integrales consisten en, considerar regiones rectangulares adyacentes (como las de la imagen) en una ventana de detección, y sumar la intensidad de los píxeles en cada región, calculando despues la diferencia entre estas sumas. Esta suma permite clasificar distintas secciones de la imagen.
Por poner un ejemplo, si imaginamos que estamos tratando de detectar donde están los ojos en una cara, una característica es que los ojos son más oscuros que las mejillas. En ese caso, se podría aplicar una región rectangular como la mostrada para detectar ojos. Así pues, una característica de Haar (o Haar-like features) común para la detección de caras es un conjunto de dos rectángulos adjacentes, uno debajo de otro, que coincidirán con la región de los ojos y mejillas. De esta forma se definen una serie de características que permiten detectar de una forma rápida y con una gran probabilidad de acierto lo que es y lo que no es una cara.

Una vez comentadas las características de Haar, el algoritmo de detección en sí tiene dos etapas. Primero una etapa de entrenamiento, en la que a una serie de filtros en cascada se les pasan unos patrones positivos (que coinciden con el objeto buscado) y negativos (no tienen el objeto) de forma que el sistema aprenda y se forme un modelo de las características de Haar del objeto a detectar. Cada una de estas características por separado (llamadas características débiles) no es suficiente para determinar si la imagen presentada corresponde o no con el objeto buscado. Pero una cascada de todas las características que debe cumplir el objeto (hay indicios de detección de ojos, indicios de detección de boca, indicios de detección de nariz) sí son suficientes para poder discernir si la imagen corresponde o no con el objeto buscado.
La ventaja de este tipo de detectores es que las características de Haar son rápidas de calcular, y solo se calculan todas las características en el caso de que la región de la imagen en cuestión pase todos los clasificadores débiles. En el momento en que la imagen no pasa el umbral de uno de los clasificadores débiles se descarta, ahorrándose el cálculo del resto de clasificadores.
Detección de caras con OpenCV
Una vez se ha explicado brevemente como funciona la detección de caras basada en características de Haar, se explicará la clase que ofrece OpenCV para detección de caras, que es la clase cv::CascadeClassifier. La clase CascadeClassifier tiene dos funciones principales que son las que permiten cargar las características de Haar del objeto a detectar, y otra para detectar propiamente dicha. Concretamente, la función que permite cargar las características de Haar es la función load, que necesita como parámetro de entrada el fichero xml que contiene la información generada en un entrenamiento previo. Por suerte, OpenCV viene ya con unos ficheros entrenados con miles de patrones para detección de caras, manos, ojos, personas, etc, con lo que no hace falta realizar un entrenamiento, sino tan solo usar los ficheros que ya trae OpenCV. Una vez cargado este fichero, lo siguiente es detectar en una imagen las caras que haya, para lo cual se usa la función detectMultiScale. Esta función necesita como parámetros de entrada la imagen en la que se van a buscar las caras, una variable en la que se almacenaran la lista de caras detectadas, el tamaño al que se escalará la imagen, el número de vecinos que debe tener cada rectángulo de las características de Haar para tenerlo en consideración, un parámetro que no se usa en la versión actual de detectMultiScale y el tamaño mínimo posible de las caras a detectar.