Histograma de gradientes orientados (HOG) en visión por computadora | de Mohamad Hamza | noviembre 2024

Histograma de gradientes orientados (HOG) en visión por computadora | de Mohamad Hamza | noviembre 2024

¿Qué es un histograma de gradientes orientados (HOG)?

HOG es un método de descriptor global (extracción de características) que se aplica a cada píxel de una imagen para extraer información de vecindad (vecindad de píxeles), como la textura, y comprimir/abstraer esta información de una imagen determinada en una forma de vector reducido/condensado llamado vector de características. Esto podría describir la característica de esta imagen que es muy útil cuando se trata de capturar estructuras de bordes y degradados en una imagen. Además, podemos comparar esta imagen procesada para el reconocimiento de objetos o la detección de objetos.

1- Calcula la imagen del degradado

Para extraer y capturar la información de los bordes, aplicamos un operador de Sobel que consta de dos pequeñas matrices (filtro/núcleo) que miden la diferencia de intensidad en escala de grises (dondequiera que haya un cambio abrupto de intensidad).

creado por el autor

Aplicamos este kernel a los píxeles de la imagen por convolución:

Arrastramos el Kerne/filtro 3×3 (operador Sobel) a la imagen, multiplicamos por elemento y sumamos las salidas. (Creado por el autor)

Después de aplicar el núcleo de Sobel a la imagen, ahora podemos calcular la magnitud y orientación de una imagen:

Magnitud del gradiente.(Creescrito por el autor)
Orientación del gradiente.(Creado por el autor)

Los gradientes determinan la fuerza (magnitud) y la dirección (orientación) de los bordes en un punto específico. La dirección del borde es perpendicular a la dirección del vector de gradiente en el lugar donde se calcula el gradiente. En otras palabras, la longitud y dirección del vector.

2- Calcula el histograma del gradiente

Para cada píxel, tenemos dos valores: magnitud y orientación. Para combinar esta información en algo significativo, utilizamos un histograma, que ayuda a organizar e interpretar estos valores de manera eficiente.

editado por el autor.

Creamos un histograma de gradientes en estas celdas (8 x 8), que tienen 64 valores distribuidos en cuadros en el histograma, que se cuantifican en 9 cuadros de 20 grados cada uno (que abarcan de 0° a 180°). El valor de amplitud de cada píxel (fuerza del borde) se agrega como un «voto» al contenedor de orientación correspondiente para que los picos en el histograma revelen las orientaciones dominantes del píxel.

3- Estandarización

Debido a que la magnitud de los gradientes depende de las condiciones de iluminación, la normalización escala los histogramas para reducir la influencia de las variaciones de iluminación y contraste.

editado por el autor.

Cada bloque generalmente consta de una cuadrícula de celdas (2×2). Este bloque se desliza por la imagen superpuesto, lo que significa que cada celda se incluye en varios bloques.
Cada bloque tiene 4 histogramas (4 celdas), que se pueden concatenar para formar un vector de 4 (celdas) x 9 (bins) x1 = vector de 36 x 1 elemento para cada bloque; imagen general en el ejemplo: 7 filas x 15 columnas = 7x15x36=3780 elementos. Este vector de características se llama Descriptor de cerdoy el vector resultante se utiliza como entrada para algoritmos de clasificación como SVM.

# we will be using the hog descriptor from skimage since it has visualization tools available for this example
import cv2
import matplotlib.pyplot as plt
from skimage import color, feature, exposure

# Load the image
img = cv2.imread('The path of the image ..')

# Convert the original image to RGB
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# Convert the original image to gray scale
img_gray = cv2.cvtColor(img_rgb,cv2.COLOR_RGB2GRAY)

plt.imshow(img_gray,cmap="gray")

# These are the usual main parameters to tune in the HOG algorithm.
(H,Himage) = feature.hog(img_gray, orientations=9, pixels_per_cell=(8,8), cells_per_block=(2,2),visualize=True)

Himage = exposure.rescale_intensity(Himage, out_range=(0,255))
Himage = Himage.astype("uint8")

fig = plt.figure(figsize=(15, 12), dpi=80)
plt.imshow(Himage)

Foto de Mona Lisa por (WikiImagenes ) https://pixabay.com/

Como puede ver, HOG captura efectivamente la forma general de la cara (ojos, nariz, cabeza) y las manos. Esto se debe al enfoque de HOG en la información de gradiente en la imagen, lo que lo hace muy efectivo para detectar líneas y formas. Además, podemos observar los gradientes dominantes y su intensidad en cada punto de la imagen.

(HOG) algoritmo para la detección humana en una imagen

HOG es un descriptor de características popular en visión por computadora, particularmente efectivo para detectar formas y contornos, como la forma humana. Este código aprovecha el descriptor HOG integrado de OpenCV y un modelo de máquina de vectores de soporte (SVM) previamente entrenado específicamente para detectar personas.

# Load the image
img = cv2.imread('The path of the image ..')

# Convert the original image to RGB
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# Convert the original image to gray scale
img_gray = cv2.cvtColor(img_rgb,cv2.COLOR_RGB2GRAY)

#Initialize the HOG descriptor and set the default SVM detector for people
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

# Detect people in the image using the HOG descriptor
bbox, weights = hog.detectMultiScale(img_gray ,winStride = (2,2), padding=(10,10),scale=1.02)

# Draw bounding boxes around detected people
for (x, y, w, h) in bbox:
cv2.rectangle(img_rgb, (x, y),
(x + w, y + h),
(255, 0, 0), 4)

plt.imshow(img_rgb)

Después de cargar la imagen de prueba, utilizamos el método detectorMultiScale de HOG para detectar personas, con winStride configurado para omitir un píxel por paso, mejorando la velocidad y sacrificando un poco de precisión, lo cual es crucial en la detección de objetos porque es un proceso computacional intensivo. . Aunque el detector puede identificar a todas las personas, en ocasiones una parte del cuerpo de una persona se detecta como otra persona. Para resolver este problema, podemos aplicar supresión no máxima (NMS) para eliminar los cuadros delimitadores superpuestos, aunque una mala configuración (invernada, relleno, escalado) a veces puede no detectar los objetos de los cuadros delimitadores.

resumen –up Calcular el descriptor HOG implica varios pasos:
1. Cálculo del gradiente
2. Clasificación de orientación
3. Bloques descriptores
4. Estandarización
5. Formación de vectores de características.
En este artículo, exploramos las matemáticas detrás de HOG y lo fácil que es aplicarlo en solo unas pocas líneas de código, ¡gracias a OpenCV! Espero que esta guía le haya resultado útil y haya disfrutado trabajando en los conceptos. ¡Gracias por leer y nos vemos en el próximo artículo!