Segmentación de Imágenes Eficiente utilizando PyTorch Parte 1

Efficient Image Segmentation with PyTorch Part 1.

Conceptos e Ideas

En esta serie de 4 partes, implementaremos la segmentación de imágenes paso a paso desde cero utilizando técnicas de aprendizaje profundo en PyTorch. Comenzaremos la serie con los conceptos e ideas básicos necesarios para la segmentación de imágenes en este artículo.

Figura 1: Imágenes de mascotas y sus máscaras de segmentación (Fuente: The Oxford-IIIT Pet Dataset)

Co-autoría con Naresh Singh

La segmentación de imágenes es una técnica para aislar píxeles pertenecientes a objetos específicos en una imagen. El aislamiento de los píxeles del objeto abre puertas a aplicaciones interesantes. Por ejemplo, en la Figura 1, las imágenes a la derecha son las máscaras correspondientes a las imágenes de mascotas a la izquierda, donde los píxeles amarillos pertenecen a la mascota. Una vez que se identifican los píxeles, podríamos hacer que la mascota sea más grande o cambiar los fondos de las imágenes. Esta técnica se utiliza ampliamente en las funciones de filtro de cara en varias aplicaciones de redes sociales.

Nuestro objetivo al final de esta serie de artículos es dar al lector una idea de todos los pasos necesarios para construir un modelo de visión de IA y ejecutar experimentos con diferentes configuraciones utilizando PyTorch.

Artículos en esta serie

Esta serie es para lectores de todos los niveles de experiencia en aprendizaje profundo. Si desea aprender sobre la práctica del aprendizaje profundo y la visión de IA junto con algo de teoría sólida 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 (este artículo)
  2. Un modelo basado en CNN
  3. Convoluciones separables en profundidad
  4. Un modelo basado en Vision Transformer

Introducción a la segmentación de imágenes

La segmentación de imágenes divide o segmenta una imagen en regiones que corresponden a objetos, fondos y límites. Eche un vistazo a la Figura 2 que muestra una escena de la ciudad. Marca regiones correspondientes a automóviles, motocicletas, árboles, edificios, aceras y otros objetos interesantes con diferentes máscaras de color. Estas regiones se identifican mediante técnicas de segmentación de imágenes.

Históricamente, hemos utilizado herramientas y tuberías de procesamiento de imágenes especializadas para descomponer una imagen en regiones. Sin embargo, debido al increíble crecimiento de datos visuales en las últimas dos décadas, el aprendizaje profundo ha surgido como una solución para la tarea de segmentación de imágenes. Reduce significativamente la dependencia de un experto para construir una estrategia de segmentación de imágenes específica del dominio, como se hacía en el pasado. Un practicante de aprendizaje profundo puede entrenar un modelo de segmentación de imágenes si hay suficientes datos de entrenamiento disponibles para la tarea.

Figura 2: Una escena segmentada del conjunto de datos a2d2 (CC BY-ND 4.0)

¿Cuáles son las aplicaciones de la segmentación de imágenes?

La segmentación de imágenes tiene aplicaciones en diversos campos como la comunicación, la agricultura, el transporte, el cuidado de la salud y más. Además, sus aplicaciones están creciendo con el crecimiento de los datos visuales. Aquí hay algunos ejemplos:

  • En los coches autónomos, un modelo de aprendizaje profundo procesa constantemente la alimentación de video de las cámaras del automóvil para segmentar la escena en objetos como automóviles, peatones y semáforos, lo que es esencial para que el automóvil funcione de manera segura.
  • En la imagen médica, la segmentación de imágenes ayuda a los médicos a identificar áreas en las exploraciones médicas que corresponden a tumores, lesiones y otras anormalidades.
  • En llamadas de video Zoom, se utiliza para preservar la privacidad de un individuo reemplazando el fondo con escenas virtuales.
  • En la agricultura, la información sobre las regiones de maleza y cultivo identificadas mediante la segmentación de imágenes se utiliza para mantener rendimientos de cultivos saludables.

