Ir al contenido principal

FastSAM para Tareas de Segmentación de Imágenes: Una Explicación Sencilla

FastSAM para Tareas de Segmentación de Imágenes: Una Explicación Sencilla

La segmentación de imágenes es una tarea popular en visión artificial, cuyo objetivo es particionar una imagen de entrada en múltiples regiones, donde cada región representa un objeto separado.

Varios enfoques clásicos del pasado involucraron tomar el "backbone" de un modelo (por ejemplo, U-Net) y ajustarlo en conjuntos de datos especializados. Si bien el ajuste fino funciona bien, la aparición de GPT-2 y GPT-3 impulsó a la comunidad de aprendizaje automático a cambiar gradualmente el enfoque hacia el desarrollo de soluciones de aprendizaje "zero-shot".

El concepto "zero-shot" juega un papel importante al permitir que se omita la fase de ajuste fino, con la esperanza de que el modelo sea lo suficientemente inteligente como para resolver cualquier tarea sobre la marcha.

En el contexto de la visión artificial, Meta lanzó el ampliamente conocido "Segment Anything Model" (SAM) de propósito general en 2023, que permitió realizar tareas de segmentación con una calidad decente de manera "zero-shot".

Si bien los resultados a gran escala de SAM fueron impresionantes, varios meses después, el grupo de Análisis de Imágenes y Videos (CASIA IVA) de la Academia China de Ciencias lanzó el modelo FastSAM. Como sugiere el adjetivo "fast" (rápido), FastSAM aborda las limitaciones de velocidad de SAM acelerando el proceso de inferencia hasta 50 veces, manteniendo al mismo tiempo una alta calidad de segmentación.

En este artículo, exploraremos la arquitectura de FastSAM, las posibles opciones de inferencia y examinaremos qué lo hace "rápido" en comparación con el modelo SAM estándar. Además, veremos un ejemplo de código para ayudar a solidificar nuestra comprensión.

Se recomienda encarecidamente estar familiarizado con los conceptos básicos de la visión artificial, el modelo YOLO y comprender el objetivo de las tareas de segmentación.

Arquitectura

El proceso de inferencia en FastSAM se lleva a cabo en dos pasos:

1. Segmentación de todas las instancias. El objetivo es producir máscaras de segmentación para todos los objetos en la imagen.

2. Selección guiada por "prompt". Después de obtener todas las máscaras posibles, la selección guiada por "prompt" devuelve la región de la imagen que corresponde al "prompt" de entrada.

Comencemos con la segmentación de todas las instancias.

#### Segmentación de todas las instancias

Antes de examinar visualmente la arquitectura, veamos lo que dice la investigación original:

"La arquitectura de FastSAM se basa en YOLOv8-seg, un detector de objetos equipado con la rama de segmentación de instancias, que utiliza el método YOLACT" - Fast Segment Anything paper.

La definición puede parecer compleja para aquellos que no están familiarizados con YOLOv8-seg y YOLACT. En cualquier caso, para aclarar mejor el significado detrás de estos dos modelos, proporcionaremos una intuición simple sobre qué son y cómo se utilizan.

#### YOLACT (You Only Look at CoefficienTs)

YOLACT es un modelo convolucional de segmentación de instancias en tiempo real que se enfoca en la detección de alta velocidad, inspirado en el modelo YOLO, y logra un rendimiento comparable al del modelo Mask R-CNN.

YOLACT consta de dos módulos (ramas) principales:

1. Rama de prototipos. YOLACT crea un conjunto de máscaras de segmentación llamadas prototipos.

2. Rama de predicción. YOLACT realiza la detección de objetos prediciendo cuadros delimitadores y luego estima los coeficientes de máscara, que le dicen al modelo cómo combinar linealmente los prototipos para crear una máscara final para cada objeto.

Para extraer las características iniciales de la imagen, YOLACT utiliza ResNet, seguido de una Red Piramidal de Características (FPN) para obtener características de múltiples escalas. Cada uno de los niveles P (que se muestran en la imagen) procesa características de diferentes tamaños mediante convoluciones (por ejemplo, P3 contiene las características más pequeñas, mientras que P7 captura las características de nivel superior de la imagen). Este enfoque ayuda a YOLACT a tener en cuenta los objetos en varias escalas.

#### YOLOv8-seg

YOLOv8-seg es un modelo basado en YOLACT e incorpora los mismos principios con respecto a los prototipos. También tiene dos encabezados:

1. Encabezado de detección. Se utiliza para predecir cuadros delimitadores y clases.

2. Encabezado de segmentación. Se utiliza para generar máscaras y combinarlas.

