Path: blob/master/site/es-419/tutorials/images/segmentation.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Licensed under the Apache License, Version 2.0 (the "License");
Segmentación de imágenes
Este tutorial se enfoca en la tarea de segmentación de imágenes, usando una U-Net modificada.
¿Qué es la segmentación de imágenes?
En una tarea de clasificación de imágenes, la red asigna una etiqueta (o clase) a cada imagen de entrada. Pero supongamos que desea conocer la forma de ese objeto, qué pixel pertenece a qué objeto, etc. En este caso, necesita asignar una clase a cada pixel de la imagen; esta tarea se conoce como segmentación. Un modelo de segmentación devuelve información mucho más detallada sobre la imagen. La segmentación de imágenes tiene muchas aplicaciones en el diagnóstico médico por imagen, los coches autónomos y las imágenes por satélite, por nombrar sólo algunas.
Este tutorial usa el conjunto de datos Oxford-IIIT Pet (Parkhi et al, 2012). El conjunto de datos incluye imágenes de 37 razas de mascotas, con 200 imágenes por raza (~100 cada una en divisiones de entrenamiento y prueba). Cada imagen incluye las etiquetas correspondientes y máscaras a nivel de pixel. Las máscaras son etiquetas de clase para cada pixel. A cada pixel se le asigna una de tres categorías:
Clase 1: Pixel perteneciente a la mascota.
Clase 2: Pixel que bordea la mascota.
Clase 3: Ninguna de las anteriores/un pixel circundante.
Descargar el conjunto de datos Oxford-IIIT Pets
El conjunto de datos está disponible en Conjuntos de datos TensorFlow. Las máscaras de segmentación se incluyen a partir de la versión 3.
Además, los valores de color de la imagen se normalizan al rango [0, 1]
. Por último, como se ha mencionado anteriormente, los pixeles de la máscara de segmentación se etiquetan como {1, 2, 3}. Para que resulte más cómodo, se resta 1 de la máscara de segmentación, lo que da como resultado las etiquetas: {0, 1, 2}.
El conjunto de datos ya contiene las divisiones de entrenamiento y prueba necesarias, así que siga usando las mismas divisiones:
La siguiente clase ejecuta un simple aumento volteando aleatoriamente una imagen. Vaya al tutorial Aumento de imágenes para obtener más información.
Construya la canalización de entrada, aplicando el aumento tras la división en lotes de las entradas:
Visualice un ejemplo de imagen y su máscara correspondiente desde el conjunto de datos:
Definir el modelo
El modelo que se usa aquí es una U-Net modificada. Una U-Net consta de un codificador (downsampler) y un decodificador (upsampler). Si quiere aprender características robustas y reducir el número de parámetros entrenables, use un modelo preentrenado (MobileNetV2) como codificador. Para el decodificador, usará el bloque upsample, que ya está implementado en el ejemplo pix2pix del repositorio de ejemplos de TensorFlow. (Eche un vistazo al tutorial pix2pix: Traducción imagen a imagen con un GAN condicional en un bloc de notas).
Como se ha mencionado, el codificador es un modelo MobileNetV2 preentrenado. Usted usará el modelo de tf.keras.applications
. El codificador consiste en salidas específicas de las capas intermedias del modelo. Tenga en cuenta que el codificador no se entrenará durante el proceso de entrenamiento.
El decodificador/upsampler es simplemente una serie de bloques de upsample implementados en ejemplos de TensorFlow:
Tenga en cuenta que el número de filtros de la última capa se establece en función del número de output_channels
. Esto será un canal de salida por clase.
Entrenar el modelo
Ahora sólo queda compilar y entrenar el modelo.
Dado que se trata de un problema de clasificación multiclase, use la función de pérdida tf.keras.losses.SparseCategoricalCrossentropy
con el argumento from_logits
como True
, ya que las etiquetas son enteros escalares en lugar de vectores de puntuaciones para cada pixel de cada clase.
Al ejecutar la inferencia, la etiqueta asignada al pixel es el canal con el valor más alto. Esto es lo que hace la función create_mask
.
Trace la arquitectura del modelo resultante:
Pruebe el modelo para comprobar lo que predice antes del entrenamiento:
La retrollamada definida a continuación se usa para observar cómo mejora el modelo mientras se entrena:
Hacer predicciones
Ahora, haga algunas predicciones. Para ahorrar tiempo, mantuvimos un número reducido de épocas, pero puede fijarlo más alto para obtener resultados más precisos.
Opcional: Clases desequilibradas y ponderaciones por clase
Los conjuntos de datos de segmentación semántica pueden estar muy desequilibrados, lo que significa que los pixeles de una clase concreta pueden estar más presentes dentro de las imágenes que los de otras clases. Dado que los problemas de segmentación pueden tratarse como problemas de clasificación por pixel, puede abordar el problema del desequilibrio asignando ponderaciones a la función de pérdida para compensarlo. Es una forma sencilla y elegante de lidiar con este problema. Consulte el tutorial Clasificación en datos desequilibrados para saber más.
Para evitar ambigüedades, Model.fit
no admite el argumento class_weight
para objetivos con más de 3 dimensiones.
Por tanto, en este caso deberá implementar usted mismo la ponderación. Lo hará usando ponderaciones de muestreo: Además de los pares (data, label)
, Model.fit
también acepta los tripletes (data, label, sample_weight)
.
Model.fit
de Keras propaga el sample_weight
a las pérdidas y métricas, que también aceptan un argumento sample_weight
. La ponderación de la muestra se multiplica por el valor de la muestra antes del paso de reducción. Por ejemplo:
Así, para hacer ponderaciones de muestra para este tutorial, se necesita una función que tome un par (data, label)
y devuelva un triplete (data, label, sample_weight)
donde el sample_weight
es una imagen de 1 canal que contiene la ponderación de clase para cada pixel.
La implementación más sencilla posible es usar la etiqueta como índice en una lista class_weight
:
Los elementos del conjunto de datos resultante contienen 3 imágenes cada uno:
Ahora ya puede entrenar un modelo en este conjunto de datos ponderado:
Siguientes pasos
Ahora que ya sabe qué es la segmentación de imágenes y cómo funciona, puede probar este tutorial con diferentes salidas de capas intermedias, o incluso con diferentes modelos preentrenados. También puede retarse a sí mismo probando el reto de enmascaramiento de imágenes de Carvana alojado en Kaggle.
También puede consultar la API de detección de objetos de Tensorflow para ver otro modelo que puede volver a entrenar con sus propios datos. Los modelos preentrenados están disponibles en TensorFlow Hub.