Una guía completa sobre la arquitectura UNET | Dominando la segmentación de imágenes

Guía completa sobre arquitectura UNET | Dominio de segmentación de imágenes

Introducción

En el emocionante campo de la visión por computadora, donde las imágenes contienen muchos secretos e información, distinguir y resaltar elementos es crucial. La segmentación de imágenes, el proceso de dividir las imágenes en regiones u objetos significativos, es esencial en diversas aplicaciones, desde imágenes médicas hasta conducción autónoma y reconocimiento de objetos. La segmentación precisa y automática ha sido durante mucho tiempo un desafío, con enfoques tradicionales que a menudo no logran la precisión y eficiencia deseada. Entra en escena la arquitectura UNET, un método inteligente que ha revolucionado la segmentación de imágenes. Con su diseño sencillo y técnicas innovadoras, UNET ha allanado el camino para obtener resultados de segmentación más precisos y robustos. Ya sea que seas un recién llegado al emocionante campo de la visión por computadora o un practicante experimentado que busca mejorar tus habilidades de segmentación, este artículo de blog exhaustivo desentrañará las complejidades de UNET y proporcionará una comprensión completa de su arquitectura, componentes y utilidad.

Este artículo fue publicado como parte del Data Science Blogathon.

Entendiendo la Red Neuronal Convolucional

Las CNN son un modelo de aprendizaje profundo frecuentemente empleado en tareas de visión por computadora, incluyendo clasificación de imágenes, reconocimiento de objetos y segmentación de imágenes. Las CNN se utilizan principalmente para aprender y extraer información relevante de las imágenes, lo que las hace extremadamente útiles en el análisis de datos visuales.

Los componentes críticos de las CNN

  • Capas de convolución: Las CNN están compuestas por una colección de filtros aprendibles (núcleos) que se convolucionan con la imagen de entrada o los mapas de características. Cada filtro aplica una multiplicación elemento a elemento y una suma para producir un mapa de características que resalta patrones específicos o características locales en la entrada. Estos filtros pueden capturar muchos elementos visuales, como bordes, esquinas y texturas.

  • Capas de agrupación: Se crean los mapas de características mediante las capas de convolución que se reducen de tamaño utilizando capas de agrupación. La agrupación reduce las dimensiones espaciales de los mapas de características mientras se mantiene la información más importante, lo que disminuye la complejidad computacional de las capas siguientes y hace que el modelo sea más resistente a las fluctuaciones de la entrada. La operación de agrupación más común es la agrupación máxima, que toma el valor más significativo dentro de un vecindario dado.
  • Funciones de activación: Introducen la no linealidad en el modelo de CNN mediante funciones de activación. Se aplican a las salidas de las capas de convolución o agrupación elemento a elemento, lo que permite que la red comprenda asociaciones complicadas y tome decisiones no lineales. Debido a su simplicidad y eficiencia para abordar el problema del gradiente desvaneciente, la función de activación Rectified Linear Unit (ReLU) es común en las CNN.
  • Capas totalmente conectadas: Las capas totalmente conectadas, también llamadas capas densas, utilizan las características obtenidas para realizar la operación final de clasificación o regresión. Conectan cada neurona de una capa con cada neurona de la siguiente, lo que permite que la red aprenda representaciones globales y tome decisiones de alto nivel basadas en la entrada combinada de las capas anteriores.

La red comienza con un conjunto de capas de convolución para capturar características de bajo nivel, seguidas de capas de agrupación. Las capas de convolución más profundas aprenden características de nivel superior a medida que evoluciona la red. Finalmente, se utilizan una o más capas completamente conectadas para la operación de clasificación o regresión.

Necesidad de una Red Totalmente Conectada

Las CNN tradicionales están generalmente destinadas a tareas de clasificación de imágenes en las que se asigna una sola etiqueta a toda la imagen de entrada. Por otro lado, las arquitecturas de CNN tradicionales tienen problemas con tareas más detalladas como la segmentación semántica, en la que cada píxel de una imagen debe ser clasificado en varias clases o regiones. Aquí es donde entran en juego las Redes Totalmente Convolucionales (FCNs).

Limitaciones de las Arquitecturas de CNN Tradicionales en Tareas de Segmentación

Pérdida de información espacial: Las CNN tradicionales utilizan capas de agrupación para reducir gradualmente la dimensionalidad espacial de los mapas de características. Si bien este muestreo ayuda a capturar características de alto nivel, resulta en una pérdida de información espacial, lo que dificulta la detección y segmentación precisa de objetos a nivel de píxel.

Tamaño de entrada fijo: Las arquitecturas de CNN suelen estar diseñadas para aceptar imágenes de un tamaño específico. Sin embargo, las imágenes de entrada pueden tener diversas dimensiones en tareas de segmentación, lo que dificulta el manejo de entradas de tamaño variable con las CNN típicas.