La diferencia clave es que YOLOv8-seg utiliza una arquitectura de "backbone" YOLO en lugar del "backbone" ResNet y FPN utilizados en YOLACT. Esto hace que YOLOv8-seg sea más ligero y rápido durante la inferencia.

Tanto YOLACT como YOLOv8-seg utilizan el número predeterminado de prototipos k = 32, que es un hiperparámetro ajustable. En la mayoría de los escenarios, esto proporciona una buena compensación entre velocidad y rendimiento de segmentación.

En ambos modelos, para cada objeto detectado, se predice un vector de tamaño k = 32, que representa los pesos para los prototipos de máscara. Estos pesos se utilizan luego para combinar linealmente los prototipos para producir la máscara final para el objeto.

#### Arquitectura FastSAM

La arquitectura de FastSAM se basa en YOLOv8-seg, pero también incorpora una FPN, similar a YOLACT. Incluye tanto encabezados de detección como de segmentación, con k = 32 prototipos. Sin embargo, dado que FastSAM realiza la segmentación de todos los objetos posibles en la imagen, su flujo de trabajo difiere del de YOLOv8-seg y YOLACT:

1. Primero, FastSAM realiza la segmentación produciendo k = 32 máscaras de imagen.

2. Estas máscaras se combinan luego para producir la máscara de segmentación final.

3. Durante el posprocesamiento, FastSAM extrae regiones, calcula cuadros delimitadores y realiza la segmentación de instancias para cada objeto.

Aunque el artículo no menciona detalles sobre el posprocesamiento, se puede observar que el repositorio oficial de FastSAM en GitHub utiliza el método cv2.findContours() de OpenCV en la etapa de predicción.

En la práctica, existen varios métodos para extraer máscaras de instancia de la máscara de segmentación final. Algunos ejemplos incluyen la detección de contornos (utilizada en FastSAM) y el análisis de componentes conectados (cv2.connectedComponents()).

#### Entrenamiento

Los investigadores de FastSAM utilizaron el mismo conjunto de datos SA-1B que los desarrolladores de SAM, pero entrenaron el detector CNN en solo el 2% de los datos. A pesar de esto, el detector CNN logra un rendimiento comparable al del SAM original, al tiempo que requiere significativamente menos recursos para la segmentación. Como resultado, la inferencia en FastSAM es hasta 50 veces más rápida.

A modo de referencia, SA-1B consta de 11 millones de imágenes diversas y 1.100 millones de máscaras de segmentación de alta calidad.

¿Qué hace que FastSAM sea más rápido que SAM? SAM utiliza la arquitectura Vision Transformer (ViT), que es conocida por sus altos requisitos computacionales. Por el contrario, FastSAM realiza la segmentación utilizando CNN, que son mucho más ligeras.

#### Selección guiada por "prompt"

La "tarea de segmentar cualquier cosa" implica producir una máscara de segmentación para un "prompt" dado, que puede representarse en diferentes formas.

#### "Prompt" de punto

Después de obtener múltiples prototipos para una imagen, se puede utilizar un "prompt" de punto para indicar que el objeto de interés se encuentra (o no) en un área específica de la imagen. Como resultado, el punto especificado influye en los coeficientes de las máscaras de prototipo.

Al igual que SAM, FastSAM permite seleccionar múltiples puntos y especificar si pertenecen al primer plano o al fondo. Si un punto de primer plano correspondiente al objeto aparece en varias máscaras, se pueden utilizar puntos de fondo para filtrar las máscaras irrelevantes.

Sin embargo, si varias máscaras aún satisfacen los "prompts" de punto después del filtrado, se aplica la fusión de máscaras para obtener la máscara final para el objeto.

Además, los autores aplican operadores morfológicos para suavizar la forma final de la máscara y eliminar pequeños artefactos y ruido.

#### "Prompt" de cuadro

El "prompt" de cuadro implica seleccionar la máscara cuyo cuadro delimitador tiene la mayor Intersección sobre Unión (IoU) con el cuadro delimitador especificado en el "prompt".

#### "Prompt" de texto

Del mismo modo, para el "prompt" de texto, se selecciona la máscara que mejor se corresponde con la descripción del texto. Para lograr esto, se utiliza el modelo CLIP:

1. Se calculan las incrustaciones para el "prompt" de texto y las máscaras de prototipo k = 32.

2. Luego, se calculan las similitudes entre la incrustación de texto y los prototipos. El prototipo con la similitud más alta se posprocesa y se devuelve.

En general, para la mayoría de los modelos de segmentación, el "prompt" generalmente se aplica a nivel de prototipo.

Repositorio FastSAM

A continuación, se muestra el enlace al repositorio oficial de FastSAM, que incluye un archivo README.md claro y documentación.