Puede leer más detalles sobre las aplicaciones prácticas de la segmentación de imágenes en esta página de v7labs.

¿Cuáles son los diferentes tipos de tareas de segmentación de imagen?

Existen muchos tipos diferentes de tareas de segmentación de imagen, cada una con sus ventajas y desventajas. Los 2 tipos más comunes de tareas de segmentación de imagen son:

  • Segmentación de clase o semántica : La segmentación de clase asigna una clase semántica como fondo, carretera, coche o persona a cada píxel de la imagen. Si la imagen tiene 2 coches en ella, entonces los píxeles correspondientes a ambos coches serán etiquetados como píxeles de coche. Se utiliza a menudo para tareas como la conducción autónoma y la comprensión de escenas.
  • Segmentación de objeto o instancia : La segmentación de objeto identifica objetos y asigna una máscara a cada objeto único en una imagen. Si la imagen tiene 2 coches en ella, entonces los píxeles correspondientes a cada coche serán identificados como pertenecientes a objetos separados. La segmentación de objetos se utiliza a menudo para realizar el seguimiento de objetos individuales, como un coche autónomo programado para seguir a un coche específico que va delante de él
Figura 3: Segmentaciones de objeto y clase (Fuente: MS Coco - Licencia de atribución de Creative Commons)

En esta serie, nos enfocaremos en la segmentación de clase.

Decisiones necesarias para implementar una segmentación de imagen eficiente

Entrenar eficientemente su modelo para velocidad y precisión implica tomar numerosas decisiones importantes durante el ciclo de vida de su proyecto. Esto incluye (pero no se limita a):

  1. Elección de su marco de trabajo de aprendizaje profundo
  2. Elegir una buena arquitectura de modelo
  3. Seleccionar una función de pérdida efectiva que optimice el aspecto que le interesa
  4. Avoiding el sobreajuste y el subajuste
  5. Evaluando la precisión del modelo

En el resto de este artículo, profundizaremos en cada uno de los aspectos mencionados anteriormente y proporcionaremos numerosos enlaces a artículos que discuten cada tema en mucho más detalle de lo que se puede cubrir aquí.

PyTorch para segmentación de imagen eficiente

¿Qué es PyTorch?

“PyTorch es un marco de trabajo de aprendizaje profundo de código abierto construido para ser flexible y modular para la investigación, con la estabilidad y el soporte necesarios para la implementación en producción. PyTorch proporciona un paquete de Python para características de alto nivel como el cálculo de tensor (como NumPy) con una fuerte aceleración de GPU y TorchScript para una fácil transición entre el modo impaciente y el modo de gráfico. Con el último lanzamiento de PyTorch, el marco proporciona una ejecución basada en gráficos, entrenamiento distribuido, implementación móvil y cuantificación.” (fuente: página de Meta AI en PyTorch)

PyTorch está escrito en Python y C++, lo que lo hace fácil de usar y aprender, así como eficiente para ejecutar. Admite una amplia gama de plataformas de hardware, incluidas las CPU, GPU y TPU (servidor y móvil).

¿Por qué es PyTorch una buena elección para la segmentación de imagen?

PyTorch es una opción popular para la investigación y el desarrollo de aprendizaje profundo, ya que proporciona un entorno flexible y poderoso para crear y entrenar redes neuronales. Es una excelente opción de marco de trabajo para implementar la segmentación de imágenes basada en el aprendizaje profundo debido a las siguientes características:

  • Flexibilidad : PyTorch es un marco de trabajo flexible que le permite crear y entrenar redes neuronales de diversas maneras. Puede utilizar modelos pre-entrenados, o puede crear los suyos desde cero muy fácilmente
  • Soporte de backend : PyTorch admite múltiples backends como hardware GPU / TPU
  • Bibliotecas de dominio : PyTorch tiene un rico conjunto de bibliotecas de dominio que facilitan el trabajo con verticales de datos específicos. Por ejemplo, para la inteligencia artificial relacionada con la visión (imagen / video), PyTorch proporciona una biblioteca llamada torchvision que utilizaremos extensamente en esta serie
  • Fácil de usar y adopción comunitaria : PyTorch es un marco de trabajo fácil de usar que está bien documentado y tiene una gran comunidad de usuarios y desarrolladores. Muchos investigadores utilizan PyTorch para sus experimentos, y los resultados en sus artículos publicados tienen una implementación del modelo en PyTorch disponible libremente