Precisión limitada de localización: Los CNN tradicionales suelen utilizar capas completamente conectadas al final para proporcionar un vector de salida de tamaño fijo para la clasificación. Debido a que no retienen información espacial, no pueden localizar con precisión objetos o regiones dentro de la imagen.

Fully Convolutional Networks (FCNs) como solución para la segmentación semántica

Al trabajar exclusivamente en capas convolucionales y mantener la información espacial a lo largo de la red, las Fully Convolutional Networks (FCNs) abordan las limitaciones de las arquitecturas clásicas de CNN en tareas de segmentación. Las FCNs tienen la intención de hacer predicciones píxel por píxel, asignando a cada píxel de la imagen de entrada una etiqueta o clase. Las FCNs permiten la construcción de un mapa de segmentación denso con predicciones a nivel de píxel mediante el aumento de tamaño de los mapas de características. Se utilizan convoluciones transpuestas (también conocidas como capas de deconvolución o de aumento de tamaño) para reemplazar las capas completamente conectadas después del diseño del CNN. La resolución espacial de los mapas de características se incrementa mediante convoluciones transpuestas, lo que les permite tener el mismo tamaño que la imagen de entrada.

Durante el aumento de tamaño, las FCNs suelen utilizar conexiones de salto, evitando capas específicas y enlazando directamente mapas de características de niveles inferiores con los de niveles superiores. Estas relaciones de salto ayudan a preservar detalles finos y la información contextual, mejorando la precisión de localización de las regiones segmentadas. Las FCNs son extremadamente efectivas en diversas aplicaciones de segmentación, incluyendo la segmentación de imágenes médicas, el análisis de escenas y la segmentación de instancias. Ahora pueden manejar imágenes de entrada de varios tamaños, proporcionar predicciones a nivel de píxel y conservar información espacial en toda la red mediante el uso de FCNs para la segmentación semántica.

Segmentación de imágenes

La segmentación de imágenes es un proceso fundamental en la visión por computadora en el que una imagen se divide en muchas partes o segmentos significativos y separados. A diferencia de la clasificación de imágenes, que proporciona una única etiqueta para toda la imagen, la segmentación agrega etiquetas a cada píxel o grupo de píxeles, dividiendo así la imagen en partes semánticamente significativas. La segmentación de imágenes es importante porque permite una comprensión más detallada del contenido de una imagen. Podemos extraer información considerable sobre los límites de los objetos, formas, tamaños y relaciones espaciales al segmentar una imagen en múltiples partes. Este análisis detallado es fundamental en diversas tareas de visión por computadora, permitiendo aplicaciones mejoradas y soportando interpretaciones de datos visuales de nivel superior.

Comprendiendo la arquitectura UNET

Las tecnologías tradicionales de segmentación de imágenes, como la anotación manual y la clasificación píxel a píxel, tienen diversas desventajas que las hacen ineficientes y difíciles de utilizar en trabajos de segmentación precisos y efectivos. Debido a estas limitaciones, se han desarrollado soluciones más avanzadas, como la arquitectura UNET. Veamos las deficiencias de los métodos anteriores y por qué se creó UNET para superar estos problemas.

  • Anotación manual: La anotación manual implica dibujar y marcar los límites de las imágenes o regiones de interés. Si bien este método produce resultados de segmentación confiables, es lento, requiere mucho trabajo y es propenso a errores humanos. La anotación manual no es escalable para conjuntos de datos grandes y es difícil mantener la consistencia y el acuerdo entre anotadores, especialmente en tareas de segmentación sofisticadas.
  • Clasificación píxel a píxel: Otro enfoque común es la clasificación píxel a píxel, en la que cada píxel de una imagen se clasifica de forma independiente, generalmente utilizando algoritmos como árboles de decisión, máquinas de vectores de soporte (SVM) o bosques aleatorios. Sin embargo, la clasificación píxel a píxel tiene dificultades para capturar el contexto global y las dependencias entre píxeles circundantes, lo que resulta en problemas de sobre o subsegmentación. No puede considerar las relaciones espaciales y con frecuencia no ofrece límites precisos de objetos.

Superar los desafíos

