Segmentación de Imágenes Eficiente Utilizando PyTorch Parte 2

'Efficient Image Segmentation with PyTorch Part 2'

Un modelo basado en CNN

Esta es la segunda parte de la serie de 4 partes para implementar la segmentación de imágenes paso a paso desde cero utilizando técnicas de aprendizaje profundo en PyTorch. Esta parte se centrará en implementar un modelo de Red Neuronal Convolucional (CNN) de segmentación de imágenes base.

Co-autoría con Naresh Singh

Figura 1: Resultado de la ejecución de la segmentación de imágenes utilizando una CNN. En orden de arriba a abajo, imágenes de entrada, máscaras de segmentación de la verdad terrenal, máscaras de segmentación predichas. Fuente: Autor(es)

Esquema del artículo

En este artículo, implementaremos una arquitectura basada en Red Neuronal Convolucional (CNN) llamada SegNet que asignará cada píxel en una imagen de entrada a una mascota correspondiente como un gato o un perro. Los píxeles que no pertenecen a ninguna mascota se clasificarán como píxeles de fondo. Construiremos y entrenaremos este modelo en el conjunto de datos de Oxford Pets utilizando PyTorch para desarrollar una idea de lo que se necesita para lograr una tarea exitosa de segmentación de imágenes. El proceso de construcción del modelo será práctico donde discutiremos en detalle el papel de cada capa en nuestro modelo. El artículo contendrá muchas referencias a artículos y documentos de investigación para un aprendizaje adicional.

A lo largo de este artículo, haremos referencia al código y los resultados de este cuaderno. Si desea reproducir los resultados, necesitará una GPU para garantizar que el cuaderno se complete en un tiempo razonable.

Artículos de esta serie

Esta serie es para lectores de todos los niveles de experiencia con el aprendizaje profundo. Si desea aprender sobre la práctica del aprendizaje profundo y la inteligencia artificial de visión junto con una sólida teoría y experiencia práctica, ¡ha venido al lugar correcto! Se espera que esta sea una serie de 4 partes con los siguientes artículos:

  1. Conceptos e ideas
  2. Un modelo basado en CNN (este artículo)
  3. Convoluciones separables en profundidad
  4. Un modelo basado en Vision Transformer

Comencemos esta discusión con una breve introducción a las capas de convolución y algunas otras capas que se utilizan típicamente juntas como un bloque de convolución.

Conv-BatchNorm-ReLU y Max Pooling/Unpooling

Un bloque de convolución, normalización por lotes y ReLU es la trinidad sagrada de la inteligencia artificial de visión. Lo verá utilizado con frecuencia en modelos de inteligencia artificial de visión basados en CNN. Cada uno de estos términos representa una capa distinta implementada en PyTorch. La capa de convolución es responsable de realizar una operación de correlación cruzada de filtros aprendidos en el tensor de entrada. La normalización por lotes centra los elementos en el lote en media cero y varianza unitaria, y ReLU es una función de activación no lineal que mantiene solo los valores positivos en la entrada.

Una CNN típica reduce progresivamente las dimensiones espaciales de entrada a medida que se apilan las capas. La motivación detrás de la reducción de las dimensiones espaciales se discute en la siguiente sección. Esta reducción se logra mediante la agrupación de los valores vecinos utilizando una función simple como máximo o promedio. Hablaremos más sobre esto en la sección de Max-Pooling. En problemas de clasificación, el conjunto de bloques Conv-BN-ReLU-Pool se sigue con una cabeza de clasificación que predice la probabilidad de que la entrada pertenezca a una de las clases objetivo. Algunos conjuntos de problemas como la segmentación semántica requieren una predicción por píxel. Para tales casos, se agregan un conjunto de bloques de aumento de muestreo después de los bloques de reducción de muestreo para proyectar su salida a la dimensión espacial requerida. Los bloques de aumento de muestreo no son más que bloques Conv-BN-ReLU-Unpool que reemplazan la capa de agrupación con una capa de desagrupación. Hablaremos más sobre la desagrupación en la sección de Max-Pooling.