Elección del conjunto de datos

Vamos a utilizar el conjunto de datos Oxford IIIT Pet (con licencia CC BY-SA 4.0) para la segmentación de clases. Este conjunto de datos tiene 3680 imágenes en el conjunto de entrenamiento, y cada imagen tiene asociado un recorte de segmentación. El recorte es una de las 3 clases de píxeles:

  1. Mascota
  2. Fondo
  3. Borde

Elegimos este conjunto de datos ya que es lo suficientemente diverso para proporcionarnos una tarea de segmentación de clases no trivial. Además, no es tan complejo como para acabar dedicando tiempo a cosas como la lidiar con el desequilibrio de clases, etc. y perder de vista el problema principal que queremos aprender y resolver; a saber, la segmentación de clases.

Otros conjuntos de datos populares utilizados para tareas de segmentación de imágenes incluyen:

  1. Pascal VOC (clases de objetos visuales)
  2. MS Coco
  3. Cityscapes

Segmentación de imágenes eficiente con PyTorch

En esta serie, entrenaremos múltiples modelos para la segmentación de clases desde cero. Hay muchas consideraciones a tener en cuenta al construir y entrenar un modelo desde cero. A continuación, veremos algunas de las decisiones clave que debes tomar al hacerlo.

Elección del modelo adecuado para tu tarea

Hay muchos factores a considerar al elegir el modelo de aprendizaje profundo adecuado para la segmentación de imágenes. Algunos de los factores más importantes incluyen:

  • El tipo de tarea de segmentación de imágenes: Hay dos tipos principales de tareas de segmentación de imágenes: segmentación de clases (semántica) y segmentación de objetos (instancias). Dado que nos estamos centrando en el problema más simple de la segmentación de clases, consideraremos modelar nuestro problema en consecuencia.
  • Tamaño y complejidad del conjunto de datos: El tamaño y la complejidad del conjunto de datos afectarán la complejidad del modelo que necesitamos utilizar. Por ejemplo, si estamos trabajando con imágenes con una dimensión espacial pequeña, podemos utilizar un modelo más simple (o menos profundo), como una red completamente convolucional (FCN). Si estamos trabajando con un conjunto de datos grande y complejo, podemos utilizar un modelo más complejo (o más profundo) como un U-Net.
  • Disponibilidad de modelos pre-entrenados: Hay muchos modelos pre-entrenados disponibles para la segmentación de imágenes. Estos modelos pueden usarse como punto de partida para nuestro propio modelo o podemos usarlos directamente. Sin embargo, si usamos un modelo pre-entrenado, podemos estar limitados por las dimensiones espaciales de la imagen de entrada al modelo. En esta serie, nos centraremos en entrenar un modelo desde cero.
  • Recursos computacionales disponibles: Los modelos de aprendizaje profundo pueden ser computacionalmente costosos de entrenar. Si tenemos recursos computacionales limitados, es posible que necesitemos elegir modelos más simples o arquitecturas de modelos más eficientes.

En esta serie, vamos a trabajar con el conjunto de datos Oxford IIIT Pet ya que es lo suficientemente grande como para que podamos entrenar un modelo de tamaño Zepes y requiere el uso de una GPU. Recomendamos encarecidamente crear una cuenta en kaggle.com o utilizar la GPU gratuita de Google Colab para ejecutar los cuadernos y el código referenciado en esta serie.

Arquitecturas de modelos

