Translation into Spanish of an interesting article by Peter Warden, CTO of Jetpac Inc, author of “The Public Data Handbook” and “The Big Data Glossary for O’Reilly”, builder of “Open Heat Map”, the “Data Science Toolkit”, and other interesting open source projects.
A free translation by Chema, a Spain-based translator specializing in English to Spanish translations
An original text written by Peter Warden, originally published in
https://petewarden.com/2022/02/21/non-max-suppressions-how-do-they-work/
* * *
Llevo casi una década trabajando con redes neuronales para realizar procesos de reconocimiento de imágenes, pero debo admitir que nunca entendí bien cómo se generan algunas cosas, como por ejemplo los cuadros delimitadores. No tenía una buena imagen mental de cómo funcionaba todo, y las funciones de referencia siempre me parecieron bastante intimidantes. En muchos casos esto no importa, el proceso de conversión lo manejan las capas internas dentro de un modelo y el desarrollador de la aplicación no necesita preocuparse por lo que sucede debajo del capó. Sin embargo, recientemente he empezado a trabajar con algunas redes que esperan que la conversión se maneje externamente, por lo que he tenido que escribir código desde cero para realizar la traducción.
Esto me ha obligado a entender los detalles, y para asegurarme de tener una buena comprensión y tener algo a lo que referirme en el futuro, he decidido redactar esta publicación y crear un Python Colab demostrándolo todo, paso a paso. Estoy usando un modelo de ejemplo del increíble framework MediaPipe (que maneja toda la conversión por sí mismo, si está en una plataforma que lo admite), y he escrito un código de referencia para explicar el flujo de trabajo para pasar de tensores sin procesar a un conjunto limpio de cuadros delimitadores. En particular, siento que finalmente entendí la “supresión no máxima (NMS)”, que resultó ser mucho menos intimidante de lo que temía.
Recomiendo trabajar a través de Colab para lograr una mejor comprensión, pero el resumen es que la mayoría de las redes neuronales diseñadas para producir cuadros delimitadores usan una cuadrícula de puntos límite en la imagen como base. Cada punto de anclaje está asociado a un valor , junto con las compensaciones x e y, el ancho, la altura y cualquier otra coordenada característica (como las posiciones de la nariz o los ojos). Todas estas coordenadas se dan en relación con puntos límite normalizados entre 0,0 y 1,0, donde 1,0 es el tamaño de la imagen. Hay una puntuación y un conjunto de coordenadas para cada punto límite, por lo que en el caso del modelo de cara que estoy usando en el cuaderno, hay 48 columnas y 48 filas de anclas, separadas por 4 píxeles en una imagen de 192 × 192, lo que supone 2.304 inputs.
Hay dos resultados posibles para el modelo, el primero en formato (1, 2304, 16), con 8 pares de coordenadas (x, y) para cada punto límite; el segundo en formato (1, 2304, 1), con la puntuación de cada punto límite. Para este modelo, los primeros dos pares de coordenadas son el origen del cuadro delimitador y su ancho y alto. Los otros seis son las posiciones de puntos de referencia faciales como la boca o la nariz. La primera etapa de la decodificación es convertirlos de posiciones relativas en coordenadas absolutas agregando los orígenes de anclaje correspondientes. Esto genera diversas ventanas o cuadros delimitadores solapados, cada uno asociado con una puntuación.
El próximo desafío es reducir este conjunto de cuadros superpuestos a uno solo para cada detección de objetos reales. Ahí es donde entra en juego el algoritmo de supresión no máxima.
El paso inicial es clasificar primero los cuadros con las puntuaciones más altas. Después de eso, encontramos todos los cuadros que se solapan significativamente y los fusionamos. Los métodos exactos que usamos para determinar si la superposición es significativa se pueden ver en la función overlap_similarity().
El proceso de fusión implica simplemente tomar el cuadro con la puntuación más alta de un conjunto superpuesto (unweighted_non_max_suppression()
o promediar todos los cuadros y características en un conjunto, ponderado por su puntuación (weighted_non_max_suppression()
. Y así es como funciona la supresión no máxima.