01/08/2023 | General,Sistema embebido,Software Embebido

OpenCV y Deep Learning – Visión por computador en redes neuronales

Introducción

OpenCV es una poderosa biblioteca ampliamente utilizada para el procesamiento de imágenes y la visión por computador. Su amplia gama de funciones y algoritmos permiten realizar tareas de procesamiento de imágenes, detección de objetos, extracción de características, y calibración de cámaras, entre otras.

Por otro lado, las técnicas de Deep Learning nos permiten analizar y aprender atributos visuales de grandes cantidades de datos. Al utilizar  Deep Learning con Open, aprovechamos el poder de los modelos pre-entrenados y las redes neuronales convolucionales para abordar tareas más complejas de manera más eficiente, como la clasificación de imágenes, la detección de objetos y la segmentación semántica. 

La integración con frameworks de Deep Learning como TensorFlow y PyTorch permite utilizar modelos de Deep Learning en conjunto con las funciones de OpenCV, lo que brinda una solución completa y versátil para aplicaciones de visión por computador.

Funcionalidades básicas de OpenCV

Lo primero que debemos tener en cuenta para implementar visión por computador con OpenCV es que ésta se basa en el procesamiento de imágenes y/o vídeos. Para capturar imágenes y/o vídeos en tiempo real utilizamos cámaras incorporadas a nuestro sistema, o bien podemos cargar imágenes y vídeos existentes desde el disco. 

Para empezar a trabajar con estas imágenes, también conocidas como frames, o con los vídeos, que se tratan internamente como sucesiones de imágenes utilizamos las funciones de OpenCV  ‘cv::VideoCapture’, ‘cv::open’ y ‘cv::imread’.

Una vez que tenemos acceso a las imágenes o vídeos, podemos realizar operaciones de preprocesamiento para preparar los datos para su posterior análisis. Esto puede incluir la conversión de imágenes a diferentes espacios de color, el redimensionamiento, la corrección de la iluminación, la eliminación de ruido, entre otros.

Técnicas de preprocesamiento de imágenes

– Conversión de color

OpenCV admite una amplia variedad de espacios de color, incluyendo BGR, RGB, HSV, Lab, YUV, entre otros. Cada espacio de color tiene su propio propósito y características, y la elección del espacio de color depende de la tarea que estemos realizando.

La mayoría de las funciones de OpenCV esperan imágenes en formato BGR, por lo que OpenCV proporciona la función ‘cv::cvtColor()’ para realizar la conversión de color entre diferentes espacios de color, ya que es posible que necesitemos convertir las imágenes a este espacio de color antes de aplicar ciertas operaciones.

La conversión de color es útil para realizar operaciones específicas en diferentes canales de color, como la detección de objetos basada en el canal de luminancia (Y) en el espacio de color YUV o la segmentación de objetos basada en el componente de saturación (S) en el espacio de color HSV.

En algunos casos, es posible que deseemos normalizar el rango de color de una imagen para que los valores de píxeles se ajusten a un rango específico. Para ello, OpenCV proporciona la función ‘cv::normalize()’ que permite normalizar una imagen en función de un rango de valores específico.

Esto puede ser útil para ajustar el contraste de una imagen o para asegurar que los valores de píxeles estén dentro de un rango requerido para ciertas operaciones o algoritmos.

Por último, OpenCV también permite convertir imágenes entre el espacio de color BGR y escalas de grises mediante las funciones ‘cv::cvtColor()’ y ‘cv::COLOR_BGR2GRAY’ para convertir una imagen en color a una imagen en escala de grises, y viceversa utilizando ‘cv::COLOR_GRAY2BGR’.

La conversión entre imágenes en escala de grises y color puede ser útil para realizar análisis de texturas en imágenes en escala de grises o la detección de objetos en imágenes en color.

   – Redimensionamiento de imágenes

La librería OpenCV proporciona varias funciones como ‘cv::resize()’ y ‘cv::resizeTo()’ utilizadas para redimensionar imágenes, en las que podemos especificar el tamaño final deseado o proporcionar una escala de redimensionamiento.

Al redimensionar una imagen, es importante considerar el método de interpolación, que puede ser lineal, bilineal o cúbico, dependiendo de la calidad deseada.

El redimensionamiento es útil para ajustar imágenes a un tamaño específico o cambiar su relación de aspecto. Es una técnica del grupo de las transformaciones geométricas en imágenes, junto con rotación, traslación, y perspectiva, muy explotadas en la detección y seguimiento de objetos.

   – Corrección de la iluminación