A continuación, se presentan algunas de las arquitecturas de modelos de aprendizaje profundo más populares para la segmentación de imágenes:

  • U-Net: U-Net es una red neuronal convolucional que se utiliza comúnmente para tareas de segmentación de imágenes. Utiliza conexiones de omisión, que pueden ayudar a entrenar la red más rápido y dar como resultado una precisión general mejor. Si tienes que elegir, ¡U-Net es siempre una excelente opción por defecto!
  • FCN: La Red completamente convolucional (FCN) es una red completamente convolucional, pero no es tan profunda como U-Net. La falta de profundidad se debe principalmente al hecho de que a mayores profundidades de la red, la precisión disminuye. Esto hace que sea más rápido de entrenar, pero puede que no sea tan preciso como U-Net.
  • SegNet: SegNet es una arquitectura de modelo popular similar a U-Net, y utiliza menos memoria de activación que U-Net. Utilizaremos SegNet en esta serie.
  • Transformador de visión (ViT): Los transformadores de visión han ganado popularidad recientemente debido a su estructura simple y la aplicabilidad del mecanismo de atención al texto, la visión y otros dominios. Los transformadores de visión pueden ser más eficientes (en comparación con las CNN) tanto para el entrenamiento como para la inferencia, pero históricamente han necesitado más datos para entrenar en comparación con las redes neuronales convolucionales. También utilizaremos ViT en esta serie.
Figura 4: Arquitectura del modelo U-Net. Fuente: Universidad de Freiburg, autor(es) original(es) de U-Net.

Estos son solo algunos de los muchos modelos de aprendizaje profundo que se pueden utilizar para la segmentación de imágenes. El mejor modelo para su tarea específica dependerá de los factores mencionados anteriormente, de la tarea específica y de sus propios experimentos.

Elegir la función de pérdida adecuada

La elección de la función de pérdida para tareas de segmentación de imagen es importante, ya que puede tener un impacto significativo en el rendimiento del modelo. Existen muchas funciones de pérdida diferentes, cada una con sus propias ventajas y desventajas. Las funciones de pérdida más populares para la segmentación de imágenes son:

  • Pérdida de entropía cruzada : La pérdida de entropía cruzada es una medida de la diferencia entre la distribución de probabilidad predicha y la distribución de probabilidad verdadera
  • Pérdida de IoU : La pérdida de IoU mide la cantidad de superposición entre la máscara predicha y la máscara verdadera por clase. La pérdida de IoU penaliza los casos en los que tanto la predicción como la recuperación se verían afectadas. IoU, tal como se define, no es diferenciable, por lo que debemos ajustarlo ligeramente para usarlo como función de pérdida
  • Pérdida de Dice : La pérdida de Dice también es una medida de la superposición entre la máscara predicha y la máscara verdadera.
  • Pérdida de Tversky : La pérdida de Tversky se propone como una función de pérdida robusta que se puede utilizar para manejar conjuntos de datos desequilibrados.
  • Pérdida focal : La pérdida focal está diseñada para centrarse en ejemplos difíciles, que son ejemplos difíciles de clasificar. Esto puede ser útil para mejorar el rendimiento del modelo en conjuntos de datos desafiantes.

La mejor función de pérdida para una tarea en particular dependerá de los requisitos específicos de la tarea. Por ejemplo, si la precisión es más importante, entonces la pérdida de IoU o la pérdida de Dice pueden ser mejores opciones. Si la tarea está desequilibrada, entonces la pérdida de Tversky o la pérdida focal pueden ser buenas opciones. La función de pérdida específica utilizada puede afectar la tasa de convergencia de su modelo al entrenarlo.

La función de pérdida es un hiperparámetro de su modelo y el uso de una pérdida diferente en función de los resultados que veamos nos permitirá reducir la pérdida más rápidamente y mejorar la precisión del modelo.

Por defecto : En esta serie, utilizaremos la pérdida de entropía cruzada, ya que siempre es una buena opción predeterminada cuando no se conocen los resultados.

Puede utilizar los siguientes recursos para obtener más información sobre las funciones de pérdida.

  1. Funciones de pérdida de PyTorch: La guía definitiva
  2. Torchvision – Pérdidas
  3. Torchmetrics

