Modelo Segment Anything (SAM)#
Te damos la bienvenida a la vanguardia de la segmentación de imágenes con el Modelo Segment Anything, o SAM. Este modelo revolucionario ha cambiado las reglas del juego al introducir la segmentación de imágenes mediante indicaciones con rendimiento en tiempo real, estableciendo nuevos estándares en el campo.
Introducción a SAM: el Modelo Segment Anything#
El Modelo Segment Anything, o SAM, es un modelo de segmentación de imágenes de vanguardia que permite realizar segmentación mediante indicaciones, proporcionando una versatilidad sin precedentes en tareas de análisis de imágenes. SAM constituye el núcleo de la iniciativa Segment Anything, un proyecto pionero 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 conocimientos previos, una característica conocida como transferencia zero-shot. Entrenado con el amplio conjunto de datos SA-1B, que contiene más de 1.000 millones de máscaras distribuidas en 11 millones de imágenes cuidadosamente seleccionadas, SAM ha demostrado un rendimiento zero-shot impresionante, superando en muchos casos los resultados anteriores totalmente supervisados.
Imágenes de ejemplo de SA-1B. Imágenes del conjunto de datos con máscaras superpuestas del conjunto de datos SA-1B recién presentado. SA-1B contiene 11 millones de imágenes diversas, de alta resolución, con licencia y que protegen la privacidad, así como 1.100 millones de máscaras de segmentación de alta calidad. SAM anotó estas máscaras de forma totalmente automática y, según han confirmado las evaluaciones 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 unas ∼100 máscaras por imagen de media).
Características principales del Modelo Segment Anything (SAM)#
- Tarea de segmentación mediante indicaciones: SAM se diseñó pensando en una tarea de segmentación mediante indicaciones, lo que le permite generar máscaras de segmentación válidas a partir de cualquier indicación proporcionada, como pistas espaciales o textuales 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 realizar indicaciones flexibles, calcular máscaras en tiempo real y gestionar la ambigüedad en tareas de segmentación.
- El conjunto de datos SA-1B: presentado por el proyecto Segment Anything, el conjunto de datos SA-1B incluye más de 1.000 millones de máscaras en 11 millones de imágenes. Como el mayor conjunto de datos de segmentación 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 aplicaciones variadas con una necesidad mínima de ingeniería de indicaciones.
Para consultar un análisis detallado del Modelo Segment Anything y del conjunto de datos SA-1B, visita Segment Anything en GitHub y echa un vistazo al artículo de investigación Segment Anything.
SAM impulsa la función de anotación inteligente de Ultralytics Platform, que permite crear máscaras inteligentes mediante clics para etiquetar conjuntos de datos rápidamente. Consulta la guía de anotación para obtener más información.
Modelos disponibles, tareas compatibles y modos de funcionamiento#
Esta tabla presenta los modelos disponibles con sus pesos preentrenados específicos, las tareas compatibles y su compatibilidad con distintos modos de funcionamiento, como Inferencia, Validación, Entrenamiento y Exportación, 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 | 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 Modelo Segment Anything puede emplearse en 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 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#
Segmenta la imagen con las indicaciones proporcionadas.
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]])Segmenta 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í consiste en segmentar la imagen completa si no pasas ninguna indicación (bboxes/puntos/máscaras).
De este modo, puedes configurar la imagen una vez y ejecutar la inferencia de las indicaciones varias veces sin ejecutar el codificador de imágenes varias 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()Segmenta 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, min_mask_region_area=100)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 consultar más argumentos adicionales de
Segment everything, consulta la referencia dePredictor/generate.
Comparación entre SAM y 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 backbone de YOLOv8 | 23.9 | 11.8 | 58.0 |
| Ultralytics YOLOv8n-seg | 7.1 (52,8 veces más pequeño) | 3.4 (27,6 veces menos) | 24,8 (1682 veces más rápido) |
| Ultralytics YOLO11n-seg | 6.2 (60.5 veces más pequeño) | 2,9 (32,3 veces menos) | 24.3 (1716 veces más rápido) |
| Ultralytics YOLO26n-seg | 6,7 (56,0 veces más pequeño) | 2.7 (34.7 veces menos) | 25,2 (1655 veces más rápido) |
Esta comparación demuestra las diferencias sustanciales de tamaño y velocidad entre las variantes de SAM y los modelos de segmentación YOLO. Aunque SAM ofrece capacidades únicas de segmentación automática, los modelos YOLO, especialmente YOLOv8n-seg, YOLO11n-seg y YOLO26n-seg, son considerablemente más pequeños, rápidos y eficientes desde el punto de vista computacional.
Las velocidades de SAM se han medido con PyTorch y las de YOLO, con ONNX Runtime. Las pruebas se han realizado 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, nms=False) # YOLO26 NMS-free head; no-op for YOLOv8/YOLO11
model = YOLO(onnx_path)
model(ASSETS)Anotación automática: una vía rápida para crear conjuntos de datos de segmentación#
La anotación automática es una función clave de SAM que permite generar un conjunto de datos de segmentación utilizando un modelo de detección preentrenado. Esta función permite anotar de forma rápida y precisa un gran número de imágenes, evitando la necesidad de realizar 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 al modelo de detección YOLO para la detección inicial de objetos. |
sam_model | str | 'sam_b.pt' | Ruta al modelo SAM para la segmentación (admite los pesos de SAM, SAM 2, MobileSAM y SAM 3). |
device | str | '' | Dispositivo de cálculo (por ejemplo, 'cuda:0', 'cpu' o '' para la detección automática del dispositivo). |
conf | float | 0.25 | Umbral de confianza de la detección YOLO para filtrar las detecciones débiles. |
iou | float | 0.45 | Umbral de IoU para la supresión no máxima, que permite filtrar las cajas superpuestas. |
imgsz | int | 640 | Tamaño de entrada para cambiar el tamaño de las imágenes (debe ser múltiplo de 32). |
max_det | int | 300 | Número máximo de detecciones por imagen para optimizar el uso de memoria. |
classes | list[int] | None | Lista de índices de clase que se detectarán (por ejemplo, [0, 1] para persona y bicicleta). |
output_dir | str | None | Directorio donde se guardarán las anotaciones (de forma predeterminada: directorio hermano de <data>_auto_annotate_labels). |
La función auto_annotate recibe la ruta a tus imágenes, con argumentos opcionales para especificar los modelos de detección preentrenado y de segmentación SAM, el dispositivo en el que se ejecutarán los modelos y el directorio de salida donde se guardarán los resultados anotados.
La anotación automática 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 resulta especialmente beneficiosa para 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 en la anotación manual.
Citas y agradecimientos#
Si encuentras SAM útil en tu trabajo de investigación o desarrollo, considera citar el 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 artificial.
Preguntas frecuentes#
El Segment Anything Model (SAM) de Meta es un modelo revolucionario de segmentación de imágenes diseñado para tareas de segmentación guiada por avisos. Aprovecha una arquitectura avanzada, que incluye codificadores de imágenes y de avisos combinados con un decodificador de máscaras ligero, para generar máscaras de segmentación de alta calidad a partir de varios avisos, como indicaciones espaciales o de texto. Entrenado en el expansivo conjunto de datos SA-1B, SAM destaca en el rendimiento sin entrenamiento previo, adaptándose a nuevas distribuciones de imágenes y tareas sin conocimiento previo.
Puedes utilizar el Modelo Segment Anything (SAM) para la segmentación de imágenes ejecutando inferencias con diversas indicaciones, como cajas delimitadoras o puntos. Este es 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]])Como alternativa, puedes ejecutar inferencias con SAM desde la interfaz de línea de comandos (CLI):
yolo predict model=sam_b.pt source=path/to/image.jpgPara consultar 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 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 desde el punto de vista computacional, mientras que los modelos SAM destacan en tareas de segmentación flexibles, mediante indicaciones y zero-shot.
El SAM de Ultralytics ofrece una función de anotación automática que permite generar conjuntos de datos de segmentación utilizando un modelo de detección preentrenado. Este es 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 recibe la ruta a tus imágenes y argumentos opcionales para los modelos de detección preentrenado y de segmentación SAM, junto con las especificaciones del dispositivo y del directorio de salida. Para consultar una guía completa, visita Anotación automática.
SAM se entrena con el amplio conjunto de datos SA-1B, que contiene más de 1.000 millones de máscaras distribuidas en 11 millones de imágenes. SA-1B es el mayor conjunto de datos de segmentación hasta la fecha y proporciona datos de entrenamiento diversos y de alta calidad, lo que garantiza un rendimiento zero-shot impresionante en distintas tareas de segmentación. Para obtener más información, visita la sección de conjuntos de datos.