Segmentación Semántica - U-NET desde cero con PyTorch - Parte 2

Segmentación Semántica - U-NET desde cero con PyTorch - Parte 2

Entrenamiento del modelo

Resumen de la sección: En esta sección, se procede a entrenar el modelo después de generar los data sets y data loader para cargar los datos. Se cargan imágenes en lotes de 32 y se utiliza un tamaño de mini batch de 32.

Implementación del modelo U-Net

  • Se muestra la arquitectura del modelo U-Net que se implementará.
  • Se explica que se realizará un downsample utilizando bloques de convolución seguidos por capas de max pooling.
  • Las capas convolucionales tienen un tamaño de filtro de 3x3 y el número de filtros es 64, 128, 256 y 512 respectivamente.
  • Se menciona que se creará primero el bloque de dos capas convolucionales antes de continuar con el proceso completo.

Implementación del bloque DoubleConvolutionModule

  • Se crea una clase llamada "DoubleConvolutionModule" para representar el bloque de dos capas convolucionales.
  • El bloque tiene como parámetros el número de canales de entrada y salida.
  • Se define la función init como constructor y se especifica qué parámetros recibirá.
  • Dentro del constructor, se crea el bloque utilizando convoluciones con kernel 3x3, stride 1 y padding para mantener el mismo tamaño del volumen.

Creación del modelo U-Net

Resumen de la sección: En esta parte, se programa la función para crear el modelo U-Net utilizando la clase DoubleConvolutionModule.

Creación del bloque de dos capas convolucionales

  • Se crea una instancia de la clase DoubleConvolutionModule para representar el bloque de dos capas convolucionales.
  • Se especifica que el bloque será utilizado en diferentes partes del código.

Implementación del modelo U-Net completo

  • Se crea una clase llamada "UNet" para representar el modelo U-Net completo.
  • El modelo tiene como parámetros el número de canales de entrada y salida.
  • Dentro del constructor, se define la estructura del modelo utilizando los bloques de convolución y max pooling previamente creados.

Conclusiones finales

Resumen de la sección: En esta parte final, se concluye la implementación del modelo U-Net y se prepara para su entrenamiento.

Próximos pasos

  • Se menciona que en los próximos videos se explicará cómo entrenar el modelo y evaluar su desempeño utilizando métricas específicas para problemas de segmentación.

Capa de convolución

Resumen de la sección: En esta sección, se explica cómo crear una capa de convolución en el modelo utilizando un bloque de doble convolución. Se establecen los parámetros necesarios, como el número de canales de entrada y salida, el tamaño del kernel y el padding.

Creación del bloque de convolución

  • Se crea un bloque secuencial para implementar la capa de convolución.
  • Se instancia un objeto nn.Conv2d con los parámetros adecuados, como los canales de entrada y salida.
  • Se define una función forward que recibe la variable x y devuelve el resultado después de aplicar la convolución.

Bloque de doble convolución

Resumen de la sección: En esta sección, se explica cómo implementar un bloque de doble convolución utilizando el bloque creado anteriormente. Este bloque será utilizado varias veces a lo largo del modelo.

Implementación del bloque

  • Se crea una clase llamada "DobleConvolucion" que integra los bloques previamente creados.
  • Se utiliza el método super() para llamar al constructor de la clase padre.
  • Se define una función forward que llama al bloque de doble convolución y al max pooling.

Camino principal

Resumen de la sección: En esta sección, se construye el camino principal del modelo utilizando bloques previamente creados. Este camino es responsable del procesamiento tradicional en una red neuronal convolucional.

Construcción del camino principal

  • Se crea una clase llamada "CaminoPrincipal" que integra los bloques de doble convolución y max pooling.
  • Se utiliza el método super() para llamar al constructor de la clase padre.
  • Se define una función forward que llama a los bloques previamente creados.

Modularidad del código

Resumen de la sección: En esta sección, se destaca la importancia de la modularidad en el código para reducir errores y facilitar su interpretación. Se explica cómo llamar a los bloques previamente creados en lugar de repetir el código varias veces.

Implementación modular

  • Se utiliza el bloque "DobleConvolucion" en lugar de repetir el código en diferentes partes del modelo.
  • Se busca cometer menos errores y hacer el código más fácil de interpretar.
  • Se utilizan comentarios para mejorar la comprensión del código.

Estas son las principales secciones y conceptos presentados en el video.

Implementación de Max Pool y Doble Convolución

Resumen de la sección: En esta sección, se discute la implementación del Max Pool y el bloque de Doble Convolución. Se menciona la importancia de realizar primero el Max Pool antes de la Doble Convolución para facilitar la concatenación de las salidas.

Implementación del Max Pool

  • El tamaño del Max Pool es 2x2.
  • Se realiza un doble acoplamiento después del Max Pool.

