Ir al contenido

Segment Anything Model (SAM)

Cómo usar Segment Anything en Colab

Le damos la bienvenida a la vanguardia de la segmentación de imágenes con el Segment Anything Model, o SAM. Este modelo revolucionario ha cambiado las reglas del juego al introducir la segmentación de imágenes basada en indicaciones con rendimiento en tiempo real, estableciendo nuevos estándares en el campo.

Introducción a SAM: El modelo Segment Anything

El Segment Anything Model, o SAM, es un modelo de segmentación de imágenes de vanguardia que permite la segmentación basada en indicaciones, proporcionando una versatilidad sin igual en las tareas de análisis de imágenes. SAM forma el corazón de la iniciativa Segment Anything, un proyecto innovador que introduce un nuevo modelo, tarea y conjunto de datos para la segmentación de imágenes.

El diseño avanzado de SAM le permite adaptarse a nuevas distribuciones de imágenes y tareas sin conocimiento previo, una característica conocida como transferencia zero-shot. Entrenado en el extenso conjunto de datos SA-1B, que contiene más de mil millones de máscaras distribuidas en 11 millones de imágenes cuidadosamente seleccionadas, SAM ha mostrado un impresionante rendimiento zero-shot, superando los resultados totalmente supervisados anteriores en muchos casos.

Imagen de muestra del conjunto de datos Imágenes de ejemplo de SA-1B. Imágenes del conjunto de datos con máscaras superpuestas del nuevo conjunto de datos SA-1B. SA-1B contiene 11 millones de imágenes diversas, de alta resolución, con licencia y que protegen la privacidad, y 1.100 millones de máscaras de segmentación de alta calidad. Estas máscaras fueron anotadas de forma totalmente automática por SAM y, según verifican las valoraciones humanas y numerosos experimentos, son de alta calidad y diversidad. Las imágenes se agrupan por número de máscaras por imagen para su visualización (hay ∼100 máscaras por imagen de media).

Características Clave del Modelo de Segmentación Universal (SAM)

  • Tarea de Segmentación Promptable: SAM fue diseñado con una tarea de segmentación promptable en mente, lo que le permite generar máscaras de segmentación válidas a partir de cualquier prompt dado, como pistas espaciales o de texto que identifiquen un objeto.
  • Arquitectura avanzada: El modelo Segment Anything emplea un potente codificador de imágenes, un codificador de indicaciones y un decodificador de máscaras ligero. Esta arquitectura única permite indicaciones flexibles, cálculo de máscaras en tiempo real y conciencia de la ambigüedad en las tareas de segmentación.
  • El dataset SA-1B: Presentado por el proyecto Segment Anything, el dataset SA-1B cuenta con más de mil millones de máscaras en 11 millones de imágenes. Como el dataset de segmentación más grande hasta la fecha, proporciona a SAM una fuente de datos de entrenamiento diversa y a gran escala.
  • Rendimiento Zero-Shot: SAM muestra un rendimiento zero-shot sobresaliente en diversas tareas de segmentación, lo que la convierte en una herramienta lista para usar para diversas aplicaciones con una necesidad mínima de ingeniería de prompts.

Para un análisis en profundidad del modelo Segment Anything y el conjunto de datos SA-1B, visite el sitio web de Segment Anything y consulte el documento de investigación Segment Anything.

Modelos disponibles, tareas compatibles y modos de funcionamiento

Esta tabla presenta los modelos disponibles con sus pesos pre-entrenados específicos, las tareas que admiten y su compatibilidad con diferentes modos de operación como Inferencia, Validación, Entrenamiento y Exportación, indicados por emojis ✅ para los modos compatibles y emojis ❌ para los modos no compatibles.

Tipo de modelo Pesas preentrenadas Tareas admitidas Inferencia Validación Formación Exportar
SAM base sam_b.pt Segmentación de instancias
SAM grande sam_l.pt Segmentación de instancias

Cómo usar SAM: Versatilidad y potencia en la segmentación de imágenes