Ahora, profundicemos en la motivación detrás de las capas de convolución.

Convolución

Las convoluciones son los bloques de construcción básicos de los modelos de inteligencia artificial de visión. Se utilizan ampliamente en la visión por computadora y se han utilizado históricamente para implementar transformaciones de visión como:

  1. Detección de bordes
  2. Difuminado e intensificación de imágenes
  3. Grabado
  4. Intensificación

Una operación de convolución es una multiplicación y agregación de elementos de dos matrices. Se muestra una operación de convolución de ejemplo en la Figura 2.

Figura 2: Una ilustración de la operación de convolución. Fuente: Autor(es)

En un contexto de aprendizaje profundo, la convolución se realiza entre una matriz de parámetros n-dimensionales llamada filtro o kernel sobre una entrada de mayor tamaño. Esto se logra deslizando el filtro sobre la entrada y aplicando la convolución a la sección correspondiente. La amplitud del deslizamiento se configura utilizando un parámetro de paso. Un paso de uno significa que el kernel se desliza un paso para operar en la siguiente sección. A diferencia de los enfoques tradicionales donde se utiliza un filtro fijo, el aprendizaje profundo aprende el filtro a partir de los datos utilizando retropropagación.

Entonces, ¿cómo ayudan las convoluciones en el aprendizaje profundo?

En el aprendizaje profundo, una capa de convolución se utiliza para detectar características visuales. Un modelo típico de CNN contiene una pila de estas capas. Las capas inferiores en la pila detectan características simples como líneas y bordes. A medida que avanzamos en la pila, las capas detectan características cada vez más complejas. Las capas intermedias en la pila detectan combinaciones de líneas y bordes y las capas superiores detectan formas complejas como un automóvil, una cara o un avión. La Figura 3 muestra visualmente la salida de las capas superiores e inferiores para un modelo entrenado.

Figura 3: Lo que los filtros convolucionales aprenden a identificar. Fuente: Redes de creencia profunda convolucionales para el aprendizaje jerárquico no supervisado escalable de representaciones

Una capa de convolución tiene un conjunto de filtros aprendibles que actúan sobre regiones pequeñas en la entrada para producir un valor representativo de cada región. Por ejemplo, un filtro de 3×3 opera sobre una región de tamaño 3×3 y produce un valor representativo de la región. La aplicación repetida de un filtro sobre regiones de entrada produce una salida que se convierte en la entrada de la siguiente capa en la pila. Intuitivamente, las capas superiores llegan a “ver” una región más grande de la entrada. Por ejemplo, un filtro de 3×3 en la segunda capa de convolución opera sobre la salida de la primera capa de convolución donde cada celda contiene información sobre la región de tamaño 3×3 en la entrada. Si asumimos una operación de convolución con un paso de 1, entonces el filtro en la segunda capa “verá” la región de tamaño 5×5 de la entrada original. Esto se llama campo receptivo de la convolución. La aplicación repetida de capas convolucionales reduce progresivamente las dimensiones espaciales de la imagen de entrada y aumenta el campo de visión de los filtros, lo que les permite “ver” formas complejas. La Figura 4 muestra el procesamiento de una entrada 1-D por una red de convolución. Un elemento en la capa de salida es un representante de un fragmento de entrada relativamente más grande.

Figura 4: Campo receptivo de una convolución 1d con tamaño de kernel=3, aplicado 3 veces. Suponga un paso=1 y sin relleno. Después de la tercera aplicación sucesiva del kernel de convolución, un solo píxel puede ver 7 píxeles en la imagen de entrada original. Fuente: Autor(es)

Una vez que una capa de convolución puede detectar estos objetos y es capaz de generar sus representaciones, podemos usar estas representaciones para clasificación de imágenes, segmentación de imágenes, detección y localización de objetos. En términos generales, las CNN se adhieren a los siguientes principios generales:

  1. Una capa de convolución mantiene el número de canales de salida (c) intacto o los duplica.
  2. Mantiene las dimensiones espaciales intactas usando un paso=1 o los reduce a la mitad usando un paso=2.
  3. Es común agrupar la salida de un bloque de convolución para cambiar las dimensiones espaciales de una imagen.