La arquitectura UNET se desarrolló para abordar estas limitaciones y superar los desafíos enfrentados por los enfoques tradicionales de segmentación de imágenes. Así es cómo UNET resuelve estos problemas:

  • Aprendizaje de extremo a extremo: UNET utiliza una técnica de aprendizaje de extremo a extremo, lo que significa que aprende a segmentar imágenes directamente a partir de pares de entrada-salida sin la anotación del usuario. UNET puede extraer automáticamente características clave y realizar una segmentación precisa mediante el entrenamiento en un gran conjunto de datos etiquetados, eliminando la necesidad de la anotación manual laboriosa.
  • Arquitectura completamente convolucional: UNET se basa en una arquitectura completamente convolucional, lo que significa que está compuesta completamente por capas convolucionales y no incluye capas completamente conectadas. Esta arquitectura permite que UNET funcione con imágenes de entrada de cualquier tamaño, aumentando su flexibilidad y adaptabilidad a diversas tareas de segmentación y variaciones de entrada.
  • Arquitectura en forma de U con conexiones de salto: La arquitectura característica de la red incluye una ruta de codificación (ruta de contracción) y una ruta de decodificación (ruta de expansión), lo que le permite recopilar información local y contexto global. Las conexiones de salto conectan la ruta de codificación con la de decodificación, manteniendo información crítica de capas anteriores y permitiendo una segmentación más precisa.
  • Información contextual y localización: UNET utiliza las conexiones de salto para agregar mapas de características multiescala de múltiples capas, permitiendo que la red absorba información contextual y capture detalles en diferentes niveles de abstracción. Esta integración de información mejora la precisión de la localización, permitiendo límites de objetos exactos y resultados de segmentación precisos.
  • Aumento de datos y regularización: UNET emplea técnicas de aumento de datos y regularización para mejorar su resistencia y capacidad de generalización durante el entrenamiento. Para aumentar la diversidad de los datos de entrenamiento, el aumento de datos implica agregar numerosas transformaciones a las imágenes de entrenamiento, como rotaciones, volteos, escalados y deformaciones. Técnicas de regularización como la eliminación de datos y la normalización por lotes evitan el sobreajuste y mejoran el rendimiento del modelo en datos desconocidos.

Resumen de la Arquitectura UNET

UNET es una arquitectura de red neuronal convolucional totalmente convolucional (FCN) construida para aplicaciones de segmentación de imágenes. Fue propuesta por primera vez en 2015 por Olaf Ronneberger, Philipp Fischer y Thomas Brox. UNET se utiliza con frecuencia por su precisión en la segmentación de imágenes y se ha convertido en una opción popular en diversas aplicaciones de imágenes médicas. UNET combina un camino de codificación, también llamado camino de contracción, con un camino de decodificación llamado camino de expansión. La arquitectura recibe su nombre por su apariencia en forma de U cuando se representa en un diagrama. Debido a esta arquitectura en forma de U, la red puede capturar tanto características locales como contexto global, lo que resulta en resultados de segmentación precisos.

Componentes Críticos de la Arquitectura UNET

  • Camino de Contracción (Camino de Codificación): El camino de contracción de UNET comprende capas convolucionales seguidas de operaciones de agrupación máxima (max pooling). Este método captura características de alta resolución y bajo nivel al reducir gradualmente las dimensiones espaciales de la imagen de entrada.
  • Camino de Expansión (Camino de Decodificación): Se utilizan convoluciones transpuestas, también conocidas como capas deconvolucionales o capas de aumento de muestreo, para aumentar el muestreo de los mapas de características del camino de codificación en el camino de expansión de UNET. La resolución espacial de los mapas de características se incrementa durante la fase de aumento de muestreo, lo que permite a la red reconstruir un mapa de segmentación denso.
  • Conexiones de Salto (Skip Connections): Se utilizan conexiones de salto en UNET para conectar capas correspondientes de los caminos de codificación y decodificación. Estas conexiones permiten a la red recopilar datos tanto locales como globales. La red conserva información espacial esencial y mejora la precisión de la segmentación al integrar mapas de características de capas anteriores con los del camino de decodificación.
  • Concatenación: La concatenación se utiliza comúnmente para implementar conexiones de salto en UNET. Los mapas de características del camino de codificación se concatenan con los mapas de características aumentados de la decodificación durante el procedimiento de aumento de muestreo. Esta concatenación permite a la red incorporar información multinivel para una segmentación adecuada, explotando el contexto de alto nivel y las características de bajo nivel.
  • Capas Totalmente Convolucionales: UNET comprende capas convolucionales sin capas completamente conectadas. Esta arquitectura convolucional permite a UNET manejar imágenes de tamaños ilimitados mientras preserva la información espacial en toda la red, lo que la hace flexible y adaptable a diversas tareas de segmentación.

El camino de codificación, o camino de contracción, es un componente esencial de la arquitectura UNET. Es responsable de extraer información de alto nivel de la imagen de entrada mientras reduce gradualmente las dimensiones espaciales.

Capas Convolucionales

El proceso de codificación comienza con un conjunto de capas convolucionales. Las capas convolucionales extraen información a múltiples escalas aplicando un conjunto de filtros aprendibles a la imagen de entrada. Estos filtros operan en el campo receptivo local, lo que permite a la red capturar patrones espaciales y características menores. Con cada capa convolucional, la profundidad de los mapas de características aumenta, lo que permite a la red aprender representaciones más complejas.

