La segmentación semántica es un algoritmo de deep learning que asocia una etiqueta o categoría a cada píxel presente en una imagen. Se utiliza para reconocer un conjunto de píxeles que conforman distintas categorías. Por ejemplo, un vehículo de conducción autónoma necesita identificar vehículos, peatones, señales de tráfico, aceras y otros elementos de la carretera.
La segmentación semántica se utiliza en numerosas aplicaciones, como la conducción autónoma, la generación de imágenes médicas y la inspección industrial.
Un sencillo ejemplo de segmentación semántica es la separación de las imágenes en dos clases distintas. Por ejemplo, en la Figura 1, la imagen de una persona en la playa se empareja con otra versión en la que se muestran los píxeles de la imagen segmentados en dos clases distintas: la persona y el fondo.
Figura 1: imagen y píxeles etiquetados.
La segmentación semántica no se limita a solo dos categorías. Es posible modificar el número de categorías para clasificar el contenido de la imagen. Por ejemplo, esta misma imagen se podría segmentar en cuatro clases: persona, cielo, agua y fondo.
¿En qué se diferencia la segmentación semántica de la detección de objetos?
La segmentación semántica puede ser una útil alternativa a la detección de objetos, pues permite que el objeto de interés abarque diferentes áreas de la imagen en el nivel de píxel. Esta técnica detecta claramente objetos que tienen una forma irregular, al contrario que la detección de objetos, en donde los objetos deben encajar en un bounding box (Figura 2).
Figura 2: detección de objetos con cuadros delimitadores para identificar objetos.
¿Cómo se utiliza la segmentación semántica?
Debido a que la segmentación semántica etiqueta los píxeles de una imagen, es más precisa que otras formas de detección de objetos. Esto hace que la segmentación semántica resulte muy útil para aplicaciones de diversas industrias que requieren mapas de imágenes precisos, como:
- Conducción autónoma: para identificar un camino transitable para los vehículos al separar la carretera de los distintos obstáculos, como peatones, aceras, postes y otros vehículos.
- Inspección industrial: para detectar defectos en materiales, como la inspección de obleas.
- Generación de imágenes por satélite: para identificar montañas, ríos, desiertos y otros elementos del terreno.
- Generación de imágenes médicas: para analizar y detectar anomalías cancerosas en las células.
- Visión robótica: para identificar y explorar objetos y áreas del terreno.
Figura 3: segmentación semántica de una imagen satélite multiespectral.
El proceso de entrenamiento de una red de segmentación semántica para clasificar imágenes consta de estos tres pasos:
- Analizar un conjunto de imágenes con píxeles etiquetados.
- Crear una red de segmentación semántica.
- Entrenar la red para clasificar imágenes en categorías de píxeles.
- Evaluar la precisión de la red.
Ejemplo: Aplicación de conducción autónoma
La secuencia de la Figura 4 muestra un ejemplo del mundo real de segmentación semántica utilizada para conducción autónoma. Las imágenes de la carretera se segmentan automáticamente de los otros vehículos. En el apartado siguiente se muestra cómo se crean estas redes.
Figura 4: segmentación semántica para una aplicación de conducción autónoma.
Entendiendo la arquitectura
Un enfoque habitual para abordar la segmentación semántica consiste en crear una red SegNet, que se basa en una arquitectura de red neuronal convolucional (CNN). En la Figura 5 se muestra una arquitectura típica de CNN.
Esta CNN clasifica toda la imagen en una de las muchas categorías predefinidas.
Figura 5: estructura típica de una CNN.
Para que la clasificación se realice en el nivel de píxel en vez de la imagen al completo, se puede agregar una implementación inversa de una CNN. El proceso de aumento de la dimensión espacial (upsampling) se realiza el mismo número de veces que el proceso de reducción de la dimensión espacial (downsampling) para garantizar que la imagen final tenga el mismo tamaño que la imagen de entrada. Por último, se utiliza una capa de salida de clasificación de píxeles, que asigna cada píxel a una clase concreta. Esto conforma una arquitectura de codificador-decodificador, la cual permite la segmentación semántica.
Figura 6: CNN aplicando funciones relacionadas con imágenes en cada capa y luego reduciendo la dimensión espacial de la imagen mediante una capa pooling (verde). Este proceso se repite varias veces en la primera mitad de la red. El resultado de la primera mitad de este diagrama es seguido por una cantidad igual de capas unpooling (naranja).
En MATLAB, el flujo de trabajo para realizar segmentación semántica consta de estos cinco pasos:
- Etiquetar los datos u obtener datos etiquetados.
- Crear un datastore para las imágenes originales y otro para las imágenes etiquetadas.
- Dividir los datastore
- Importar una CNN y modificarla para convertirla en una SegNet.
- Entrenar y evaluar la red.
PASO 1: Etiquetar los datos u obtener datos etiquetados.
Los modelos de deep learning se basan en enormes cantidades de datos, y la segmentación semántica no es ninguna excepción. Una opción es descargar datos etiquetados en Internet. Si ya tiene su propio conjunto de datos, puede utilizar la aplicación Image Labeler de MATLAB. Puede utilizar este conjunto de datos para entrenar una red SegNet.
Figura 7: app Image Labeler de MATLAB que permite etiquetar imágenes para la segmentación semántica.
Más información
PASO 2: Crear un datastore para las imágenes originales y otro para las imágenes etiquetadas.
Cuando se trabaja con enormes cantidades de datos, a menudo no es posible cargar toda la información en la memoria. Para gestionar grandes conjuntos de datos, puede utilizar un datastore, almacén de datos. Un datastore contiene la ubicación de los archivos a los que desea acceder, y le permite cargarlos en la memoria solo cuando tenga que trabajar con ellos.
Para crear una red SegNet, necesita dos datastores:
- ImageDatastore, que contiene las imágenes originales.
- PixelLabelDatastore, que contiene las imágenes etiquetadas.
PASO 3: Dividir los datastore.
Cuando cree una red SegNet, deberá dividir el datastore en dos partes:
- El conjunto de entrenamiento, utilizado para entrenar la red SegNet
- El conjunto de prueba, utilizado para evaluar la precisión de la red
Figura 8: Escena de una carretera en donde se muestran la imagen en color (izquierda) y los correspondientes píxeles etiquetados (derecha).
PASO 4: Importar una CNN y modificarla para convertirla en una SegNet.
Cargando una red previamente entrenada, tal como VGG16, y utilizando el comando SegNetLayers, se crea la arquitectura de codificador-decodificador necesaria para el etiquetado de nivel de píxel.
Figura 9: creación de la arquitectura de SegNet con una sola línea de código en MATLAB.
PASO 5: Entrenar y evaluar la red.
Este último paso consiste en definir los hiperparámetros de la red y entrenarla.
Cómo obtener más información sobre la segmentación semántica
Entre los productos que admiten la utilización de la segmentación semántica para el análisis de imágenes se incluyen MATLAB, Computer Vision Toolbox para el etiquetado de píxeles y Deep Learning Toolbox para crear y entrenar la red.
Se soporta el entrenamiento y la predicción en una GPU CUDA® con capacidad de cálculo 3.0 o superior. Se recomienda utilizar una GPU y se requiere Parallel Computing Toolbox.
Vídeos
- Visión general de la segmentación semántica (7:56)
- Desmitificando del Deep Learning : Segmentación Semántica y Despliegue (47:09) - Webinar
Ejemplos y procedimientos
Referencia de software
- Conceptos básicos de la segmentación semántica – Documentación
- Redes neuronales convolucionales – Documentación
- Image Labeler App – Documentación