Segment Anything Model (SAM)

Evolución de SAM

Este es el modelo original SAM de Meta. Para capacidades mejoradas, consulta SAM 2 para segmentación de vídeo o SAM 3 para segmentación de conceptos con prompts mediante texto e imágenes de ejemplo.

Cómo usar Segment Anything en Colab

Te 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 mediante prompts con rendimiento en tiempo real, estableciendo nuevos estándares en el campo.

Introducción a SAM: El Segment Anything Model

El Segment Anything Model, o SAM, es un modelo de segmentación de imágenes de vanguardia que permite la segmentación basada en prompts, proporcionando una versatilidad inigualable en tareas de análisis de imágenes. SAM constituye el núcleo de la iniciativa Segment Anything, un proyecto innovador que introduce un modelo, una tarea y un conjunto de datos novedosos 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 con el amplio conjunto de datos SA-1B, que contiene más de mil millones de máscaras repartidas en 11 millones de imágenes cuidadosamente seleccionadas, SAM ha mostrado un rendimiento zero-shot impresionante, superando en muchos casos los resultados previos totalmente supervisados.

Muestra del conjunto de datos SA-1B con máscaras de segmentación automáticas 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, además de 1.100 millones de máscaras de segmentación de alta calidad. Estas máscaras se anotaron de forma totalmente automática mediante SAM y, como se ha verificado mediante calificaciones humanas y numerosos experimentos, son de gran calidad y diversidad. Las imágenes se agrupan por número de máscaras por imagen para su visualización (hay aproximadamente 100 máscaras por imagen de media).

Características clave del Segment Anything Model (SAM)

  • Tarea de segmentación con prompts: SAM se diseñó pensando en una tarea de segmentación basada en prompts, permitiéndole generar máscaras de segmentación válidas a partir de cualquier prompt proporcionado, como pistas espaciales o de texto que identifiquen un objeto.
  • Arquitectura avanzada: El Segment Anything Model emplea un potente codificador de imágenes, un codificador de prompts y un decodificador de máscaras ligero. Esta arquitectura única permite realizar prompts flexibles, calcular máscaras en tiempo real y reconocer ambigüedades en las tareas de segmentación.
  • El conjunto de datos SA-1B: Introducido por el proyecto Segment Anything, el conjunto de datos SA-1B cuenta con más de 1.000 millones de máscaras en 11 millones de imágenes. Al ser el conjunto de datos 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 excepcional en diversas tareas de segmentación, lo que lo convierte en una herramienta lista para usar en diversas aplicaciones con una necesidad mínima de prompt engineering.

Para un análisis detallado del Segment Anything Model y del conjunto de datos SA-1B, visita el GitHub de Segment Anything y consulta el artículo de investigación Segment Anything.

SAM en la plataforma Ultralytics

SAM impulsa la función de anotación inteligente en Ultralytics Platform, permitiendo la creación de máscaras inteligentes mediante clics para un etiquetado de datos rápido. Consulta la guía de anotación para obtener más detalles.

Modelos disponibles, tareas admitidas y modos de funcionamiento

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

Tipo de modeloPesos preentrenadosTareas soportadasInferenciaValidaciónEntrenamientoExportar (Export)
SAM basesam_b.ptSegmentación de instancias
SAM largesam_l.ptSegmentació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 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 prompt engineering, SAM puede adaptarse rápidamente a nuevas tareas y distribuciones de datos de forma zero-shot, lo que lo convierte en una herramienta versátil y potente para todas tus necesidades de segmentación de imágenes.

Ejemplo de predicción con SAM

Segmentar con prompts

Segmenta una imagen con los prompts proporcionados.

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

Segmenta 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")
  • La lógica aquí es segmentar toda la imagen si no pasas ningún prompt (bboxes/puntos/máscaras).
Ejemplo de SAMPredictor

De esta forma, puedes configurar la imagen una vez y ejecutar la inferencia de los prompts varias veces sin tener que 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()

Segmenta 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 results devueltos en los ejemplos anteriores son objetos Results que permiten acceder fácilmente a las máscaras predichas y a la imagen de origen.

  • Para más argumentos adicionales para Segment everything, consulta la referencia de Predictor/generate.

Comparativa de SAM frente a YOLO

Aquí comparamos el modelo SAM-b de Meta con los modelos de segmentación de Ultralytics, incluyendo YOLO26n-seg:

ModeloTamaño
(MB)
Parámetros
(M)
Velocidad (CPU)
(ms/im)
Meta SAM-b37593.741703
MobileSAM40.710.123802
FastSAM-s con backbone de YOLOv823.911.858.0
YOLOv8n-seg de Ultralytics7.1 (52.8x más pequeño)3.4 (27.6x menos)24.8 (1682x más rápido)
YOLO11n-seg de Ultralytics6.2 (60.5x más pequeño)2.9 (32.3x menos)24.3 (1716x más rápido)
YOLO26n-seg de Ultralytics6.7 (56.0x más pequeño)2.7 (34.7x menos)25.2 (1655x 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. Mientras que SAM ofrece capacidades únicas de segmentación automática, los modelos YOLO, particularmente YOLOv8n-seg, YOLO11n-seg y YOLO26n-seg, son significativamente más pequeños, más rápidos y más eficientes desde el punto de vista computacional.

Velocidades de SAM medidas con PyTorch, velocidades de YOLO medidas con ONNX Runtime. Pruebas realizadas en un Apple M4 Air de 2025 con 16GB de RAM usando torch==2.10.0, ultralytics==8.4.31 y onnxruntime==1.24.4. Para reproducir esta prueba:

Ejemplo
from ultralytics import ASSETS, SAM, YOLO, FastSAM

# Profile SAM-b, MobileSAM
for file in ["sam_b.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 (ONNX)
for file_name in ["yolov8n-seg.pt", "yolo11n-seg.pt", "yolo26n-seg.pt"]:
    model = YOLO(file_name)
    model.info()
    onnx_path = model.export(format="onnx", dynamic=True)
    model = YOLO(onnx_path)
    model(ASSETS)

Auto-anotación: Un camino rápido hacia los conjuntos de datos de segmentación

La auto-anotació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 función permite una 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.

Genera tu conjunto de datos de segmentación utilizando un modelo de detección

Para auto-anotar tu conjunto de datos con el framework de Ultralytics, utiliza la función auto_annotate como se muestra a continuación:

Ejemplo
from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_b.pt")
ArgumentoTipoPredeterminadoDescripción
datastrrequeridoRuta al directorio que contiene las imágenes objetivo para la anotación o segmentación.
det_modelstr'yolo26x.pt'Ruta del modelo de detección YOLO para la detección inicial de objetos.
sam_modelstr'sam_b.pt'Ruta del modelo SAM para segmentación (admite SAM, variantes de SAM2 y modelos MobileSAM).
devicestr''Dispositivo de computación (p. ej., 'cuda:0', 'cpu', o '' para la detección automática del dispositivo).
conffloat0.25Umbral de confianza de detección de YOLO para filtrar detecciones débiles.
ioufloat0.45Umbral de IoU para la supresión no máxima (NMS) para filtrar cajas superpuestas.
imgszint640Tamaño de entrada para redimensionar imágenes (debe ser múltiplo de 32).
max_detint300Número máximo de detecciones por imagen para la eficiencia de la memoria.
classeslist[int]NoneLista de índices de clase a detectar (p. ej., [0, 1] para persona y bicicleta).
output_dirstrNoneDirectorio de guardado para anotaciones (por defecto es './labels' relativo a la ruta de los datos).

La función auto_annotate toma la ruta a tus imágenes, con argumentos opcionales para especificar los modelos preentrenados de detección y de segmentación SAM, el dispositivo en el que ejecutar los modelos y el directorio de salida para guardar los resultados anotados.

La auto-anotació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 función es especialmente beneficiosa para investigadores y desarrolladores que manejan grandes colecciones de imágenes, ya que les permite centrarse en el desarrollo y la evaluación del modelo en lugar de en la anotación manual.

Citas y reconocimientos

Si consideras que SAM es útil en tu trabajo de investigación o desarrollo, por favor, considera citar nuestro artículo:

Cita
@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}
}

Queremos 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 Segment Anything Model (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 prompts. Aprovecha una arquitectura avanzada, incluyendo codificadores de imágenes y de prompts combinados con un decodificador de máscaras ligero, para generar máscaras de segmentación de alta calidad a partir de varios prompts, como pistas espaciales o de texto. Entrenado con el amplio conjunto de datos SA-1B, SAM destaca en el rendimiento zero-shot, adaptándose a nuevas distribuciones de imágenes y tareas sin conocimiento previo.

¿Cómo puedo usar 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 varios prompts, como cajas delimitadoras 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, MobileSAM y FastSAM-s suelen ser más grandes y lentas, pero ofrecen capacidades únicas de segmentación zero-shot. Por ejemplo, YOLO26n-seg es 56 veces más pequeño y más de 1650 veces más rápido que el modelo SAM-b original de Meta en CPU. Esto hace que los modelos YOLO sean ideales para aplicaciones que requieren una segmentación rápida, ligera y eficiente, mientras que los modelos SAM destacan en tareas de segmentación flexibles, basadas en prompts y zero-shot.

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

El SAM de Ultralytics ofrece una función de auto-anotación que permite generar conjuntos de datos de segmentación utilizando un modelo de detección preentrenado. Aquí tienes un ejemplo en Python:

from ultralytics.data.annotator import auto_annotate

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

Esta función toma la ruta a tus imágenes y argumentos opcionales para modelos preentrenados de detección y segmentación SAM, junto con especificaciones de dispositivo y 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 está entrenado con el extenso SA-1B dataset, 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, proporcionando training data de alta calidad y diversa, lo que garantiza un rendimiento zero-shot impresionante en tareas de segmentación variadas. Para más detalles, visita la sección de Dataset.

Comentarios