Función de Activación

Después de cada capa convolucional, se aplica una función de activación como la Unidad Lineal Rectificada (ReLU) elemento por elemento para inducir la no linealidad en la red. La función de activación ayuda a la red a aprender correlaciones no lineales entre las imágenes de entrada y las características recuperadas.

Capas de Agrupación

Se utilizan capas de agrupación después de las capas convolucionales para reducir la dimensionalidad espacial de los mapas de características. Las operaciones, como la agrupación máxima (max pooling), dividen los mapas de características en regiones no superpuestas y mantienen solo el valor máximo dentro de cada zona. Esto reduce la resolución espacial mediante el muestreo descendente de los mapas de características, lo que permite a la red capturar datos más abstractos y de nivel superior.

El objetivo del camino de codificación es capturar características a diversas escalas y niveles de abstracción de manera jerárquica. El proceso de codificación se enfoca en extraer contexto global e información de alto nivel a medida que las dimensiones espaciales disminuyen.

Conexiones de Salto

La disponibilidad de conexiones de salto que conectan niveles adecuados desde el camino de codificación al camino de decodificación es una de las características distintivas de la arquitectura UNET. Estos enlaces de salto son fundamentales para mantener datos clave durante el proceso de codificación.

Los mapas de características de capas anteriores recopilan detalles locales e información detallada durante el camino de codificación. Estos mapas de características se concatenan con los mapas de características aumentados en el proceso de decodificación utilizando conexiones de salto. Esto permite que la red incorpore datos multinivel, características de bajo nivel y contexto de alto nivel en el proceso de segmentación.

Al conservar información espacial de capas anteriores, UNET puede localizar objetos de manera confiable y mantener detalles más finos en los resultados de segmentación. Las conexiones de salto de UNET ayudan a abordar el problema de pérdida de información causada por el muestreo descendente. Los enlaces de salto permiten una integración de información local y global más excelente, mejorando el rendimiento de la segmentación en general.

En resumen, el enfoque de codificación UNET es fundamental para capturar características de alto nivel y reducir las dimensiones espaciales de la imagen de entrada. La ruta de codificación extrae representaciones abstractas progresivamente a través de capas convolucionales, funciones de activación y capas de agrupación. Al integrar características locales y contexto global, la introducción de enlaces de salto permite preservar información espacial crítica, facilitando resultados de segmentación confiables.

Ruta de decodificación en UNET

Un componente crítico de la arquitectura UNET es la ruta de decodificación, también conocida como ruta de expansión. Es responsable de aumentar el muestreo de los mapas de características de la ruta de codificación y construir la máscara de segmentación final.

Capas de aumento de muestreo (convoluciones transpuestas)

Para aumentar la resolución espacial de los mapas de características, el método de decodificación UNET incluye capas de aumento de muestreo, frecuentemente realizadas utilizando convoluciones transpuestas o deconvoluciones. Las convoluciones transpuestas son esencialmente lo opuesto a las convoluciones regulares. Mejoran las dimensiones espaciales en lugar de disminuirlas, lo que permite el aumento de muestreo. Al construir un núcleo disperso y aplicarlo al mapa de características de entrada, las convoluciones transpuestas aprenden a aumentar el muestreo de los mapas de características. Durante este proceso, la red aprende a llenar los vacíos entre las ubicaciones espaciales actuales, aumentando así la resolución de los mapas de características.

Concatenación

Los mapas de características de las capas anteriores se concatenan con los mapas de características aumentados durante la fase de decodificación. Esta concatenación permite que la red agregue información de múltiples escalas para una segmentación correcta, aprovechando el contexto de alto nivel y las características de bajo nivel. Además del aumento de muestreo, la ruta de decodificación UNET incluye conexiones de salto desde los niveles comparables de la ruta de codificación.

La red puede recuperar e integrar características detalladas perdidas durante la codificación mediante la concatenación de mapas de características de las conexiones de salto. Esto permite una localización y delimitación más precisa de objetos en la máscara de segmentación.

El proceso de decodificación en UNET reconstruye un mapa de segmentación denso que se ajusta a la resolución espacial de la imagen de entrada mediante el aumento progresivo de los mapas de características e incluyendo conexiones de salto.

La función de la ruta de decodificación es recuperar información espacial perdida durante la ruta de codificación y refinar los resultados de segmentación. Combina detalles de codificación de bajo nivel con contexto de alto nivel obtenido de las capas de aumento de muestreo para proporcionar una máscara de segmentación precisa y completa.

UNET puede aumentar la resolución espacial de los mapas de características utilizando convoluciones transpuestas en el proceso de decodificación, aumentándolos para que coincidan con el tamaño de la imagen original. Las convoluciones transpuestas ayudan a la red a generar una máscara de segmentación densa y detallada al aprender a llenar los vacíos y expandir las dimensiones espaciales.