Echemos un vistazo detallado a la pérdida de IoU que definimos a continuación como una alternativa sólida a la pérdida de entropía cruzada para tareas de segmentación.

La pérdida de IoU personalizada

IoU se define como intersección sobre unión. Para tareas de segmentación de imagen, podemos calcular esto mediante el cálculo (para cada clase) de la intersección de píxeles en esa clase como se predice en el modelo y en la máscara de segmentación verdadera.

Por ejemplo, si tenemos 2 clases:

  1. Fondo
  2. Persona

Luego podemos determinar qué píxeles se clasificaron como una persona y comparar eso con los píxeles verdaderos para una persona y calcular el IoU para la clase de persona. De manera similar, podemos calcular el IoU para la clase de fondo.

Una vez que tenemos estas métricas específicas de clase de IoU, podemos elegir promediarlas sin ponderación o ponderarlas antes de promediarlas para tener en cuenta cualquier tipo de desequilibrio de clase como el que vimos en el ejemplo anterior.

La métrica de IoU como se define requiere que calculemos etiquetas duras para cada métrica. Esto requiere el uso de la función argmax(), que no es diferenciable, por lo que no podemos usar esta métrica como función de pérdida. Por lo tanto, en lugar de usar etiquetas duras, aplicamos softmax() y usamos las probabilidades predichas como etiquetas suaves para calcular la métrica de IoU. Esto da como resultado una métrica diferenciable que luego podemos usar para calcular la pérdida. Por lo tanto, a veces, la métrica de IoU también se conoce como la métrica de IoU suave cuando se usa en el contexto de una función de pérdida.

Si tenemos una métrica (M) que toma valores entre 0,0 y 1,0, podemos calcular la pérdida (L) como:

L = 1 — M

Sin embargo, aquí hay otro truco que se puede usar para convertir una métrica en una pérdida si su métrica tiene un valor entre 0,0 y 1,0. Calcule:

L = -log(M)

Es decir, calcule el logaritmo negativo de la métrica. Esto es significativamente diferente de la formulación anterior, y puede leer más al respecto aquí y aquí. Básicamente, esto resulta en un mejor aprendizaje para su modelo.

Figura 6: Comparación de la pérdida resultante de 1-P(x) con -log(P(x)). Fuente: Autor(es).

Usar IoU como nuestra pérdida también acerca la función de pérdida a capturar lo que realmente nos importa. Hay ventajas y desventajas de usar una métrica de evaluación como función de pérdida. Si está interesado en explorar más este espacio, puede comenzar con esta discusión en stackexchange.

Aumento de Datos

Para entrenar su modelo de manera eficiente y efectiva para una buena precisión, se debe tener en cuenta la cantidad y el tipo de datos de entrenamiento utilizados para entrenar el modelo. La elección de los datos de entrenamiento utilizados tendrá un impacto significativo en la precisión final del modelo, así que si hay algo que desee obtener de esta serie de artículos, ¡debe ser esto!

Típicamente, dividiríamos nuestros datos en 3 partes con las partes estando aproximadamente en las proporciones mencionadas a continuación.

  1. Entrenamiento (80%)
  2. Validación (10%)
  3. Prueba (10%)

Entrenaría su modelo en el conjunto de entrenamiento, evaluaría la precisión en el conjunto de validación y repetiría el proceso hasta que esté satisfecho con las métricas informadas. Solo entonces evaluaría el modelo en el conjunto de prueba y luego informaría los números. Esto se hace para evitar que cualquier tipo de sesgo se infiltre en la arquitectura de su modelo y los hiperparámetros utilizados durante el entrenamiento y la evaluación. En general, cuanto más ajuste su configuración en función de los resultados que ve con los datos de prueba, menos confiables serán sus resultados. Por lo tanto, debemos limitar nuestra toma de decisiones solo a los resultados que vemos en los conjuntos de entrenamiento y validación.

