¿Qué es un histograma de gradientes orientados (HOG)?
El HOG es un método de descriptor global (extracción de características) que se aplica a cada píxel dentro de una imagen para extraer información de vecindad (vecindad de píxel) como textura y comprimir/abstraer esa información de una imagen determinada en una forma vectorial reducida/condensada llamada vector de características. eso 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 o detección de objetos.
1- Calcula la imagen del degradado
Para extraer y capturar información de borde, 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 brusco de intensidad).
Aplicamos este kernel en píxeles de la imagen por convolución:
Después de aplicar Sobel Kernel a la imagen, podemos calcular la magnitud y orientación de una imagen:
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 la ubicación donde se calcula el gradiente. En otras palabras, la longitud y dirección del vector.
2- Calcular 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 efectiva.
Creamos un histograma de gradientes en estas celdas (8 x 8), que tienen 64 valores distribuidos en contenedores en el histograma, que se cuantifican en 9 contenedores cada uno de 20 grados (que abarcan de 0° a 180°). El valor de magnitud de cada píxel (fuerza del borde) se agrega como un “voto” al contenedor de orientación correspondiente para que los picos del histograma revelen las orientaciones dominantes del píxel.
3- Normalización
Dado que las magnitudes de los gradientes dependen de las condiciones de iluminación, la normalización escala los histogramas para reducir la influencia de las variaciones de iluminación y contraste.
Cada bloque normalmente 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)
Como puede ver, HOG captura eficazmente 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 detectMultiScale de HOG para detectar personas, con winStride configurado para omitir un píxel por paso, mejorando la velocidad al sacrificar un poco de precisión, lo cual es crucial en la detección de objetos, ya que es un proceso computacional intensivo. Aunque el detector puede identificar a todas las personas, a veces hay un falso positivo en el que se detecta parte del cuerpo de una persona como otra persona. Para solucionar este problema, podemos aplicar la supresión no máxima (NMS) para eliminar los cuadros delimitadores superpuestos, aunque una mala configuración (preparación para el invierno, relleno, escala) ocasionalmente puede no detectar objetos.
resumen –up El cálculo del descriptor HOG implica varios pasos:
1. Cálculo del gradiente
2. Agrupación de orientación
3. Bloques de descriptores
4. Normalizació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 post!
- L. Daudet, B. Izrar y R. Motreff, Histogramas de gradientes orientados para la detección humana(2010), ciencia abierta HAL.
- Satya Mallick, Reconocimiento de imágenes y detección de objetos: Parte 1,2016, aprenda OpenCV.
- Satya Mallick, Histograma de gradientes orientados explicado usando OpenCV 2016, aprende OpenCV