En resumen, el proceso de decodificación en UNET reconstruye la máscara de segmentación aumentando la resolución espacial de los mapas de características mediante capas de aumento de muestreo y conexiones de salto. Las convoluciones transpuestas son críticas en esta fase porque permiten a la red aumentar el muestreo de los mapas de características y construir una máscara de segmentación detallada que coincide con la imagen de entrada original.

Rutas de contracción y expansión en UNET

La arquitectura UNET sigue una estructura de “codificador-decodificador”, donde la ruta de contracción representa el codificador y la ruta de expansión representa el decodificador. Este diseño se asemeja a la codificación de información en una forma comprimida y luego decodificarla para reconstruir los datos originales.

Ruta de contracción (Codificador)

El codificador en UNET es la ruta de contracción. Extrae contexto y comprime la imagen de entrada mediante la disminución gradual de las dimensiones espaciales. Este método incluye capas convolucionales seguidas de procedimientos de agrupación como agrupación máxima para disminuir el muestreo de los mapas de características. La ruta de contracción es responsable de obtener características de alto nivel, aprender contexto global y disminuir la resolución espacial. Se enfoca en comprimir y abstraer la imagen de entrada, capturando eficientemente información relevante para la segmentación.

Ruta de expansión (Decodificador)

El decodificador en UNET es la ruta de expansión. Aumenta el muestreo de los mapas de características de la ruta de contracción, recupera información espacial y genera el mapa de segmentación final. La ruta de expansión comprende capas de aumento de muestreo, a menudo realizadas con convoluciones transpuestas o deconvoluciones para aumentar la resolución espacial de los mapas de características. La ruta de expansión reconstruye las dimensiones espaciales originales a través de conexiones de salto mediante la integración de los mapas de características aumentados con los mapas equivalentes de la ruta de contracción. Este método permite que la red recupere características detalladas y localice correctamente los elementos.

El diseño UNET captura el contexto global y los detalles locales mezclando las rutas de contracción y expansión. La ruta de contracción comprime la imagen de entrada en una representación compacta, decidida a construir un mapa de segmentación detallado mediante la ruta de expansión. La ruta de expansión se encarga de decodificar la representación comprimida en un mapa de segmentación denso y preciso. Reconstruye la información espacial faltante y refina los resultados de segmentación. Esta estructura codificador-decodificador permite una segmentación precisa utilizando contexto de alto nivel e información espacial detallada.

En resumen, las rutas de contracción y expansión de UNET se asemejan a una estructura de “codificador-decodificador”. La ruta de expansión es el decodificador, recuperando información espacial y generando el mapa de segmentación final. En contraste, la ruta de contracción sirve como el codificador, capturando contexto y comprimiendo la imagen de entrada. Esta arquitectura permite que UNET codifique y decodifique información de manera efectiva, lo que permite una segmentación de imagen precisa y exhaustiva.

Conexiones de salto en UNET

Las conexiones de salto son esenciales para el diseño de UNET porque permiten que la información viaje entre las rutas de contracción (codificación) y expansión (decodificación). Son críticas para mantener la información espacial y mejorar la precisión de la segmentación.

Preservación de la información espacial

Algunas informaciones espaciales pueden perderse durante la ruta de codificación a medida que los mapas de características se someten a procedimientos de reducción de tamaño, como el muestreo máximo. Esta pérdida de información puede dar lugar a una menor precisión de localización y una pérdida de detalles finos en la máscara de segmentación.

Al establecer conexiones directas entre las capas correspondientes en los procesos de codificación y decodificación, las conexiones de salto ayudan a abordar este problema. Estas conexiones protegen la información espacial vital que, de lo contrario, se perdería durante el muestreo. Estas conexiones permiten que la información de la ruta de codificación evite el muestreo y se transmita directamente a la ruta de decodificación.

Fusión de información a múltiples escalas

Las conexiones de salto permiten la fusión de información a múltiples escalas de muchas capas de la red. Los niveles posteriores del proceso de codificación capturan contexto de alto nivel e información semántica, mientras que las capas anteriores capturan detalles locales e información detallada. UNET puede combinar con éxito información local y global conectando estos mapas de características de la ruta de codificación con las capas equivalentes en la ruta de decodificación. Esta integración de información a múltiples escalas mejora la precisión de la segmentación en general. La red puede utilizar datos de bajo nivel de la ruta de codificación para refinar los resultados de segmentación en la ruta de decodificación, lo que permite una localización más precisa y una mejor delimitación del límite del objeto.

Combinación de contexto de alto nivel y detalles de bajo nivel