En esta serie, no usaremos un conjunto de prueba. En su lugar, utilizaremos nuestro conjunto de prueba como conjunto de validación y aplicaremos el aumento de datos en el conjunto de prueba para que siempre estemos validando nuestros modelos en datos que son ligeramente diferentes. Esto evita que ajustemos demasiado nuestras decisiones en el conjunto de validación. Esto es un poco de trampa, y lo hacemos solo por conveniencia y como un atajo. Para el desarrollo del modelo de producción, debe intentar seguir la receta estándar mencionada anteriormente.

El conjunto de datos que vamos a usar en esta serie tiene 3680 imágenes en el conjunto de entrenamiento. Si bien esto puede parecer un gran número de imágenes, queremos asegurarnos de que nuestro modelo no se ajuste demasiado a estas imágenes ya que entrenaremos el modelo durante numerosas épocas.

En una sola época de entrenamiento, entrenamos el modelo en todo el conjunto de entrenamiento y, por lo general, entrenamos modelos en producción durante 60 o más épocas. En esta serie, entrenaremos el modelo solo durante 20 épocas para tiempos de iteración más rápidos. Para evitar el ajuste excesivo, emplearemos una técnica llamada aumento de datos que se utiliza para generar nuevos datos de entrada a partir de datos de entrada existentes. La idea básica detrás del aumento de datos para entradas de imagen es que si cambia ligeramente la imagen, parece una nueva imagen para el modelo, pero se puede razonar sobre si las salidas esperadas serían las mismas. Aquí hay algunos ejemplos de aumentos de datos que aplicaremos en esta serie.

  1. Volteo horizontal aleatorio
  2. Alteración aleatoria de color

Aunque vamos a usar la biblioteca Torchvision para aplicar los aumentos de datos anteriores, le recomendamos que evalúe la biblioteca de aumento de datos Albumentations para tareas de visión también. Ambas bibliotecas tienen un conjunto rico de transformaciones disponibles para su uso con datos de imagen. Personalmente, seguimos usando Torchvision simplemente porque es con lo que comenzamos. Albumentations admite primitivas más ricas para el aumento de datos que pueden realizar cambios en la imagen de entrada y en las etiquetas o máscaras de verdad de segmentación al mismo tiempo. Por ejemplo, si va a cambiar el tamaño o voltear una imagen, deberá realizar el mismo cambio en la máscara de segmentación de verdad. Albumentations puede hacer esto automáticamente.

En términos generales, ambas bibliotecas admiten transformaciones que se aplican a la imagen, ya sea a nivel de píxel o que cambian las dimensiones espaciales de la imagen. Las transformaciones a nivel de píxel se llaman transformaciones de color en torchvision, y las transformaciones espaciales se llaman transformaciones geométricas en torchvision.

A continuación, veremos algunos ejemplos de transformaciones tanto a nivel de píxel como geométricas aplicadas por las bibliotecas Torchvision y Albumentations.

Figura 7: Ejemplos de aumentos de datos a nivel de píxel aplicados a imágenes usando Albumentations. Fuente: Albumentations
Figura 8: Ejemplos de aumentos de datos aplicados a imágenes usando transformaciones Torchvision. Fuente: Autor(es) ( cuaderno )
Figura 9: Ejemplos de transformaciones espaciales aplicadas usando Albumentations. Fuente: Autor(es) ( cuaderno )

Evaluar el rendimiento de su modelo

Al evaluar el rendimiento de su modelo, querrá saber cómo funciona en una métrica que sea representativa de la calidad del rendimiento del modelo en datos del mundo real. Por ejemplo, para la tarea de segmentación de imágenes, querríamos saber con qué precisión un modelo puede predecir la clase correcta para un píxel. Por lo tanto, decimos que la precisión de píxeles es la métrica de validación para este modelo.

Podría utilizar su métrica de evaluación como función de pérdida (¡por qué no optimizar lo que realmente le importa!) excepto que esto no siempre es posible.

Además de la precisión, también realizaremos un seguimiento de la métrica IoU (también llamada índice de Jaccard), y la métrica personalizada IoU que definimos anteriormente.