El Segment Anything Model se puede emplear para una multitud de tareas posteriores que van más allá de sus datos de entrenamiento. Esto incluye la detección de bordes, la generación de propuestas de objetos, la segmentación de instancias y la predicción preliminar de texto a máscara. Con la ingeniería de prompts, SAM puede adaptarse rápidamente a nuevas tareas y distribuciones de datos de manera zero-shot, estableciéndolo como una herramienta versátil y potente para todas tus necesidades de segmentación de imágenes.

Ejemplo de predicción de SAM

Segmentar con indicaciones

Segmentar la imagen con los prompts dados.

from ultralytics import SAM

# Load a model
model = SAM("sam_b.pt")

# Display model information (optional)
model.info()

# Run inference with bboxes prompt
results = model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])

# Run inference with single point
results = model(points=[900, 370], labels=[1])

# Run inference with multiple points
results = model(points=[[400, 370], [900, 370]], labels=[1, 1])

# Run inference with multiple points prompt per object
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 1]])

# Run inference with negative points prompt
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])

Segmentar todo

Segmentar toda la imagen.

from ultralytics import SAM

# Load a model
model = SAM("sam_b.pt")

# Display model information (optional)
model.info()

# Run inference
model("path/to/image.jpg")
# Run inference with a SAM model
yolo predict model=sam_b.pt source=path/to/image.jpg
  • La lógica aquí es segmentar la imagen completa si no se pasan indicaciones (bboxes/puntos/máscaras).

Ejemplo de SAMPredictor

De esta manera, puede configurar la imagen una vez y ejecutar la inferencia de indicaciones varias veces sin ejecutar el codificador de imágenes varias veces.

from ultralytics.models.sam import Predictor as SAMPredictor

# Create SAMPredictor
overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model="mobile_sam.pt")
predictor = SAMPredictor(overrides=overrides)

# Set image
predictor.set_image("ultralytics/assets/zidane.jpg")  # set with image file
predictor.set_image(cv2.imread("ultralytics/assets/zidane.jpg"))  # set with np.ndarray
results = predictor(bboxes=[439, 437, 524, 709])

# Run inference with single point prompt
results = predictor(points=[900, 370], labels=[1])

# Run inference with multiple points prompt
results = predictor(points=[[400, 370], [900, 370]], labels=[[1, 1]])

# Run inference with negative points prompt
results = predictor(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])

# Reset image
predictor.reset_image()

Segmentar todo con argumentos adicionales.

from ultralytics.models.sam import Predictor as SAMPredictor

# Create SAMPredictor
overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model="mobile_sam.pt")
predictor = SAMPredictor(overrides=overrides)

# Segment with additional args
results = predictor(source="ultralytics/assets/zidane.jpg", crop_n_layers=1, points_stride=64)

Nota

Todos los elementos devueltos results en los ejemplos anteriores son Resultados objeto que permite acceder fácilmente a las máscaras predichas y a la imagen de origen.

Comparación de SAM vs YOLO

Aquí comparamos el modelo SAM-b de Meta con el modelo de segmentación más pequeño de Ultralytics, YOLO11n-seg:

Modelo Tamaño
(MB)
Parámetros
(M)
Velocidad (CPU)
(ms/im)
Meta SAM-b 375 93.7 49401
MobileSAM 40.7 10.1 25381
FastSAM-s con backbone YOLOv8 23.7 11.8 55.9
Ultralytics YOLOv8n-seg 6.7 (11.7 veces más pequeño) 3.4 (11.4 veces menos) 24.5 (1061 veces más rápido)
Ultralytics YOLO11n-seg 5.9 (13.2 veces más pequeño) 2.9 (13.4 veces menos) 30.1 (864 veces más rápido)

Esta comparación demuestra las diferencias sustanciales en los tamaños y velocidades de los modelos entre las variantes de SAM y los modelos de segmentación YOLO. Si bien SAM proporciona capacidades únicas de segmentación automática, los modelos YOLO, particularmente YOLOv8n-seg y YOLO11n-seg, son significativamente más pequeños, rápidos y computacionalmente eficientes.