Los métodos para corregir la iluminación en imágenes se utilizan cuando hay una iluminación desigual o sombras que afectan la calidad de la imagen. Existen técnicas como la ecualización del histograma que mejora el contraste y la distribución de intensidad en una imagen. En imágenes en escala de grises, se aplica utilizando la función ‘cv::equalizeHist()’. Y, si la imágen es en color, se puede aplicar la ecualización del histograma en cada canal de color por separado.

   – Eliminación de ruido mediante filtros de imagen: 

OpenCV ofrece una variedad de filtros que utilizan operaciones morfológicas como  dilatación, erosión, apertura y cierre para eliminar el ruido de una imagen. Algunos ejemplos de filtros son:

   – El filtro de desenfoque (blur) es uno de los métodos más comunes y simples para reducir el ruido. Se utiliza mediante la función ’cv::blur()’ que permite especificar la intensidad de desenfoque.

   – El filtro de mediana (median), con su función ‘cv::medianBlur()’, es muy útil para eliminar el ruido impulsivo suavizando una imagen al reemplazar cada píxel por la mediana de sus vecinos. Además, el filtro de mediana es especialmente efectivo para preservar los bordes y los detalles en la imagen mientras se elimina el ruido.

   – El filtro bilateral (bilateral filter), mediante la función ‘cv::bilateralFilter()’, este filtro no lineal elimina el ruido manteniendo los bordes y los detalles importantes. El filtro bilateral es útil cuando deseas suavizar una imagen y reducir el ruido, pero también preservar los bordes y los detalles finos.

    – El filtro de reducción de ruido no local (non-local means filter), al igual que el anterior, es muy útil para eliminar el ruido mientras se preservan los detalles y los bordes de la imagen. Es un filtro basado en el promedio ponderado de píxeles similares en la imagen y se utiliza llamando a la función ‘cv::fastNlMeansDenoising()’.

Aplicando algoritmos de visión por computador

Las técnicas que acabamos de describir se combinan entre sí y se utilizan junto con algoritmos proporcionados por OpenCV para realizar la visión por computador. La tarea por excelencia consiste en la detección de objetos, la cual deriva en otras como la de reconocimiento facial o el análisis de movimiento mediante el seguimiento de dichos objetos.

Para realizar estas tareas lo primero que hacemos es detectar y extraer las características necesarias de la imagen o el vídeo, como esquinas, bordes, líneas, círculos y contornos. Para ello, dividimos las imágenes en regiones u objetos de interés utilizando técnicas como la umbralización y la segmentación basada en color, en textura o en contornos, que nos permiten identificar los objetos de interés del fondo y extraer características como el área, la longitud del contorno y la convexidad. Estas características sirven para realizar tareas de reconocimiento, calibración, alineación y más.

Una vez recogida la información, procedemos a procesar los datos, lo que consiste en el análisis y la comparación de resultados. Por un lado, OpenCV permite calcular histogramas de imágenes, que representan la distribución de intensidad de píxeles en diferentes rangos. Éstos son útiles para el análisis de color o el ajuste de contraste. Por otro lado, OpenCV proporciona implementaciones de descriptores locales como SIFT (Scale-Invariant Feature Transform) y SURF (Speeded-Up Robust Features) que identifican puntos de interés y generan vectores de características útiles para comparar y emparejar imágenes. 

A partir de estas técnicas conseguimos efectuar algunas de las funcionalidades clave de OpenCV en el procesamiento de imágenes. Por ejemplo, podemos calcular el flujo óptico en secuencias de imágenes, que proporciona información sobre la dirección y velocidad del movimiento de los objetos en la escena, y es muy útil para realizar el seguimiento de éstos. También podemos llevar a cabo funcionalidades como el reconocimiento facial ayudándonos de clasificadores de cascada Haar, que son algoritmos eficientes para la detección de objetos usados en conjunción con  algoritmos como Eigenfaces y Fisherfaces, que permiten detectar y reconocer rostros en imágenes y vídeos.

Por último, OpenCV se integra con frameworks de Deep Learning que entrenan modelos de  redes neuronales convolucionales en grandes conjuntos de datos y son capaces de detectar, clasificar y reconocer objetos con precisión.

Deep Learning