Para leer más sobre varias métricas de precisión aplicables a tareas de segmentación de imágenes, consulte:

  • Todas las métricas de segmentación — Kaggle
  • Cómo evaluar modelos de segmentación de imágenes
  • Evaluación de modelos de segmentación de imágenes

La desventaja de utilizar la precisión de píxeles como métrica de rendimiento

Aunque la métrica de precisión puede ser una buena opción predeterminada para medir el rendimiento de las tareas de segmentación de imágenes, tiene sus propias desventajas, que pueden ser significativas según su situación específica.

Por ejemplo, considere una tarea de segmentación de imágenes para identificar los ojos de una persona en una imagen, y marcar esos píxeles en consecuencia. El modelo clasificará cada píxel como uno de:

  1. Fondo
  2. Ojo

Suponga que hay solo una persona en cada imagen, y el 98% de los píxeles no corresponden a un ojo. En este caso, el modelo puede aprender simplemente a predecir cada píxel como un píxel de fondo y lograr una precisión de píxeles del 98% en la tarea de segmentación. ¡Guau!

Figura 10: Una imagen del rostro de una persona y la correspondiente máscara de segmentación para sus ojos. Puede ver que los ojos ocupan una fracción muy pequeña de la imagen en general. Fuente: Adaptado de Unsplash

En tales casos, el uso de la métrica IoU o el coeficiente de Dice puede ser una idea mucho mejor, ya que la métrica de IoU capturaría cuánto de la predicción fue correcta, y no estaría necesariamente sesgada por la región que ocupa cada clase o categoría en la imagen original. Incluso podría considerar el uso del coeficiente de IoU o Dice por clase como métrica. Esto puede capturar mejor el rendimiento de su modelo para la tarea en cuestión.

Cuando consideramos únicamente la precisión y la recuperación de píxeles, podemos capturar los detalles que buscamos en el objeto para el cual queremos calcular la máscara de segmentación (ojos en el ejemplo anterior).

Ahora que hemos cubierto gran parte de los fundamentos teóricos de la segmentación de imágenes, tomemos un desvío hacia consideraciones relacionadas con la inferencia y la implementación de la segmentación de imágenes para cargas de trabajo del mundo real.

Tamaño del modelo y latencia de inferencia

Por último, queremos asegurarnos de que nuestro modelo tenga un número razonable de parámetros pero no demasiados, ya que queremos un modelo pequeño y eficiente. Abordaremos este aspecto con más detalle en una publicación futura relacionada con la reducción del tamaño del modelo utilizando arquitecturas de modelo eficientes.

En cuanto a la latencia de inferencia, lo que importa es el número de operaciones matemáticas (mult-adds) que ejecuta nuestro modelo. Tanto el tamaño del modelo como los mult-adds se pueden mostrar utilizando el paquete torchinfo. Si bien los mult-adds son una gran aproximación para determinar la latencia del modelo, puede haber una gran variación en la latencia en varios backends. La única forma real de determinar el rendimiento de su modelo en un backend o dispositivo específico es perfilarlo y evaluarlo en ese dispositivo específico con el conjunto de entradas que espera ver en entornos de producción.

de torchinfo importación summarymodel = nn.Linear(1000, 500)summary(  modelo,  input_size=(1, 1000),  col_names=["kernel_size", "output_size", "num_params", "mult_adds"],  col_width=15,)

Salida:

====================================================================================================Layer (type:depth-idx)                   Kernel Shape    Output Shape    Param #         Mult-Adds====================================================================================================Linear                                   --              [1, 500]        500,500         500,500====================================================================================================Total params: 500,500Trainable params: 500,500Non-trainable params: 0Total mult-adds (M): 0.50====================================================================================================Input size (MB): 0.00Forward/backward pass size (MB): 0.00Params size (MB): 2.00Estimated Total Size (MB): 2.01====================================================================================================

Lectura adicional

Los siguientes artículos proporcionan información adicional sobre los conceptos básicos de la segmentación de imágenes. Si eres de las personas que les gusta leer diferentes perspectivas sobre el mismo tema, considere leerlos.

  1. Guía de segmentación de imágenes en visión por computadora: mejores prácticas
  2. Introducción a la segmentación de imágenes: deep learning vs. tradicional [+ ejemplos]
  3. Segmentación de imágenes: conceptos básicos y 5 técnicas clave