Una capa de convolución aplica el kernel de forma independiente a cada entrada. Esto podría hacer que su salida varíe para diferentes entradas. Una capa de normalización de lote sigue típicamente a una capa de convolución para abordar este problema. Entendamos su papel en detalle en la siguiente sección.

Normalización en lotes

La capa de Normalización en lotes normaliza los valores de canal en la entrada de lote para que tengan una media cero y una varianza unitaria. Esta normalización se realiza de forma independiente para cada canal en el lote para asegurar que los valores de canal para las entradas tengan la misma distribución. La Normalización en lotes tiene los siguientes beneficios:

  1. Estabiliza el proceso de entrenamiento al evitar que los gradientes se vuelvan demasiado pequeños.
  2. Logra una convergencia más rápida en nuestras tareas.

Si todo lo que tuviéramos fuera una pila de capas de convolución, esencialmente sería equivalente a una red de una sola capa de convolución debido al efecto en cascada de las transformaciones lineales. En otras palabras, una secuencia de transformaciones lineales puede ser reemplazada por una sola transformación lineal que tiene el mismo efecto. De manera intuitiva, si multiplicamos un vector con una constante k₁ seguido de una multiplicación con otra constante k₂, es equivalente a una sola multiplicación por una constante k₁k₂. Por lo tanto, para que las redes sean realísticamente profundas, deben tener una no-linealidad para evitar su colapso. Discutiremos ReLU en la siguiente sección, que se usa con frecuencia como no-linealidad.

ReLU

ReLU es una función de activación no lineal simple que recorta los valores de entrada más bajos para que sean mayores o iguales a 0. También ayuda con el problema de gradientes que desaparecen limitando las salidas para que sean mayores o iguales a 0. La capa ReLU suele ir seguida de una capa de agrupación para reducir las dimensiones espaciales en la subred de reducción de escala o una capa de desagrupación para aumentar las dimensiones espaciales en la subred de aumento de escala. Los detalles se proporcionan en la siguiente sección.

Agrupación

Se utiliza una capa de agrupación para reducir las dimensiones espaciales de nuestras entradas. La agrupación con un paso de 2 transformará una entrada con dimensiones espaciales (H, W) a (H/2, W/2). La máxima agrupación es la técnica de agrupación más comúnmente utilizada en redes CNN profundas. Proyecta el valor máximo en una cuadrícula de (digamos) 2×2 en la salida. Luego, deslizamos la ventana de agrupación 2×2 a la siguiente sección en función del paso, similar a las convoluciones. Al hacer esto repetidamente con un paso de 2, obtenemos una salida que tiene la mitad de la altura y la mitad del ancho de la entrada. Otra capa de agrupación comúnmente utilizada es la capa de agrupación promedio, que calcula el promedio en lugar del máximo.

El reverso de una capa de agrupación se llama capa de desagrupación. Toma una entrada de dimensión (H, W) y la convierte en una salida de dimensión (2H, 2W) para un paso de 2. Un ingrediente necesario de esta transformación es seleccionar la ubicación en la sección de 2×2 de la salida para proyectar el valor de entrada. Para hacer esto, necesitamos un mapa de índice de máxima-desagrupación que nos diga las ubicaciones objetivo en la sección de salida. Este mapa de desagrupación se produce mediante una operación de máxima agrupación anterior. La figura 5 muestra ejemplos de operaciones de agrupación y desagrupación.

Figura 5: Agrupación y desagrupación máximas. Fuente: DeepPainter: Clasificación de pintores mediante autoencoders convolucionales profundos

Podemos considerar la máxima agrupación como un tipo de función de activación no lineal. Sin embargo, se informa que usarla para reemplazar una no linealidad como ReLU afecta el rendimiento de la red. En contraste, la agrupación promedio no se puede considerar como una función no lineal ya que utiliza todas sus entradas para producir una salida que es una combinación lineal de sus entradas.