Pruebas realizadas en un Apple M4 Pro 2025 con 24 GB de RAM usando torch==2.6.0 y ultralytics==8.3.90. Para reproducir esta prueba:

Ejemplo

from ultralytics import ASSETS, SAM, YOLO, FastSAM

# Profile SAM2-t, SAM2-b, SAM-b, MobileSAM
for file in ["sam_b.pt", "sam2_b.pt", "sam2_t.pt", "mobile_sam.pt"]:
    model = SAM(file)
    model.info()
    model(ASSETS)

# Profile FastSAM-s
model = FastSAM("FastSAM-s.pt")
model.info()
model(ASSETS)

# Profile YOLO models
for file_name in ["yolov8n-seg.pt", "yolo11n-seg.pt"]:
    model = YOLO(file_name)
    model.info()
    model(ASSETS)

Autoanotación: Un camino rápido hacia los conjuntos de datos de segmentación

La autoanotación es una característica clave de SAM, que permite a los usuarios generar un conjunto de datos de segmentación utilizando un modelo de detección preentrenado. Esta característica permite la anotación rápida y precisa de un gran número de imágenes, evitando la necesidad de un etiquetado manual que requiere mucho tiempo.

Genere su conjunto de datos de segmentación utilizando un modelo de detección

Para autoanotar su conjunto de datos con el framework Ultralytics, utilice el auto_annotate como se muestra a continuación:

Ejemplo

from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolo11x.pt", sam_model="sam_b.pt")
Argumento Tipo Por defecto Descripción
data str obligatorio Ruta al directorio que contiene las imágenes de destino para la anotación o segmentación.
det_model str 'yolo11x.pt' Ruta del modelo de detección YOLO para la detección inicial de objetos.
sam_model str 'sam_b.pt' Ruta del modelo SAM para la segmentación (admite las variantes SAM, SAM2 y los modelos mobile_sam).
device str '' Dispositivo de cálculo (p. ej., 'cuda:0', 'cpu' o '' para la detección automática de dispositivos).
conf float 0.25 Umbral de confianza de detección YOLO para filtrar detecciones débiles.
iou float 0.45 Umbral de IoU para la supresión no máxima para filtrar cuadros superpuestos.
imgsz int 640 Tamaño de entrada para redimensionar imágenes (debe ser múltiplo de 32).
max_det int 300 Número máximo de detecciones por imagen para eficiencia de memoria.
classes list[int] None Lista de índices de clase para detectar (p. ej., [0, 1] para persona y bicicleta).
output_dir str None Directorio para guardar las anotaciones (por defecto './labels' relativo a la ruta de datos).

En auto_annotate función toma la ruta a sus imágenes, con argumentos opcionales para especificar los modelos de segmentación pre-entrenados de detección y SAM, el dispositivo en el que se ejecutarán los modelos y el directorio de salida para guardar los resultados anotados.

La autoanotación con modelos preentrenados puede reducir drásticamente el tiempo y el esfuerzo necesarios para crear conjuntos de datos de segmentación de alta calidad. Esta característica es especialmente beneficiosa para los investigadores y desarrolladores que trabajan con grandes colecciones de imágenes, ya que les permite centrarse en el desarrollo y la evaluación de modelos en lugar de la anotación manual.

Citas y agradecimientos

Si SAM le resulta útil en su trabajo de investigación o desarrollo, considere citar nuestro artículo:

@misc{kirillov2023segment,
      title={Segment Anything},
      author={Alexander Kirillov and Eric Mintun and Nikhila Ravi and Hanzi Mao and Chloe Rolland and Laura Gustafson and Tete Xiao and Spencer Whitehead and Alexander C. Berg and Wan-Yen Lo and Piotr Dollár and Ross Girshick},
      year={2023},
      eprint={2304.02643},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}