Importancia de realizar primero el Max Pool

  • Al hacer primero el Max Pool y luego la Doble Convolución, se evita tener que hacer ajustes adicionales en el código para concatenar las salidas.
  • La salida del Max Pool se puede concatenar directamente con la parte correspondiente al Upsample.

Implementación de Convolución

Resumen de la sección: En esta sección, se aborda la implementación de la convolución en el modelo. Se menciona que se utiliza una convolución 2D y se explica cómo afecta a las dimensiones.

Convolución 2D

  • Se utiliza una convolución 2D para mantener las dimensiones adecuadas.
  • La salida tendrá un número reducido de canales en comparación con la entrada.

Implementación del Upsample

Resumen de la sección: En esta sección, se describe cómo implementar el Upsample en el modelo. Se menciona que se utiliza una interpolación bicúbica seguida por una convolución 1x1.

Interpolación Bicúbica

  • Se utiliza una interpolación bicúbica como método para aumentar las dimensiones.
  • El factor de interpolación se establece en duplicar el tamaño.

Convolución 1x1

  • Se realiza una convolución 1x1 para ajustar los parámetros antes de la siguiente capa.

Implementación del Bloque de Doble Convolución

Resumen de la sección: En esta sección, se explica cómo implementar el bloque de Doble Convolución en el modelo. Se menciona que este bloque consiste en dos capas de convolución consecutivas.

Bloque de Doble Convolución

  • El bloque de Doble Convolución consta de dos capas consecutivas.
  • Se utiliza la clase "DobleConvolucion" para implementar este bloque.
  • La entrada y salida del bloque son los canales correspondientes.

Estos son los puntos clave y las ideas principales discutidas en el video sobre la implementación del Max Pool, Convolución, Upsample y Bloque de Doble Convolución.

Configuración de canales de salida

Resumen de la sección: En esta sección, se explica cómo configurar los canales de salida en un modelo. Se muestra cómo especificar el número de canales y cómo realizar una concatenación adecuada.

Configuración de los canales de salida

  • Para indicar cuántos canales se desean tener como salida, se utiliza la función "forward".
  • Se reciben dos entradas, x1 y x2, que representan diferentes partes del modelo.
  • Se realiza una concatenación entre x1 y x2 para obtener el volumen deseado.
  • La dimensión 1 del tensor representa los canales en una imagen.
  • La concatenación se realiza a lo largo de la dimensión 1 para mantener consistencia en las dimensiones.

Construcción del modelo UNet

Resumen de la sección: En esta sección, se muestra cómo construir el modelo UNet utilizando diferentes clases y composiciones.

Clase Net

  • Se crea una clase llamada "Net" para construir el modelo UNet.
  • El constructor recibe parámetros como el número de canales de entrada, el canal base y el número de clases.
  • Se definen las composiciones necesarias para construir el modelo.

Doble convolución

  • Se implementa una doble convolución como parte del modelo UNet.
  • Recibe los parámetros correspondientes a los canales de entrada y al canal base.
  • Luego, se llama a otra composición llamada "down convolution".

Down Convolution

  • La composición "down convolution" también recibe parámetros relacionados con los canales de entrada y el canal base.
  • Se realiza una operación de max pooling para reducir las dimensiones.
  • La salida de esta composición se utiliza como entrada para la siguiente capa del modelo.

Continuación de la construcción del modelo UNet

Resumen de la sección: En esta sección, se continúa con la construcción del modelo UNet y se explican los parámetros utilizados en cada etapa.

Otra down convolution

  • Se implementa otra composición llamada "down convolution 2".
  • Recibe parámetros relacionados con los canales de entrada y el canal base.
  • La salida de esta composición tiene un número mayor de canales y dimensiones más reducidas.

Número de clases

  • Se especifica el número de clases que tendrá el modelo UNet.
  • Este valor corresponde al número de canales en la salida final del modelo.

Estas son las principales secciones y puntos clave abordados en el video.

Arquitectura de la red neuronal convolucional

Resumen de la sección: En esta sección, se describe la arquitectura de una red neuronal convolucional.

Configuración inicial

  • Se define una salida con dimensiones 512x28x28.
  • Se realiza una convolución con 4 canales y luego otra con 8 canales.
  • Se llega a una parte central donde se tienen 1024 canales de profundidad.

Proceso de convoluciones

  • Se realiza un downsample utilizando max pooling.
  • Luego se aplican dos capas de convolución.
  • Se repite este proceso para obtener un total de cuatro capas de convolución.

Última capa y tamaño final

  • La última capa es una convolución con 2 canales y un kernel de 1x1.
  • El número de clases está determinado por el número de canales en la salida final.