Si planea usar una Raspberry Pi y desea ejecutar el modelo FastSAM en ella, asegúrese de consultar el repositorio de GitHub: Hailo-Application-Code-Examples. Contiene todo el código y los scripts necesarios para iniciar FastSAM en dispositivos periféricos.

En este artículo, hemos analizado FastSAM, una versión mejorada de SAM. Al combinar las mejores prácticas de los modelos YOLACT y YOLOv8-seg, FastSAM mantiene una alta calidad de segmentación al tiempo que logra un aumento significativo en la velocidad de predicción, acelerando la inferencia varias docenas de veces en comparación con el SAM original.

La capacidad de usar "prompts" con FastSAM proporciona una forma flexible de recuperar máscaras de segmentación para objetos de interés. Además, se ha demostrado que desacoplar la selección guiada por "prompt" de la segmentación de todas las instancias reduce la complejidad.

A continuación, se muestran algunos ejemplos de uso de FastSAM con diferentes "prompts", lo que demuestra visualmente que aún conserva la alta calidad de segmentación de SAM:

Recursos

  • Fast Segment Anything | Xu Zhao, Wenchao Ding, et al. (2023)
  • Segment Anything | Meta AI Research | Alexander Kirillov, Eric Mintum, et al. (2023)
  • YOLACT, Real-time Instance Segmentation | Daniel Bolya, Chong Zhou, et al. (2019)
  • SA-1B Dataset | Meta

Todas las imágenes son del autor a menos que se indique lo contrario.

Entradas populares de este blog

Event Driven Architecture & Big ball of mud

EDA Una arquitectura event-driven (EDA) es un estilo de diseño que se basa en la producción, detección y reacción a eventos. Un evento es un cambio de estado significativo en el sistema o en el entorno que puede ser notificado a otros componentes interesados. Una arquitectura event-driven permite una mayor desacoplamiento, escalabilidad y resiliencia entre los componentes del sistema, así como una mejor adaptabilidad a los cambios y a las necesidades del negocio. Sin embargo, una arquitectura event-driven también puede tener sus desafíos y riesgos, especialmente si no se aplica una buena gestión de los dominios y los boundaries. Un dominio es un conjunto de conceptos, reglas y procesos relacionados con un aspecto del negocio o del problema que se quiere resolver. Un boundary es una frontera lógica que separa y protege un dominio de otros dominios o de influencias externas. Un buen diseño de dominios y boundaries facilita la comprensión, el mantenimiento y la evolución del sistema, así ...

¿Qué es el patrón Circuit Breaker y cómo se puede implementar con AWS Step Functions?

En el desarrollo de software, es común que las aplicaciones se comuniquen con servicios o recursos externos, como bases de datos, APIs o microservicios. Sin embargo, estos servicios o recursos pueden fallar o estar temporalmente indisponibles por diversas razones, lo que puede afectar el rendimiento y la disponibilidad de la aplicación. Para manejar estos escenarios de falla, se puede utilizar el patrón Circuit Breaker, que consiste en detectar y prevenir que una operación que tiene alta probabilidad de fallar se ejecute repetidamente, causando más problemas o consumiendo recursos innecesarios.  El patrón Circuit Breaker tiene tres estados posibles: cerrado, abierto y medio abierto. Cerrado : En este estado, el circuito está funcionando normalmente y la operación se ejecuta sin problemas. Si se detecta una falla, se incrementa un contador de fallas y se calcula un umbral de fallas, que puede ser un número o un porcentaje de fallas permitidas. Si el contador de fallas supera el u...

¿Cómo usar Lambda con Amazon SQS para procesar mensajes de forma asíncrona y escalable?

Amazon Simple Queue Service (Amazon SQS) es un servicio de colas de mensajes que permite enviar y recibir mensajes entre componentes de una aplicación de forma fiable y duradera. Con Amazon SQS, se puede desacoplar la lógica de negocio de la fuente de los eventos, y procesarlos de forma asíncrona y en paralelo.   En este artículo, vamos a ver cómo usar Lambda con Amazon SQS para procesar mensajes de una cola de forma eficiente y flexible, aprovechando las características de concurrencia, escalamiento y procesamiento del event source mapping de Lambda, así como la estrategia de backoff que implementa Lambda para manejar errores y reintentos.   Concurrencia del event source mapping Un event source mapping es una configuración que le dice a Lambda qué fuente de eventos debe monitorear y qué función debe invocar cuando se produzca un evento. En el caso de Amazon SQS, el event source mapping se encarga de leer los mensajes de la cola y enviarlos a la función Lambda en lotes. La con...