Esto cubre todos los bloques de construcción básicos de las redes CNN profundas. Ahora, unamos todo para crear un modelo. El modelo que hemos elegido para este ejercicio se llama SegNet. Lo discutiremos a continuación.

SegNet: un modelo basado en CNN

SegNet es un modelo de redes CNN profundas basado en los bloques fundamentales que hemos discutido en este artículo. Tiene dos secciones distintas. La sección inferior, también llamada codificador, reduce la entrada para generar características representativas de la entrada. La sección superior del decodificador aumenta las características para crear una clasificación por píxel. Cada sección se compone de una secuencia de bloques de Conv-BN-ReLU. Estos bloques también incorporan capas de agrupación o desagrupación en los caminos de reducción y aumento de escala, respectivamente. La figura 6 muestra la disposición de las capas con más detalle. SegNet utiliza los índices de agrupación de la operación de máxima agrupación en el codificador para determinar qué valores copiar durante la operación de máxima desagrupación en el decodificador. Si bien cada elemento de un tensor de activación es de 4 bytes (32 bits), se puede almacenar un desplazamiento dentro de un cuadrado de 2×2 usando solo 2 bits. Esto es más eficiente en términos de memoria utilizada ya que estas activaciones (o índices en el caso de SegNet) deben almacenarse mientras se ejecuta el modelo.

Figura 6: Arquitectura del modelo SegNet para segmentación de imágenes. Fuente: SegNet: una arquitectura codificador-decodificador de convolución profunda para segmentación de imágenes

Este cuaderno contiene todo el código de esta sección.

Este modelo tiene 15,27 millones de parámetros entrenables.

Se utilizó la siguiente configuración durante el entrenamiento y la validación del modelo.

  1. Se aplican las aumentaciones de datos de volteo horizontal aleatorio y alteración de color al conjunto de entrenamiento para evitar el sobreajuste
  2. Las imágenes se redimensionan a 128×128 píxeles en una operación de redimensionamiento no preservadora del aspecto
  3. No se aplica normalización de entrada a las imágenes; en su lugar, se utiliza una capa de normalización por lotes como primera capa del modelo
  4. El modelo se entrena durante 20 épocas utilizando el optimizador Adam con una LR de 0,001 y un programador StepLR que decae la tasa de aprendizaje en un 0,7 cada 7 épocas
  5. Se utiliza la función de pérdida de entropía cruzada para clasificar un píxel como perteneciente a una mascota, al fondo o a un borde de mascota

El modelo logró una precisión de validación del 88,28% después de 20 épocas de entrenamiento.

Hemos creado un gif que muestra cómo el modelo aprende a predecir las máscaras de segmentación para 21 imágenes en el conjunto de validación.

Figura 6: Un gif que muestra cómo el modelo SegNet aprende a predecir las máscaras de segmentación para 21 imágenes en el conjunto de validación. Fuente: Autor(es)

Las definiciones de todas las métricas de validación se describen en la Parte 1 de esta serie.

Si desea ver un modelo completamente convolucional para segmentar imágenes de mascotas implementado utilizando Tensorflow, consulte el Capítulo 4: Arquitecturas eficientes del libro de aprendizaje profundo eficiente.

Observaciones del aprendizaje del modelo

Basándonos en el desarrollo de las predicciones que el modelo entrenado hace después de cada época, podemos observar lo siguiente.

  1. El modelo es capaz de aprender lo suficiente como para hacer que la salida se vea en el rango correcto de la mascota en la imagen incluso en la primera época de entrenamiento
  2. Los píxeles de borde son más difíciles de segmentar ya que estamos utilizando una función de pérdida no ponderada que trata cada éxito (o fracaso) por igual, por lo que obtener los píxeles de borde incorrectos no le cuesta mucho al modelo en términos de pérdida. Le recomendamos que investigue esto y compruebe qué estrategias podría probar para solucionar este problema. Trate de usar Focal Loss y vea cómo funciona
  3. El modelo parece estar aprendiendo incluso después de 20 épocas de entrenamiento. Esto sugiere que podríamos mejorar la precisión de validación si entrenamos el modelo durante más tiempo
  4. Algunas de las etiquetas de verdad fundamentales en sí mismas son difíciles de entender, por ejemplo, la máscara del perro en la columna del medio, última fila tiene muchos píxeles desconocidos en el área donde el cuerpo del perro está oculto por plantas. Esto es muy difícil para que el modelo lo entienda, por lo que siempre se debe esperar una pérdida de precisión para tales ejemplos. Sin embargo, esto no significa que el modelo no esté funcionando bien. Siempre se deben verificar las predicciones para desarrollar una idea del comportamiento del modelo además de mirar las métricas de validación generales.