Implementación del forward pass

Resumen de la sección: En esta sección, se implementa el forward pass en la red neuronal convolucional.

Paso a paso del forward pass

  • Se definen variables para cada etapa del proceso.
  • Se realizan las operaciones necesarias para pasar por cada capa, concatenando las salidas según corresponda.

Implementación del bloque ConvBlock

Resumen de la sección: En esta sección, se implementa el bloque ConvBlock en la red neuronal convolucional.

Uso de diferentes variables

  • Se utilizan diferentes variables para enviar los valores entre las partes correspondientes.
  • Se realiza la concatenación de las salidas según corresponda.

Implementación del bloque Convolution

Resumen de la sección: En esta sección, se implementa el bloque Convolution en la red neuronal convolucional.

Uso de diferentes variables y funciones

  • Se utilizan diferentes variables para enviar los valores entre las partes correspondientes.
  • Se realizan las operaciones necesarias para pasar por cada capa del bloque Convolution.

Estas son las principales secciones y puntos clave del video.

Implementación del modelo y función de prueba

Resumen de la sección: En esta sección, se implementa el modelo y se define una función de prueba para verificar las dimensiones esperadas.

Implementación del modelo y función de prueba

  • Se define una función llamada "x" que recibe un tensor correspondiente a las dimensiones de un mini lote.
  • Se crea el modelo utilizando las dimensiones especificadas.
  • Se realizan predicciones utilizando el modelo.
  • Se define una función llamada "scores" que no devuelve nada y utiliza las predicciones.
  • Se verifica si el modelo funciona correctamente ajustando los argumentos para inicializarlo con tres canales de entrada, cuatro canales en uso y dos clases.
  • Se corrigen los errores en la definición del modelo, asegurándose de que los números de canales coincidan correctamente.

Verificación de las dimensiones del modelo

Resumen de la sección: En esta sección, se verifica que las dimensiones del modelo sean correctas.

Verificación de las dimensiones del modelo

  • Se realiza una impresión para verificar que la forma esperada sea 32 por 2 por 224 por 224.
  • Las dimensiones coinciden con lo esperado, lo cual indica que el modelo está bien implementado hasta este punto.

Implementación de la función de entrenamiento y activación

Resumen de la sección: En esta sección, se implementan las funciones necesarias para calcular la clase arrojada por el modelo.

Implementación de la función de entrenamiento y activación

  • Se implementan las funciones de entrenamiento y activación necesarias para calcular la clase arrojada por el modelo.
Video description

Código completo: https://github.com/JACantoral/DL_fundamentals/blob/main/Fundamentals_DL_UNET_4_video_v2.ipynb Videos previos U-NET: Datasets y Dataloaders https://youtu.be/dfMEK4bKjRE Paper U-Net https://youtu.be/waIPUsecaaQ Después de haber explicado con dellate el paper de U-NET, y haber implementado los objetos DATASET y DATALOADER de PyTorch para manipular nuestros datos y entrenar nuestro modelo de U-NET, en este video implemento clases para crear nuestro modelo de U-NET desde cero usando PyTorch. Crearemos todas las clases necesarias para tener un modelo modular flexible, y muy elegante. Finalmente, en el próximo video lo que haremos será entrenar el modelo y programar las métricas de validación. Base de datos Carvana https://www.kaggle.com/c/carvana-image-masking-challenge Referencia al paper original: Ronneberger, O., Fischer, P., & Brox, T. (2015). U-Net: Convolutional Networks for Biomedical Image Segmentation (arXiv:1505.04597). arXiv. https://doi.org/10.48550/arXiv.1505.04597 Acerca de la serie Fundamentos de Deep Learning con Python y PyTorch: En esta serie de videos explico qué son las Redes Neuronales (Neural Networks) y qué es Aprendizaje Computacional (Machine Learning) así como Deep Learning. Empezamos con los principios matemáticos fundamentales hasta su implementación en código. Para esto, primero utilizaremos Python y Numpy para entender los principios de programación de Redes Neuronales incluyendo el algoritmo de retropropagación (backpropagation). Con estas bases, presentaremos el framework PyTorch y construiremos modelos más complejos como son Redes Neuronales Convolucionales (Convolutional Neural Networks - CNNs). About the video series: In this video series I will explain what Neural Networks are, and how Deep Neural Networks work, from the mathematical principles to their implementation in code. Firstly, we will use pure Python and Numpy to understand the fundamentals including backpropagation for a simple Fully Connected Network, and from there we will build on to Convolutional Neural Networks (CNN) using PyTorch. I will be uploading at least one new video every week until we reach different architectures of CNNs. Then, depending on the response and interest in the series I may cover newer models using Generative Adversarial Networks (GANs), and Recurrent Neural Networks.