En el contexto de la visión por computador, el Deep Learning ha demostrado ser una técnica muy efectiva y potente. OpenCV proporciona integración con frameworks de Deep Learning como TensorFlow y PyTorch, lo que permite aprovechar los beneficios de estos modelos entrenados en tareas de visión por computador.

Es importante destacar que el uso de Deep Learning requiere recursos computacionales significativos, especialmente cuando se utilizan modelos complejos y grandes conjuntos de datos. Además, es importante tener en cuenta que el éxito en la implementación de la visión por computador depende de diversos factores, como la elección adecuada de algoritmos, la calidad y cantidad de los datos de entrenamiento, el preprocesamiento de imágenes, el ajuste de parámetros y la evaluación adecuada de los resultados.

A continuación describimos los pasos a seguir para la implementación de un modelo de Deep Learning con OpenCV:

1. Preparación del modelo de Deep Learning e Integración con OpenCV:

El primer paso es seleccionar un modelo de Deep Learning pre-entrenado adecuado para la tarea de visión por computador que deseamos abordar. OpenCV proporciona una API que permite cargar modelos de Deep Learning en formatos como TensorFlow y Caffe. Estos modelos ya han sido entrenados en grandes conjuntos de datos y han aprendido a reconocer patrones y características en imágenes. Al utilizarlos en combinación con otras funcionalidades de la biblioteca podemos realizar tareas como detección de objetos, clasificación de imágenes o segmentación semántica. 

2. Preprocesamiento de datos

Antes de pasar los datos a través del modelo de Deep Learning, generalmente es necesario realizar el preprocesamiento adecuado. Esto incluye aplicar técnicas que explicamos anteriormente como pueden ser redimensionar las imágenes a las dimensiones esperadas por el modelo, normalizar los valores de píxeles, convertir imágenes a un formato adecuado, entre otras.

3. Inferencia con el modelo

Una vez que el modelo está cargado y los datos de entrada están preparados, realizamos la inferencia en las imágenes o vídeos utilizando la función ‘cv::dnn::Net::forward()’. Esto implica pasar los datos de entrada a través de las capas del modelo para obtener las predicciones o salidas correspondientes. OpenCV proporciona métodos para acceder a las salidas del modelo, como las puntuaciones de clasificación, las bounding boxes de detección, segmentaciones de píxeles u otras salidas específicas.

Por otro lado, OpenCV incluye opciones para optimizar y acelerar la inferencia de Deep Learning como el módulo OpenCV DNN que aprovecha bibliotecas optimizadas como OpenBLAS, Intel MKL o NVIDIA cuDNN. También podemos configurar parámetros adicionales, como la elección del dispositivo de ejecución (CPU o GPU)  para amortizar la aceleración por hardware utilizando OpenCV con CUDA y aprovechar la potencia de procesamiento paralelo de las tarjetas gráficas.

Además de la inferencia con modelos pre-entrenados, OpenCV también permite realizar transferencia de aprendizaje y entrenamiento personalizado. Es decir, podemos utilizar las funciones y utilidades de OpenCV para entrenar y afinar nuestros propios modelos de Deep Learning en tareas específicas de visión por computador.

Es importante destacar que el rendimiento y la precisión de la inferencia de Deep Learning en OpenCV dependen de varios factores, como la elección del modelo, la calidad del entrenamiento, los datos de entrada y la configuración adecuada de los parámetros.

4. Postprocesamiento

Después de obtener las predicciones del modelo, llevamos a cabo el postprocesamiento de los resultados. Esto incluye el filtrado de detecciones redundantes, ajuste de umbrales de confianza, extracción de características adicionales, entre otros.

5. Visualización y análisis de resultados

Finalmente, visualizamos los resultados obtenidos para analizar y comprender mejor la salida del modelo. Para ello nos servimos de funciones para dibujar bounding boxes, etiquetas, máscaras de segmentación, y otros elementos en las imágenes o vídeos resultantes.

Conclusión

En resumen, OpenCV junto con técnicas de Deep Learning ofrece a los desarrolladores y científicos una poderosa plataforma para desarrollar aplicaciones de visión por computador. Explorar y experimentar con las diferentes funcionalidades y algoritmos de OpenCV, así como aprovechar los modelos pre-entrenados de Deep Learning, puede abrir un amplio abanico de posibilidades en el campo de la visión por computador y permitir el desarrollo de aplicaciones innovadoras en diversas áreas, como la robótica, la seguridad, la medicina, el análisis de imágenes y muchos otros dominios.

Compartir en:

Relacionados