Nos gustaría expresar nuestra gratitud a Meta AI por crear y mantener este valioso recurso para la comunidad de visión artificial.

PREGUNTAS FRECUENTES

¿Qué es el Modelo de Segmentación de Cualquier Cosa (SAM) de Ultralytics?

El Segment Anything Model (SAM) de Ultralytics es un modelo revolucionario de segmentación de imágenes diseñado para tareas de segmentación basadas en indicaciones. Aprovecha una arquitectura avanzada, que incluye codificadores de imagen e indicaciones combinados con un decodificador de máscaras ligero, para generar máscaras de segmentación de alta calidad a partir de varias indicaciones, como señales espaciales o de texto. Entrenado en el extenso conjunto de datos SA-1B, SAM destaca en el rendimiento de zero-shot, adaptándose a nuevas distribuciones de imágenes y tareas sin conocimiento previo.

¿Cómo puedo utilizar el Segment Anything Model (SAM) para la segmentación de imágenes?

Puedes usar el Segment Anything Model (SAM) para la segmentación de imágenes ejecutando la inferencia con varias indicaciones, como cuadros delimitadores o puntos. Aquí tienes un ejemplo usando python:

from ultralytics import SAM

# Load a model
model = SAM("sam_b.pt")

# Segment with bounding box prompt
model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])

# Segment with points prompt
model("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1])

# Segment with multiple points prompt
model("ultralytics/assets/zidane.jpg", points=[[400, 370], [900, 370]], labels=[[1, 1]])

# Segment with multiple points prompt per object
model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 1]])

# Segment with negative points prompt.
model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 0]])

Alternativamente, puedes ejecutar la inferencia con SAM en la interfaz de línea de comandos (CLI):

yolo predict model=sam_b.pt source=path/to/image.jpg

Para obtener instrucciones de uso más detalladas, visita la sección de Segmentación.

¿Cómo se comparan los modelos SAM y YOLO en términos de rendimiento?

En comparación con los modelos YOLO, las variantes de SAM como SAM-b, SAM2-t, MobileSAM y FastSAM-s suelen ser más grandes y lentas, pero ofrecen capacidades únicas de segmentación zero-shot. Por ejemplo, Ultralytics YOLOv8n-seg es 11.7 veces más pequeño y 1069 veces más rápido que el modelo SAM-b original de Meta, lo que destaca la importante ventaja de YOLO en velocidad y eficiencia. Del mismo modo, el nuevo YOLO11n-seg proporciona un tamaño aún más pequeño y mantiene una velocidad de inferencia impresionante. Esto hace que los modelos YOLO sean ideales para aplicaciones que requieren una segmentación rápida, ligera y computacionalmente eficiente, mientras que los modelos SAM destacan en tareas de segmentación flexibles, basadas en indicaciones y zero-shot.

¿Cómo puedo auto-anotar mi conjunto de datos usando SAM?

SAM de Ultralytics ofrece una función de autoanotación que permite generar conjuntos de datos de segmentación utilizando un modelo de detección preentrenado. Aquí hay un ejemplo en Python:

from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolov8x.pt", sam_model="sam_b.pt")

Esta función toma la ruta de acceso a tus imágenes y argumentos opcionales para los modelos de detección pre-entrenados y de segmentación SAM, junto con las especificaciones del dispositivo y del directorio de salida. Para una guía completa, consulta Auto-Annotation.

¿Qué conjuntos de datos se utilizan para entrenar el Segment Anything Model (SAM)?

SAM se entrena con el extenso conjunto de datos SA-1B, que comprende más de mil millones de máscaras en 11 millones de imágenes. SA-1B es el conjunto de datos de segmentación más grande hasta la fecha, que proporciona datos de entrenamiento diversos y de alta calidad, lo que garantiza un rendimiento zero-shot impresionante en diversas tareas de segmentación. Para obtener más detalles, visite la sección Conjunto de datos.



📅 Creado hace 1 año ✏️ Actualizado hace 3 meses

Comentarios