Figura 7: Un ejemplo de la máscara de segmentación de la verdad fundamental que contiene muchos píxeles desconocidos. Esta es una entrada muy difícil para cualquier modelo de aprendizaje automático. Fuente: Autor(es)

Conclusión

En la Parte 2 de esta serie, aprendimos acerca de los bloques de construcción básicos de las redes neuronales convolucionales profundas para la inteligencia artificial de visión. Vimos cómo implementar el modelo SegNet desde cero en PyTorch y visualizamos cómo el modelo entrenado en sucesivas épocas se desempeña en 21 imágenes de validación. Esto debería ayudarlo a apreciar lo rápido que los modelos pueden aprender lo suficiente como para que la salida se vea en algún lugar en el rango correcto. En este caso, podemos ver máscaras de segmentación que se asemejan aproximadamente a la máscara de segmentación real ya en la primera época de entrenamiento!

En la próxima parte de esta serie, veremos cómo podemos optimizar nuestro modelo para la inferencia en el dispositivo y reducir el número de parámetros entrenables (y, por lo tanto, el tamaño del modelo) mientras mantenemos la precisión de validación aproximadamente igual.

Lecturas adicionales

Lee más sobre convoluciones aquí:

  1. El curso titulado “Ancient Secrets of computer vision” en la Universidad de Washington, impartido por Joseph Redmon, tiene un excelente conjunto de videos sobre convoluciones (especialmente los capítulos 4, 5 y 13), que recomendamos encarecidamente ver.
  2. Una guía sobre aritmética de convolución para aprendizaje profundo (altamente recomendado).
  3. https://towardsdatascience.com/computer-vision-convolution-basics-2d0ae3b79346
  4. La capa Conv2d en PyTorch (documentación).
  5. ¿Qué aprenden las convoluciones?
  6. Visualizador de convolución.

Lee más sobre la normalización por lotes aquí:

  1. Normalización por lotes: Wikipedia
  2. Normalización por lotes: Machine learning mastery
  3. Capa BatchNorm2d en PyTorch aquí.

Lee más sobre las funciones de activación y ReLU aquí:

  1. ReLU: Machine learning mastery
  2. ReLU: Wikipedia
  3. ReLU: Quora
  4. API ReLU en PyTorch

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Un nuevo estudio de IA desvela los secretos de las baterías de ion de litio a través de la visión por computadora

Miles de partículas minúsculas empaquetadas densamente en los electrodos de las baterías de iones de litio recargable...

Inteligencia Artificial

Microsoft libera VALLE-X de código abierto un modelo de síntesis de voz y clonación de voz multilingüe de Texto a Voz

Una implementación de código abierto del modelo VALL-E X de Microsoft ha surgido en la búsqueda de ampliar los límite...

Ciencia de Datos

Escalado de datos con Python

Cómo escalar tus datos para hacerlos adecuados para la construcción de modelos.

Inteligencia Artificial

Conoce a TADA Un enfoque potente de IA para convertir descripciones verbales en un expresivo avatar 3D

El desarrollo de modelos de lenguaje grandes y modelos de difusión ha allanado el camino para fusionar modelos de tex...

Inteligencia Artificial

Soñar primero, aprender después DECKARD es un enfoque de IA que utiliza LLMs para entrenar agentes de aprendizaje por refuerzo (RL)

El aprendizaje por refuerzo (RL) es un enfoque popular para entrenar agentes autónomos que pueden aprender a realizar...