Modelo de segmentación de cualquier cosa (SAM)#
Te damos la bienvenida a la vanguardia de la segmentación de imágenes con el Modelo de segmentación de cualquier cosa, o SAM. Este revolucionario modelo ha cambiado las reglas del juego al introducir la segmentación de imágenes guiada por indicaciones con rendimiento en tiempo real, estableciendo nuevos estándares en este campo.
Introducción a SAM: el modelo de segmentación de cualquier cosa#
El Modelo de segmentación de cualquier cosa, o SAM, es un modelo de segmentación de imágenes de última generación que permite realizar segmentaciones guiadas por indicaciones y ofrece una versatilidad sin igual en tareas de análisis de imágenes. SAM es el núcleo de la iniciativa Segment Anything, un proyecto revolucionario que presenta 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 superpuestas con máscaras 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, 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 confirman las valoraciones humanas y numerosos experimentos, son de gran calidad y diversidad. Las imágenes se agrupan según el número de máscaras por imagen para su visualización (hay una media de ∼100 máscaras por imagen).
Características principales del Modelo de segmentación de cualquier cosa (SAM)#
- Tarea de segmentación guiada por indicaciones: SAM se diseñó para realizar tareas de segmentación guiadas por indicaciones, lo que le permite generar máscaras de segmentación válidas a partir de cualquier indicación, como pistas espaciales o textuales que identifican un objeto.
- Arquitectura avanzada: El Modelo de segmentación de cualquier cosa emplea un potente codificador de imágenes, un codificador de indicaciones y un decodificador de máscaras ligero. Esta arquitectura única permite proporcionar indicaciones de forma flexible, calcular máscaras en tiempo real y tener en cuenta la ambigüedad en las 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 ofrece un rendimiento zero-shot excepcional en diversas tareas de segmentación, por lo que es una herramienta lista para usar en distintas aplicaciones que apenas requiere ingeniería de indicaciones.
Para conocer en profundidad el Modelo de segmentación de cualquier cosa y el 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, 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 detalles.
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. Los emojis ✅ indican los modos compatibles y los emojis ❌, los modos 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 de segmentación de cualquier cosa puede emplearse en multitud de tareas posteriores que van más allá de sus datos de entrenamiento. Entre ellas se incluyen 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 de SAM#
Segmenta la imagen con las indicaciones proporcionadas.
from ultralytics import SAM
# Cargar un modelo
model = SAM("sam_b.pt")
# Mostrar información del modelo (opcional)
model.info()
# Ejecutar inferencia con una indicación de cuadros delimitadores
results = model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
# Ejecutar inferencia con un único punto
results = model(points=[900, 370], labels=[1])
# Ejecutar inferencia con varios puntos
results = model(points=[[400, 370], [900, 370]], labels=[1, 1])
# Ejecutar inferencia con una indicación de varios puntos por objeto
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# Ejecutar inferencia con una indicación de puntos negativos
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])Segmenta toda la imagen.
from ultralytics import SAM
# Cargar un modelo
model = SAM("sam_b.pt")
# Mostrar información del modelo (opcional)
model.info()
# Ejecutar inferencia
model("path/to/image.jpg")- La lógica consiste en segmentar toda la imagen si no se proporciona ninguna indicación (bboxes/puntos/máscaras).
De este modo, puedes establecer la imagen una vez y ejecutar inferencias con varias indicaciones sin tener que ejecutar el codificador de imágenes varias veces.
import cv2
from ultralytics.models.sam import Predictor as SAMPredictor
# Crear SAMPredictor
overrides = {"conf": 0.25, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "mobile_sam.pt"}
predictor = SAMPredictor(overrides=overrides)
# Configura la imagen
predictor.set_image("ultralytics/assets/zidane.jpg") # Establecer con un archivo de imagen
predictor.set_image(cv2.imread("ultralytics/assets/zidane.jpg")) # Establecer con np.ndarray
results = predictor(bboxes=[439, 437, 524, 709])
# Ejecutar inferencia con una indicación de un solo punto
results = predictor(points=[900, 370], labels=[1])
# Ejecutar inferencia con indicaciones de varios puntos
results = predictor(points=[[400, 370], [900, 370]], labels=[1, 1])
# Ejecutar inferencia con una indicación de puntos negativos
results = predictor(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
# Restablecer imagen
predictor.reset_image()Segmentarlo todo con argumentos adicionales.
from ultralytics.models.sam import Predictor as SAMPredictor
# Crear SAMPredictor
overrides = {"conf": 0.25, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "mobile_sam.pt"}
predictor = SAMPredictor(overrides=overrides)
# Segmentar con argumentos adicionales
results = predictor(source="ultralytics/assets/zidane.jpg", crop_n_layers=1, points_stride=64, min_mask_region_area=100)Todos los results que se devuelven 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 de
Segment everything, consulta la referencia dePredictor/generate.
Comparación 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 backbone YOLOv8 | 23.9 | 11.8 | 58.0 |
| Ultralytics YOLOv8n-seg | 7.1 (52.8x más pequeño) | 3.4 (27.6x menos) | 24.8 (1682x más rápido) |
| Ultralytics YOLO11n-seg | 6.2 (60.5x más pequeño) | 2.9 (32.3x menos) | 24.3 (1716x más rápido) |
| Ultralytics YOLO26n-seg | 6.7 (56.0x más pequeño) | 2.7 (34.7x menos) | 25.2 (1655x más rápido) |
Esta comparación muestra las diferencias considerables 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, en particular YOLOv8n-seg, YOLO11n-seg y YOLO26n-seg, son mucho 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 usando torch==2.10.0, ultralytics==8.4.31 y onnxruntime==1.24.4. Para reproducir esta prueba:
from ultralytics import ASSETS, SAM, YOLO, FastSAM
# Perfilar SAM-b, MobileSAM
for file in ["sam_b.pt", "mobile_sam.pt"]:
model = SAM(file)
model.info()
model(ASSETS)
# Perfilar FastSAM-s
model = FastSAM("FastSAM-s.pt")
model.info()
model(ASSETS)
# Perfilar modelos YOLO (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) # Cabezal sin NMS de YOLO26; no hace nada con YOLOv8/YOLO11
model = YOLO(onnx_path)
model(ASSETS)Anotación automática: una forma rápida de 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 mediante un modelo de detección preentrenado. Esta función permite anotar una gran cantidad de imágenes de forma rápida y precisa, sin necesidad de invertir tiempo en el etiquetado manual.
Genera tu conjunto de datos de segmentación con 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 que se van a anotar o segmentar. |
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 (p. ej., 'cuda:0', 'cpu' o '' para detectar automáticamente el dispositivo). |
conf | float | 0.25 | Umbral de confianza de detección YOLO para filtrar las detecciones poco fiables. |
iou | float | 0.45 | Umbral de IoU para la supresión no máxima (NMS) y el filtrado de cajas superpuestas. |
imgsz | int | 640 | Tamaño de entrada para cambiar el tamaño de las imágenes (se redondea al múltiplo de 32 más cercano por exceso si es necesario). |
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 van a detectar (p. ej., [0, 1] para persona y bicicleta). |
output_dir | str | None | Directorio donde se guardan las anotaciones (por defecto: directorio hermano de <data>_auto_annotate_labels). |
La función auto_annotate recibe la ruta a tus imágenes y argumentos opcionales para especificar los modelos de detección y segmentación SAM preentrenados, 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 útil 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 SAM te resulta útil en tus trabajos 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 dar las gracias a Meta AI por crear y mantener este valioso recurso para la comunidad de visión artificial.
Preguntas frecuentes#
El Modelo de segmentación de cualquier cosa (SAM) de Meta es un revolucionario modelo de segmentación de imágenes diseñado para tareas de segmentación guiadas por indicaciones. Aprovecha una arquitectura avanzada que combina codificadores de imágenes e indicaciones con un decodificador de máscaras ligero para generar máscaras de segmentación de alta calidad a partir de distintas indicaciones, como pistas espaciales o textuales. Entrenado con el amplio conjunto de datos SA-1B, SAM destaca por su rendimiento zero-shot y se adapta a nuevas distribuciones de imágenes y tareas sin conocimientos previos.
Puedes utilizar el Modelo de segmentación de cualquier cosa (SAM) para segmentar imágenes ejecutando inferencias con distintas indicaciones, como cuadros delimitadores o puntos. Aquí tienes un ejemplo con Python:
from ultralytics import SAM # Cargar un modelo model = SAM("sam_b.pt") # Segmentar con un prompt de caja delimitadora model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709]) # Segmentar con una indicación de puntos model("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1]) # Segmentar con indicaciones de varios puntos model("ultralytics/assets/zidane.jpg", points=[[400, 370], [900, 370]], labels=[1, 1]) # Segmentar con indicaciones de varios puntos por objeto model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 1]]) # Segmentar con una indicación de puntos negativos. model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 0]])También 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 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 zero-shot. Por ejemplo, YOLO26n-seg es 56x más pequeño y más de 1650x 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 flexible, guiada por indicaciones y zero-shot.
SAM de Ultralytics ofrece una función de anotación automática que permite generar conjuntos de datos de segmentación mediante 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 recibe la ruta a tus imágenes y argumentos opcionales para los modelos de detección y segmentación SAM preentrenados, además de especificaciones del dispositivo y del directorio de salida. Consulta Anotación automática para ver la guía completa.
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 detalles, visita la sección de conjuntos de datos.