Si desea experimentar con el conjunto de datos de mascotas de Oxford IIIT y utilizar torchvision y Albumentations para realizar aumentos de imagen, hemos proporcionado un cuaderno de inicio en Kaggle que puede clonar y con el que puede jugar. ¡Muchas de las imágenes en este artículo fueron generadas por ese cuaderno!

Resumen del artículo

Aquí hay un resumen rápido de lo que hemos discutido hasta ahora.

  • La segmentación de imágenes es una técnica para dividir una imagen en múltiples segmentos (fuente: Wikipedia)
  • Hay dos tipos principales de tareas de segmentación de imágenes: segmentación de clase (semántica) y segmentación de objeto (instancia). La segmentación de clase asigna cada píxel en una imagen a una clase semántica. La segmentación de objetos identifica cada objeto individual en una imagen y asigna una máscara a cada objeto único.
  • Utilizaremos PyTorch como marco de aprendizaje profundo y el conjunto de datos de mascotas de Oxford IIIT en esta serie de segmentación de imágenes eficiente
  • Hay muchos factores que considerar al elegir el modelo de aprendizaje profundo adecuado para la segmentación de imágenes, incluido (pero no limitado a) el tipo de tarea de segmentación de imágenes, el tamaño y la complejidad del conjunto de datos, la disponibilidad de modelos pre-entrenados y los recursos computacionales disponibles. Algunas de las arquitecturas de modelos de aprendizaje profundo más populares para la segmentación de imágenes incluyen U-Net, FCN, SegNet y Vision Transformer (ViT)
  • La elección de la función de pérdida para tareas de segmentación de imágenes es importante, ya que puede tener un impacto significativo en el rendimiento del modelo y en la eficiencia del entrenamiento. Para tareas de segmentación de imágenes, podemos usar pérdida de entropía cruzada, pérdida de IoU, pérdida de Dice o pérdida focal (entre otras)
  • La ampliación de datos es una técnica valiosa que se utiliza para evitar el sobreajuste y también para lidiar con datos de entrenamiento insuficientes
  • Evaluando el rendimiento de su modelo es importante para la tarea en cuestión y uno debe elegir esta métrica cuidadosamente
  • El tamaño del modelo y la latencia de inferencia son métricas vitales a considerar al desarrollar un modelo, especialmente si pretende utilizarlo en aplicaciones en tiempo real como la segmentación facial o la eliminación de ruido de fondo

En el próximo post, veremos una Red Neuronal Convolucional (CNN) construida desde cero usando PyTorch para realizar segmentación de imágenes en el conjunto de datos Oxford IIIT Pet.

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

Técnicas de muestreo y comparación prácticas, en Python

Estaba poniendo el árbol de Navidad con mi esposa. Fuimos al sótano, cogimos el árbol, lo llevamos arriba y empezamos...

Inteligencia Artificial

El Cuadro de Búsqueda de Google Cambió el Significado de la Información

La búsqueda en la web prometía resolver preguntas. En cambio, trajo consigo un apocalipsis suave de la verdad.

Inteligencia Artificial

IA generativa para conocimientos biomédicos

Explore OpenBIOML y BIO GPT para la IA generativa, un nuevo enfoque para entender y tratar enfermedades utilizando Mo...

Inteligencia Artificial

Descubre Davidsonian Scene Graph un marco de IA revolucionario para evaluar la IA de texto a imagen con precisión

Los modelos de texto a imagen (T2I) son difíciles de evaluar y a menudo dependen de métodos de generación y respuesta...

Inteligencia Artificial

Este artículo de Alibaba Group presenta FederatedScope-LLM un paquete integral para el ajuste fino de LLMs en el aprendizaje federado

Hoy en día, plataformas como Hugging Face han facilitado el acceso y la utilización de Modelos de Lenguaje de Gran Ta...