Segment Anything Model (SAM)#
Te damos la bienvenida a la frontera 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 interactiva mediante indicaciones con un 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 sin igual en tareas de análisis de imágenes. SAM constituye el corazón 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 de cero disparos (zero-shot transfer). Entrenado con el extenso conjunto de datos SA-1B, que contiene más de 1000 millones de máscaras repartidas en 11 millones de imágenes cuidadosamente seleccionadas, SAM ha mostrado un rendimiento impresionante de cero disparos, superando los resultados anteriores totalmente supervisados en muchos casos.
Ejemplo de imágenes de SA-1B. Imágenes del conjunto de datos con máscaras superpuestas del recién introducido 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, junto con 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 lo verificado por valoraciones 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 principales del Segment Anything Model (SAM)#
- Tarea de segmentación basada en prompts: SAM fue diseñado pensando en una tarea de segmentación basada en prompts, 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 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 una creación de prompts flexible, el cálculo de máscaras en tiempo real y la concienciación sobre la ambigüedad 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. Como 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 de cero disparos: SAM muestra un rendimiento excepcional de cero disparos en varias tareas de segmentación, lo que lo convierte en una herramienta lista para usar en diversas aplicaciones con una necesidad mínima de ingeniería de indicaciones.
Para obtener una visión en profundidad 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 impulsa la función de anotación inteligente en Ultralytics Platform, permitiendo el enmascaramiento inteligente basado en clics para un etiquetado rápido de conjuntos de datos. Consulta la guía de anotación para obtener más detalles.
Modelos disponibles, tareas compatibles 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 Inference, Validation, Training y Export, indicados mediante emojis ✅ para los modos compatibles y emojis ❌ para los no compatibles.
| Tipo de modelo | Pesos preentrenados | Tareas compatibles | Entrenamiento | Validación | Inferencia | Exportar |
|---|---|---|---|---|---|---|
| SAM base | sam_b.pt | Instance Segmentation | ❌ | ❌ | ✅ | ❌ |
| SAM grande | sam_l.pt | Instance Segmentation | ❌ | ❌ | ✅ | ❌ |
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 indicaciones, SAM puede adaptarse rápidamente a nuevas tareas y distribuciones de datos de manera de cero disparos, estableciéndose como una herramienta versátil y potente para todas tus necesidades de segmentación de imágenes.
Ejemplo de predicción de SAM#
Segmentar imagen con 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 la imagen completa.
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).
De esta forma puedes configurar la imagen una vez y ejecutar la inferencia de prompts múltiples veces sin ejecutar el codificador de imágenes múltiples veces.
import cv2
from ultralytics.models.sam import Predictor as SAMPredictor
# Create SAMPredictor
overrides = {"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 = {"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)Todos los objetos 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 ver más argumentos adicionales de
Segment everything, consulta la Referencia dePredictor/generate.
Comparativa de SAM frente a YOLO#
Aquí comparamos el modelo SAM-b de Meta con los modelos de segmentación de Ultralytics, incluido YOLO26n-seg:
| Modelo | Tamaño (MB) | Parámetros (M) | Velocidad (CPU) (ms/im) |
|---|---|---|---|
| Meta SAM-b | 375 | 93.7 | 41703 |
| MobileSAM | 40.7 | 10.1 | 23802 |
| FastSAM-s con el backbone de YOLOv8 | 23.9 | 11.8 | 58.0 |
| YOLOv8n-seg de Ultralytics | 7.1 (52.8x más pequeño) | 3.4 (27.6x menos) | 24.8 (1682x más rápido) |
| YOLO11n-seg de Ultralytics | 6.2 (60.5x más pequeño) | 2.9 (32.3x menos) | 24.3 (1716x más rápido) |
| YOLO26n-seg de Ultralytics | 6.7 (56.0x más pequeño) | 2.7 (34.7x menos) | 25.2 (1655x más rápido) |
Esta comparativa 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 proporciona capacidades de segmentación automática únicas, los modelos YOLO, particularmente YOLOv8n-seg, YOLO11n-seg y YOLO26n-seg, son significativamente más pequeños, rápidos y computacionalmente eficientes.
Las velocidades de SAM se han medido con PyTorch y las de YOLO con ONNX Runtime. Pruebas ejecutadas en un Apple M4 Air de 2025 con 16 GB de RAM utilizando torch==2.10.0, ultralytics==8.4.31 y onnxruntime==1.24.4. Para reproducir esta prueba:
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 conjuntos de datos de segmentación#
La anotación automática 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 una anotación rápida y precisa de una gran cantidad 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 anotar automáticamente tu conjunto de datos con el framework de Ultralytics, utiliza la función auto_annotate como se muestra a continuación:
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_b.pt")| Argumento | Tipo | Predeterminado | 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 | 'yolo26x.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 segmentación (admite pesos de SAM, SAM 2, MobileSAM y SAM 3). |
device | str | '' | Dispositivo de computación (p. ej., 'cuda:0', 'cpu', o '' para la detección automática del dispositivo). |
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 de no máximos (NMS) con el fin de filtrar cajas superpuestas. |
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 la eficiencia de la memoria. |
classes | list[int] | None | Lista de índices de clases a detectar (por ejemplo, [0, 1] para persona y bicicleta). |
output_dir | str | None | Directorio de guardado para anotaciones (predeterminado: hermano <data>_auto_annotate_labels). |
La función auto_annotate toma la ruta de tus imágenes, con argumentos opcionales para especificar los modelos de detección preentrenados y de segmentación SAM, el dispositivo en el que se ejecutarán 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 tratan con 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 agradecimientos#
Si encuentras SAM útil en tu investigación o trabajo de desarrollo, considera 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}
}Queremos expresar nuestro agradecimiento a Meta AI por crear y mantener este valioso recurso para la comunidad de visión por ordenador.
FAQ#
El Segment Anything Model (SAM) de Ultralytics es un modelo de segmentación de imágenes revolucionario diseñado para tareas de segmentación mediante indicaciones. Aprovecha una arquitectura avanzada, que incluye codificadores de imágenes y de 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 cero disparos, adaptándose a nuevas distribuciones de imágenes y tareas sin conocimiento previo.
Puedes utilizar 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 utilizando 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.jpgPara obtener instrucciones de uso más detalladas, visita la sección de Segmentación.
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 de cero disparos. 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 computacionalmente eficiente, mientras que los modelos SAM sobresalen en tareas de segmentación flexibles, guiadas por indicaciones y de cero disparos.
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 de tus imágenes y argumentos opcionales para los modelos de detección y de segmentación SAM preentrenados, junto con las especificaciones del dispositivo y del directorio de salida. Para obtener una guía completa, consulta Anotación automática.
SAM está entrenado en el extenso conjunto de datos SA-1B, que comprende más de 1000 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, ya que proporciona datos de entrenamiento diversos y de alta calidad que garantizan un rendimiento impresionante de cero disparos en tareas de segmentación variadas. Para obtener más detalles, visita la sección de Conjunto de datos.