Las conexiones de salto permiten que la ruta de decodificación combine contexto de alto nivel y detalles de bajo nivel. Los mapas de características concatenados de las conexiones de salto incluyen los mapas de características aumentados de la ruta de decodificación y los mapas de características de la ruta de codificación.

Esta combinación permite que la red aproveche el contexto de alto nivel registrado en la ruta de decodificación y las características detalladas capturadas en la ruta de codificación. La red puede incorporar información de varios tamaños, lo que permite una segmentación más precisa y detallada.

UNET puede aprovechar la información a múltiples escalas, preservar detalles espaciales y fusionar contexto de alto nivel con detalles de bajo nivel mediante la adición de conexiones de salto. Como resultado, la precisión de la segmentación mejora, la localización de objetos mejora y se retiene información detallada en la máscara de segmentación.

En conclusión, las conexiones de salto en UNET son fundamentales para mantener la información espacial, integrar información a múltiples escalas y mejorar la precisión de la segmentación. Proporcionan un flujo directo de información a través de las rutas de codificación y decodificación, lo que permite que la red recopile detalles locales y globales, lo que resulta en una segmentación de imagen más precisa y detallada.

Función de pérdida en UNET

Es fundamental seleccionar una función de pérdida adecuada al entrenar UNET y optimizar sus parámetros para tareas de segmentación de imágenes. UNET utiliza con frecuencia funciones de pérdida amigables para la segmentación, como el coeficiente Dice o la pérdida de entropía cruzada.

Pérdida del coeficiente Dice

El coeficiente Dice es una estadística de similitud que calcula la superposición entre las máscaras de segmentación anticipadas y verdaderas. La pérdida del coeficiente Dice, o pérdida suave de Dice, se calcula restando uno del coeficiente Dice. Cuando las máscaras anticipadas y las de verdad se alinean bien, la pérdida se minimiza, lo que resulta en un coeficiente Dice más alto.

La pérdida del coeficiente Dice es especialmente efectiva para conjuntos de datos desequilibrados en los que la clase de fondo tiene muchos píxeles. Al penalizar falsos positivos y falsos negativos, promueve que la red divida con precisión las regiones tanto del primer plano como del fondo.

Pérdida de entropía cruzada

Utilice la función de pérdida de entropía cruzada en tareas de segmentación de imágenes. Mide la disimilitud entre las probabilidades de clase predichas y las etiquetas verdaderas. Trate cada píxel como un problema de clasificación independiente en la segmentación de imágenes, y la pérdida de entropía cruzada se calcula píxel a píxel.

La pérdida de entropía cruzada anima a la red a asignar altas probabilidades a las etiquetas de clase correctas para cada píxel. Penaliza las desviaciones de la verdad, promoviendo resultados de segmentación precisos. Esta función de pérdida es efectiva cuando las clases de primer plano y fondo están equilibradas o cuando están involucradas múltiples clases en la tarea de segmentación.

La elección entre la pérdida del coeficiente Dice y la pérdida de entropía cruzada depende de los requisitos específicos de la tarea de segmentación y las características del conjunto de datos. Ambas funciones de pérdida tienen ventajas y se pueden combinar o personalizar según necesidades específicas.

1: Importando Librerías

import tensorflow as tf
import os
import numpy as np
from tqdm import tqdm
from skimage.io import imread, imshow
from skimage.transform import resize
import matplotlib.pyplot as plt
import random

2: Dimensiones de la Imagen – Configuración

IMG_WIDTH = 128
IMG_HEIGHT = 128
IMG_CHANNELS = 3

3: Configurando la Aleatoriedad

seed = 42
np.random.seed = seed

4: Importando el Conjunto de Datos

# Datos descargados de - https://www.kaggle.com/competitions/data-science-bowl-2018/data 
# Importando conjuntos de datos
TRAIN_PATH = 'stage1_train/'
TEST_PATH = 'stage1_test/'

5: Leyendo todas las Imágenes Presentes en la Subcarpeta

train_ids = next(os.walk(TRAIN_PATH))[1]
test_ids = next(os.walk(TEST_PATH))[1]

6: Entrenamiento

