Cómo implementar la detección de objetos personalizada con coincidencia de plantillas. ¡No se necesitan datos anotados!
En la actualidad, los algoritmos de detección de objetos de última generación (algoritmos destinados a detectar objetos en imágenes) utilizan redes neuronales como Yolov4.
La coincidencia de plantillas es una técnica en el procesamiento digital de imágenes para encontrar pequeñas partes de una imagen que coincida con una imagen de plantilla. Es una solución mucho más simple que una red neuronal para realizar la detección de objetos. Además, viene con los siguientes beneficios:
- sin necesidad de anotar datos (una tarea que requiere mucho tiempo y es obligatoria para entrenar redes neuronales)
- los cuadros delimitadores son más precisos
- sin necesidad de GPU
En mi experiencia, combinar una red neuronal como Yolov4 y la detección de objetos con la coincidencia de plantillas aquí es una buena manera de mejorar considerablemente el rendimiento de su red neuronal.
¿Qué es la coincidencia de plantillas?
Cuando se utiliza la coincidencia de plantillas OpenCV, la plantilla se desliza píxel por píxel en la imagen. Para cada posición, se calcula una métrica de similitud entre la imagen de la plantilla y la parte de la imagen que recupera:
Si la métrica de similitud es lo suficientemente alta para un píxel, ¡este píxel es probablemente la esquina superior izquierda de un objeto que coincida con su plantilla!
En consecuencia, puede lograr la detección de objetos con coincidencia de plantilla solo si los objetos que intenta detectar son lo suficientemente similares, casi idénticos, dentro de una clase. Aún puede incluir más plantillas para abordar las variaciones de objetos (tamaño, color, orientación). Pero aumentará el tiempo de predicción.
A primera vista, parece muy restrictivo. Pero muchos casos de uso de detección de objetos se pueden abordar con la coincidencia de plantillas:
- Identificación en documentos escaneados
- espacio de estacionamiento vacío de una cámara fija
- componentes de una línea de montaje…
Un ejemplo práctico
Un buen caso de uso para la detección de objetos mediante la coincidencia de plantillas es detectar componentes en circuitos impresos, como este:
Podríamos imaginar una línea de montaje produciendo tales circuitos. Imaginemos que algunos circuitos fabricados carecen de componentes y, por lo tanto, son defectuosos. Podríamos proponer instalar una cámara al final del sendero y disparar cada circuito, para filtrar los productos defectuosos. ¡Podemos lograr esto con la detección de objetos con coincidencia de plantillas!
En aras de la simplicidad, nos centraremos en la detección de algunos componentes.
Un primer componente que aparece dos veces:
Este aparece cuatro veces:
Y este tercero aparece seis veces:
Finalmente, elegimos estas tres imágenes como plantillas. En consecuencia, la complejidad de este caso de uso se reduce: detectaremos fácilmente al menos los objetos elegidos como plantillas.
Detección básica de objetos con coincidencia de plantillas
Definición de plantillas
En primer lugar, definimos plantillas desde:
- una ruta de imagen,
- una etiqueta,
- un color (para visualización de resultados: color de cuadros delimitadores y etiquetas),
- y un umbral coincidente.
En segundo lugar, consideramos que todos los píxeles que tienen una métrica de similitud por encima de este umbral indican una detección para esta plantilla.
Aquí están las plantillas de definición de código:
Detección de objetos con coincidencia de plantillas
Luego, hacemos un bucle sobre las plantillas para realizar la detección de objetos con coincidencia de plantillas para cada plantilla. Debido a que estamos utilizando un umbral, seleccionamos una métrica de similitud normalizada (TM_CCOEFF_NORMED) al aplicar la coincidencia de plantillas. Por lo tanto, podemos elegir un umbral entre 0 y 1:
Consideramos que cada píxel que tiene una puntuación de similitud por encima del umbral de plantilla es la esquina superior izquierda de un objeto (con la altura, el ancho y la etiqueta de la plantilla).
Visualizar objetos detectados
A continuación, trazamos los cuadros delimitadores previstos de esta detección de objetos con la coincidencia de plantillas en la imagen de entrada:
Finalmente, obtenemos los siguientes resultados:
Como indica el grosor de las cajas (en verde, amarillo y rojo), cada objeto se ha detectado varias veces.
Eliminar duplicados
¿Por qué obtuvimos detecciones duplicadas? Como se explicó anteriormente, la coincidencia de plantillas OpenCV devuelve una matriz 2D que tiene la dimensión de la imagen de entrada (una celda, y por lo tanto una puntuación de similitud, para cada píxel de imagen de entrada).
Por lo tanto, si se detecta un objeto en una ubicación, lo más probable es que todos los píxeles circundantes tengan la misma puntuación de similitud y, por lo tanto, se consideren como otras esquinas superiores izquierdas del objeto.
Para resolver este problema, ordenaremos todas las detecciones disminuyendo los valores coincidentes. Luego, elegiremos si validar o no cada detección. Validamos la detección si no se superpone demasiado con ninguna de las detecciones ya validadas. Finalmente, determinamos que dos detecciones se superponen si la Intersección sobre la Unión de sus cajas delimitadoras está por encima de un umbral dado. Este proceso se denomina Supresión No Máxima.
Aquí hay una explicación visual de lo que es Intersección sobre Unión (IoU) :
Así es como lo implementé (el método de cálculo de pagarés junto con más explicaciones se pueden encontrar aquí):
Y luego, solo agregué estas dos líneas después del bucle de detección:
Como resultado, obtenemos:
¡Mucho más limpio! Ahora vemos claramente que todos los primeros y terceros componentes se detectan sin falsos positivos (precisión y recuperación de 1).
ahora queremos reducir el número de falsos positivos para el componente 2. La forma más fácil es aumentar el umbral coincidente para la plantilla utilizada para esta etiqueta.
Elegir hiperparámetros
Por supuesto, es mejor calcular métricas de detección de objetos en varias imágenes para elegir hiperparámetros (umbral de coincidencia de plantilla y umbral de supresión No máximo). Por ahora, simplemente podemos aumentar el umbral para el componente 2:
Y obtendremos:
Ahora solo tenemos dos falsos positivos para el componente 2, en lugar de docenas (precisión de 2/3, recuperación de 1)! Además, los componentes 1 y 2 todavía se detectan perfectamente (precisión y recuperación de 1).
Para mejorar nuestros resultados pudimos:
- incluir plantillas para los componentes confundidos con el componente 2.
- pruebe varias métricas de similitud
- anote algunas imágenes para calcular métricas de detección y realice una búsqueda de cuadrícula en estos parámetros.
Resumen
Hemos logrado la detección de objetos con coincidencia de plantillas mediante:
- definir al menos una plantilla para cada objeto (cuantas más plantillas tenga para un objeto, mayor será su recuperación y su precisión baja)
- usar el método de coincidencia de plantillas OpenCV en la imagen para cada plantilla
- teniendo en cuenta que cada píxel que tiene una puntuación de similitud por encima de un umbral de plantilla es la esquina superior izquierda de un objeto (con la altura, el ancho y la etiqueta de esta plantilla)
- aplicar supresión No Máxima de las detecciones obtenidas
- ¡elegir umbrales de plantilla para mejorar la precisión de detección!
¡Eso es todo!
¿Está buscando Expertos en Reconocimiento de imágenes? No dude en ponerse en contacto con nosotros!