Histograma de Gradientes Orientados (HOG) en Dlib
El histograma de gradientes orientados (HOG) es un descriptor de características utilizado en visión por computadora y procesamiento de imágenes con el propósito de detectar objetos. La idea detrás de HOG es extraer características en un vector, y alimentarlo en un algoritmo de clasificación como una Máquina de Vectores de Soporte que evaluará si una cara (o cualquier objeto que se entrene para reconocer en realidad) está presente en una región o no. En el descriptor de entidad HOG, la distribución ( histogramas ) de direcciones de gradientes ( gradientes orientados ) se utilizan como entidades. Los degradados ( derivados x e y ) de una imagen son útiles porque la magnitud de los degradados es grande alrededor de bordes y esquinas (regiones de cambios bruscos de intensidad ) y sabemos que los bordes y esquinas contienen mucha más información sobre la forma del objeto que las regiones planas.
En el artículo original, el proceso se implementó para la detección del cuerpo humano, y la cadena de detección fue la siguiente :

la Detección de una cara a partir de una imagen usando HOG método requiere los siguientes pasos a seguir :-
- Calcular el Gradiente de Imágenes
- Calcular el HOG
- Bloque de normalización
- Alimentación del vector en SVM
Calcular el Gradiente de las Imágenes: El primer paso es calcular los degradados horizontales y verticales de la imagen, filtrando la imagen con los siguientes núcleos :

Aquí las imágenes de entrada deben ser del mismo tamaño y tener una relación de aspecto fija como 64×128, 100×200 o 128×256, pero no 101×205.


La imagen degradada eliminó una gran cantidad de información no esencial (por ejemplo, fondo de color constante), pero resaltó los contornos. Aún podemos identificar la imagen. En cada píxel, el gradiente tiene una magnitud y una dirección.
Calcular el CERDO: La imagen se divide en celdas de 8×8 para ofrecer una representación compacta y hacer que nuestro CERDO sea más resistente al ruido. Luego, calculamos un CERDO para cada una de esas células.

Para estimar la dirección de un gradiente dentro de una región, simplemente construimos un histograma entre los 64 valores de las direcciones del gradiente (8×8) y su magnitud (otros 64 valores) dentro de cada región. El siguiente paso es crear un histograma de degradados en estas celdas de 8×8. El histograma contiene 9 contenedores correspondientes a ángulos 0, 20 , 40 1 160.
Cuando construimos el CERDO, entonces surgirán 3 casos:
- qué pasa si el ángulo es menor que 160° y no a medio camino entre 2 clases. Luego, en tales casos, el ángulo se agregará en la categoría correcta del CERDO.
- qué pasa si el ángulo es menor de 160° y exactamente entre 2 clases. Luego, en tales casos, consideramos una contribución igual a las 2 clases más cercanas y dividimos la magnitud en 2
- y si el ángulo es mayor de 160°. Entonces, en tales casos, consideramos que el píxel contribuyó proporcionalmente a 160° y a 0°.

En la fig. 10 el píxel rodeado en azul tiene un ángulo (dirección ) de 80 grados y una magnitud de 2. Por lo tanto, agrega 2 a la 5ta bandeja a medida que sigue al primer caso. El gradiente en el píxel rodeado con rojo tiene un ángulo de 10 grados y una magnitud de 4. Dado que 10 grados está a mitad de camino entre 0 y 20, el voto por píxel se divide uniformemente en los dos contenedores a medida que sigue al segundo caso.

En la fig. 11 el píxel con ángulo de 165 grados contribuye proporcionalmente a la bandeja de 0 grados y a la de 160 grados, como sigue al tercer caso.
El CERDO se ve así para cada celda de 8×8 as (fig. 12).

Bloque de normalización : por último, un bloque de 16×16 puede ser aplicado con el fin de normalizar la imagen y hacer que sea invariante a la iluminación. La aplicación de bloques de 16×16 significa que estamos oscureciendo la imagen dividiendo todos los valores de píxeles por 2, por lo que la magnitud del gradiente cambiará a la mitad y, por lo tanto, los valores del histograma cambiarán a la mitad. Idealmente, queremos que nuestro descriptor sea independiente de las variaciones de iluminación.
Alimentar el vector en SVM: Un bloque de 16×16 tiene 4 histogramas que se pueden concatenar para formar un vector de elemento de 36 x 1. Finalmente, todos los vectores de 36×1 se concatenan en un vector grande que será nuestro vector de características, en el que podemos entrenar un SVM suave y predecir la cara en una imagen.
En Dlib está presente un modelo entrenado para detectar caras, solo tiene que crear un objeto de ese modelo.
Así que eso es el fin de predecir caras usando HOG usando Dlib.
CONCLUSIÓN
Siempre hay un gran debate que es mejor en la detección de caras clasificador en cascada Haar o detector de caras basado en CERDOS. Dlib está por delante del clasificador en cascada Haar en cuanto a implementación, velocidad y precisión. Hay varios beneficios al usar el clasificador de CERDOS. En primer lugar, el entrenamiento se realiza utilizando una sub-ventana deslizante en la imagen, por lo que no se requiere submuestreo ni manipulación de parámetros como en el clasificador Haar. Esto hace que la detección facial HOG + SVM de Dlib sea más fácil de usar y más rápida de entrenar. Tenga en cuenta que HOG tiene una mayor precisión para la detección de rostros que el clasificador en cascada Haar. El clasificador en cascada Haar hace más predicciones de falsos positivos en caras que el detector de caras basado en CERDOS.
Si desea ver la precisión del clasificador en cascada de Haar frente al detector facial basado en CERDOS, puede leer aquí.