X_train = np.zeros((len(train_ids), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)
Y_train = np.zeros((len(train_ids), IMG_HEIGHT, IMG_WIDTH, 1), dtype=np.bool)

7: Redimensionando las Imágenes

print('Redimensionando imágenes de entrenamiento y máscaras')
for n, id_ in tqdm(enumerate(train_ids), total=len(train_ids)):   
    path = TRAIN_PATH + id_
    img = imread(path + '/images/' + id_ + '.png')[:,:,:IMG_CHANNELS]  
    img = resize(img, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)
    X_train[n] = img  # Rellenar X_train vacío con valores de img
    mask = np.zeros((IMG_HEIGHT, IMG_WIDTH, 1), dtype=np.bool)
    for mask_file in next(os.walk(path + '/masks/'))[2]:
        mask_ = imread(path + '/masks/' + mask_file)
        mask_ = np.expand_dims(resize(mask_, (IMG_HEIGHT, IMG_WIDTH), mode='constant',  
                                      preserve_range=True), axis=-1)
        mask = np.maximum(mask, mask_)  
            
    Y_train[n] = mask   

8: Probando las Imágenes

# Imágenes de prueba
X_test = np.zeros((len(test_ids), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)
sizes_test = []
print('Redimensionando imágenes de prueba') 
for n, id_ in tqdm(enumerate(test_ids), total=len(test_ids)):
    path = TEST_PATH + id_
    img = imread(path + '/images/' + id_ + '.png')[:,:,:IMG_CHANNELS]
    sizes_test.append([img.shape[0], img.shape[1]])
    img = resize(img, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)
    X_test[n] = img

print('¡Hecho!')

9: Comprobación Aleatoria de las Imágenes

image_x = random.randint(0, len(train_ids))
imshow(X_train[image_x])
plt.show()
imshow(np.squeeze(Y_train[image_x]))
plt.show()

10: Construcción del Modelo

inputs = tf.keras.layers.Input((IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS))
s = tf.keras.layers.Lambda(lambda x: x / 255)(inputs)

11: Rutas

# Ruta de contracción
c1 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', 
kernel_initializer='he_normal', padding='same')(s)
c1 = tf.keras.layers.Dropout(0.1)(c1)
c1 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu',
 kernel_initializer='he_normal', padding='same')(c1)
p1 = tf.keras.layers.MaxPooling2D((2, 2))(c1)

c2 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu', 
kernel_initializer='he_normal', padding='same')(p1)
c2 = tf.keras.layers.Dropout(0.1)(c2)
c2 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu', 
kernel_initializer='he_normal', padding='same')(c2)
p2 = tf.keras.layers.MaxPooling2D((2, 2))(c2)
 
c3 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu', 
kernel_initializer='he_normal', padding='same')(p2)
c3 = tf.keras.layers.Dropout(0.2)(c3)
c3 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu',
 kernel_initializer='he_normal', padding='same')(c3)
p3 = tf.keras.layers.MaxPooling2D((2, 2))(c3)
 
c4 = tf.keras.layers.Conv2D(128, (3, 3), activation='relu', 
kernel_initializer='he_normal', padding='same')(p3)
c4 = tf.keras.layers.Dropout(0.2)(c4)
c4 = tf.keras.layers.Conv2D(128, (3, 3), activation='relu', 
kernel_initializer='he_normal', padding='same')(c4)
p4 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(c4)
 
c5 = tf.keras.layers.Conv2D(256, (3, 3), activation='relu', 
kernel_initializer='he_normal', padding='same')(p4)
c5 = tf.keras.layers.Dropout(0.3)(c5)
c5 = tf.keras.layers.Conv2D(256, (3, 3), activation='relu', 
kernel_initializer='he_normal', padding='same')(c5)

12: Caminos de Expansión

u6 = tf.keras.layers.Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(c5)
u6 = tf.keras.layers.concatenate([u6, c4])
c6 = tf.keras.layers.Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_normal', 
padding='same')(u6)
c6 = tf.keras.layers.Dropout(0.2)(c6)
c6 = tf.keras.layers.Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_normal', 
padding='same')(c6)
 
u7 = tf.keras.layers.Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(c6)
u7 = tf.keras.layers.concatenate([u7, c3])
c7 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_normal', 
padding='same')(u7)
c7 = tf.keras.layers.Dropout(0.2)(c7)
c7 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_normal', 
padding='same')(c7)
 
u8 = tf.keras.layers.Conv2DTranspose(32, (2, 2), strides=(2, 2), padding='same')(c7)
u8 = tf.keras.layers.concatenate([u8, c2])
c8 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_normal', 
padding='same')(u8)
c8 = tf.keras.layers.Dropout(0.1)(c8)
c8 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_normal', 
padding='same')(c8)
 
u9 = tf.keras.layers.Conv2DTranspose(16, (2, 2), strides=(2, 2), padding='same')(c8)
u9 = tf.keras.layers.concatenate([u9, c1], axis=3)
c9 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal', 
padding='same')(u9)
c9 = tf.keras.layers.Dropout(0.1)(c9)
c9 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal', 
padding='same')(c9)

13: Salidas

salidas = tf.keras.layers.Conv2D(1, (1, 1), activation='sigmoid')(c9)

14: Resumen

modelo = tf.keras.Model(inputs=[entradas], outputs=[salidas])
modelo.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
modelo.summary()

15: Punto de Control del Modelo

checkpointer = tf.keras.callbacks.ModelCheckpoint('modelo_para_nucleos.h5', 
verbose=1, save_best_only=True)

