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

Enrutamiento Dinámico y Avanzado con Amazon API Gateway: ¡Adiós a los Proxies!

Enrutamiento Dinámico y Avanzado con Amazon API Gateway: ¡Adiós a los Proxies! En el mundo de las arquitecturas de microservicios, dirigir el tráfico de manera eficiente y flexible es un desafío constante. Tradicionalmente, esto implicaba configurar y mantener capas de proxy complejas o crear estructuras de URL enrevesadas. Sin embargo, Amazon API Gateway ha simplificado este proceso radicalmente con la introducción de las Reglas de Enrutamiento ( Routing Rules ), permitiendo un enrutamiento dinámico basado en cabeceras HTTP. En este post, exploraremos cómo esta funcionalidad puede simplificar tu arquitectura, reducir la sobrecarga operativa y habilitar patrones de despliegue avanzados como Canary Releases y A/B Testing de forma nativa. ¿Qué son las Reglas de Enrutamiento? Las Routing Rules son un recurso que se asocia a un dominio personalizado en API Gateway. Permiten desviar las solicitudes entrantes a diferentes integraciones de backend (como una etapa específica de ...

Python 3.14 y el Fin del GIL: Explorando Oportunidades y Desafíos

Python 3.14 y el Fin del GIL: Explorando Oportunidades y Desafíos La versión 3.14 de Python ha generado gran expectativa, principalmente por la implementación de mejoras significativas, entre las que destacan: Sub-intérpretes: Disponibles en Python durante dos décadas, pero limitados al uso de código C. Ahora se pueden emplear directamente desde Python. T-Strings: Un nuevo método para el procesamiento personalizado de cadenas, con una sintaxis similar a los f-strings , pero que devuelve un objeto que representa tanto las partes estáticas como las interpoladas de la cadena. Compilador Just-In-Time (JIT): Aunque aún experimental, esta característica promete mejorar el rendimiento en casos de uso específicos. Sin embargo, el aspecto más relevante de esta versión es la introducción de Python con hilos libres , también conocido como Python sin GIL . Es importante señalar que la versión estándar de Python 3.14 seguirá utilizando el GIL, pero se puede descargar (o construir) u...

¿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...