callbacks = [
        tf.keras.callbacks.EarlyStopping(patience=2, monitor='val_loss'),
        tf.keras.callbacks.TensorBoard(log_dir='registros')]

resultados = modelo.fit(X_entrenamiento, Y_entrenamiento, validation_split=0.1, batch_size=16, epochs=25, 
callbacks=callbacks)

16: Última Etapa – Predicción

idx = random.randint(0, len(X_entrenamiento))

predicciones_entrenamiento = modelo.predict(X_entrenamiento[:int(X_entrenamiento.shape[0]*0.9)], verbose=1)
predicciones_validacion = modelo.predict(X_entrenamiento[int(X_entrenamiento.shape[0]*0.9):], verbose=1)
predicciones_prueba = modelo.predict(X_prueba, verbose=1)


predicciones_entrenamiento_t = (predicciones_entrenamiento > 0.5).astype(np.uint8)
predicciones_validacion_t = (predicciones_validacion > 0.5).astype(np.uint8)
predicciones_prueba_t = (predicciones_prueba > 0.5).astype(np.uint8)

# Realizar una verificación de coherencia en algunas muestras aleatorias de entrenamiento
ix = random.randint(0, len(predicciones_entrenamiento_t))
imshow(X_entrenamiento[ix])
plt.show()
imshow(np.squeeze(Y_entrenamiento[ix]))
plt.show()
imshow(np.squeeze(predicciones_entrenamiento_t[ix]))
plt.show()

# Realizar una verificación de coherencia en algunas muestras aleatorias de validación
ix = random.randint(0, len(predicciones_validacion_t))
imshow(X_entrenamiento[int(X_entrenamiento.shape[0]*0.9):][ix])
plt.show()
imshow(np.squeeze(Y_entrenamiento[int(Y_entrenamiento.shape[0]*0.9):][ix]))
plt.show()
imshow(np.squeeze(predicciones_validacion_t[ix]))
plt.show()

Conclusion

En esta completa publicación de blog, hemos cubierto la arquitectura UNET para la segmentación de imágenes. Al abordar las limitaciones de las metodologías anteriores, la arquitectura UNET ha revolucionado la segmentación de imágenes. Sus rutas de codificación y decodificación, conexiones saltadas y otras modificaciones, como U-Net++, Attention U-Net y Dense U-Net, han demostrado ser altamente efectivas para capturar contexto, mantener información espacial y aumentar la precisión de la segmentación. El potencial de la segmentación precisa y automática con UNET ofrece nuevas vías para mejorar la visión por computadora y más allá. Animamos a los lectores a aprender más sobre UNET y experimentar con su implementación para maximizar su utilidad en sus proyectos de segmentación de imágenes.

Puntos clave

1. La segmentación de imágenes es esencial en tareas de visión por computadora, permitiendo la división de imágenes en regiones u objetos significativos.

2. Los enfoques tradicionales para la segmentación de imágenes, como la anotación manual y la clasificación píxel a píxel, tienen limitaciones en términos de eficiencia y precisión.

3. Desarrollar la arquitectura UNET para abordar estas limitaciones y lograr resultados de segmentación precisos.

4. Es una red neuronal convolucional totalmente convolucional (FCN) que combina una ruta de codificación para capturar características de alto nivel y un método de decodificación para generar la máscara de segmentación.

5. Las conexiones saltadas en UNET preservan la información espacial, mejoran la propagación de características y mejoran la precisión de la segmentación.

6. Ha encontrado aplicaciones exitosas en imágenes médicas, análisis de imágenes satelitales y control de calidad industrial, logrando destacados hitos y reconocimiento en competiciones.

Preguntas frecuentes

Los medios mostrados en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor.

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

El acoso sexual y el sesgo de género contra las mujeres en STEM siguen siendo abundantes, según revela un estudio.

Dos tercios de las mujeres profesionales en STEM encuestadas informan ganar menos que sus colegas masculinos.

Inteligencia Artificial

Ajusta ChatGPT a tus necesidades con instrucciones personalizadas

OpenAI ha introducido recientemente instrucciones personalizadas para aprovechar al máximo ChatGPT.

Inteligencia Artificial

Drones con Desfibriladores Están Salvando Vidas

Los investigadores encontraron que los drones con desfibriladores externos automatizados llegaron al lugar de un pres...

Inteligencia Artificial

¿En qué te has alimentado? Este modelo de IA puede extraer datos de entrenamiento de modelos de difusión

Los modelos de difusión se convirtieron en una parte clave del dominio de la IA en 2022. Hemos visto imágenes fotorre...

Inteligencia Artificial

Procesamiento del Lenguaje Natural Más allá de BERT y GPT

El mundo de la tecnología está en constante evolución, y una área que ha experimentado avances significativos es el P...