Phase 04 - Lesson 24

SAM 3 y Segmentación de Vocabulario Abierto

This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.

Dale a un modelo un prompt de texto y una imagen y obtén máscaras para cada objeto coincidente. SAM 3 convirtió eso en una sola pasada hacia adelante.

Tipo: Usar + Construir Lenguajes: Python Requisitos previos: Fase 4 Lección 07 (U-Net), Fase 4 Lección 08 (Mask R-CNN), Fase 4 Lección 18 (CLIP) Tiempo: ~60 minutos

Objetivos de Aprendizaje

  • Distinguir SAM (solo prompts visuales), Grounded SAM / SAM 2 (detector + SAM) y SAM 3 (prompts de texto nativos mediante Promptable Concept Segmentation)
  • Explicar la arquitectura de SAM 3: backbone compartido + detector de imagen + rastreador de video basado en memoria + cabeza de presencia + diseño desacoplado detector-rastreador
  • Usar la integración de SAM 3 de transformers de Hugging Face para detección, segmentación y rastreo de video guiados por texto
  • Elegir entre SAM 3, Grounded SAM 2, YOLO-World y SAM-MI según la latencia, la complejidad del concepto y el destino de despliegue

El Problema

El SAM de 2023 era un modelo de solo prompts visuales: haces clic en un punto o dibujas una caja y devuelve una máscara. Para "dame todas las naranjas en esta foto" necesitabas un detector (Grounding DINO) que produjera cajas y luego SAM para segmentar cada una. Grounded SAM convirtió esto en un pipeline, pero era una cascada de dos modelos congelados con una inevitable acumulación de errores.

SAM 3 (Meta, nov. de 2025, ICLR 2026) eliminó la cascada. Acepta una breve frase nominal o un ejemplar de imagen como prompt y devuelve todas las máscaras coincidentes e IDs de instancia en una sola pasada hacia adelante. Eso es Promptable Concept Segmentation (PCS). Combinado con la actualización Object Multiplex de marzo de 2026 (SAM 3.1), rastrea múltiples instancias del mismo concepto a lo largo del video de manera eficiente.

Esta lección trata sobre el cambio estructural que esto representa. La segmentación 2D, la detección y el grounding texto-imagen se han fusionado en un solo modelo. La pregunta de producción ya no es "qué pipeline encadeno", sino "qué modelo orientable maneja mi caso de uso de extremo a extremo".

El Concepto

Las tres generaciones

flowchart LR
    subgraph SAM1["SAM (2023)"]
        A1["Imagen + prompt de punto/caja"] --> A2["Codificador ViT"] --> A3["Decodificador de máscara"]
        A3 --> A4["Máscara para ese prompt"]
    end
    subgraph GSAM2["Grounded SAM 2 (2024)"]
        B1["Texto"] --> B2["Grounding DINO"] --> B3["Cajas"] --> B4["SAM 2"] --> B5["Máscaras + rastreo"]
        B6["Imagen"] --> B2
        B6 --> B4
    end
    subgraph SAM3["SAM 3 (2025)"]
        C1["Texto O ejemplar de imagen"] --> C2["Backbone compartido"]
        C3["Imagen"] --> C2
        C2 --> C4["Detector de imagen + rastreador de memoria<br/>+ cabeza de presencia"]
        C4 --> C5["Todas las máscaras coincidentes<br/>+ IDs de instancia"]
    end

    style SAM1 fill:#e5e7eb,stroke:#6b7280
    style GSAM2 fill:#fef3c7,stroke:#d97706
    style SAM3 fill:#dcfce7,stroke:#16a34a

Promptable Concept Segmentation

Un "prompt de concepto" es una breve frase nominal ("yellow school bus", "striped red umbrella", "hand holding a mug") o un ejemplar de imagen. El modelo devuelve máscaras de segmentación para cada instancia en la imagen que coincide con el concepto, más un ID de instancia único por coincidencia.

Esto difiere del SAM clásico de prompt visual en tres aspectos:

  1. No se requiere prompt por instancia — un solo prompt de texto devuelve todas las coincidencias.
  2. Vocabulario abierto — el concepto puede ser cualquier cosa describible en lenguaje natural.
  3. Devuelve múltiples instancias a la vez en lugar de una máscara por prompt.

Piezas arquitectónicas clave

  • Backbone compartido — un solo ViT procesa la imagen. Tanto la cabeza del detector como el rastreador basado en memoria leen de él.
  • Cabeza de presencia — predice si el concepto está presente en la imagen. Desacopla "¿está aquí?" de "¿dónde está?". Reduce los falsos positivos en conceptos ausentes.
  • Detector-rastreador desacoplado — la detección a nivel de imagen y el rastreo a nivel de video tienen cabezas separadas para que no interfieran entre sí.
  • Banco de memoria — almacena features por instancia a lo largo de los frames para el rastreo de video (el mismo mecanismo que usaba SAM 2).

Entrenamiento a escala

SAM 3 fue entrenado con 4 millones de conceptos únicos generados por un motor de datos que anota y corrige iterativamente usando IA + revisión humana. El nuevo benchmark SA-CO contiene 270 mil conceptos únicos, 50 veces más grande que los benchmarks anteriores. SAM 3 alcanza el 75-80% del rendimiento humano en SA-CO y duplica los sistemas existentes en PCS de imagen + video.

SAM 3.1 Object Multiplex

Actualización de marzo de 2026: Object Multiplex introduce un mecanismo de memoria compartida para el rastreo conjunto de muchas instancias del mismo concepto a la vez. Anteriormente, rastrear N instancias implicaba N bancos de memoria separados. Multiplex los colapsa en una sola memoria compartida con consultas por instancia. Resultado: rastreo multi-objeto sustancialmente más rápido sin sacrificar la precisión.

Dónde sigue importando Grounded SAM en 2026

  • Cuando necesitas insertar un detector de vocabulario abierto específico (DINO-X, Florence-2).
  • Cuando los términos de SAM 3 (con acceso restringido en HF) son un impedimento.
  • Cuando necesitas más control sobre el umbral del detector del que SAM 3 expone.
  • Para trabajo de investigación / ablación sobre el componente detector.

Los pipelines modulares todavía tienen su lugar. Para la mayor parte del trabajo de producción, SAM 3 es la respuesta más simple.

YOLO-World vs SAM 3

  • YOLO-World — solo detector de vocabulario abierto (sin máscaras). Tiempo real. Mejor cuando necesitas cajas a alta tasa de fotogramas.
  • SAM 3 — segmentación + rastreo completos. Más lento pero con una salida más rica.

División de producción: YOLO-World para pipelines rápidos de solo detección (navegación robótica, dashboards rápidos), SAM 3 para cualquier cosa que necesite máscaras o rastreo.

Eficiencia de SAM-MI

SAM-MI (2025-2026) aborda el cuello de botella del decodificador de SAM. Ideas clave:

  • Prompt disperso de puntos — usa unos pocos puntos bien elegidos en lugar de prompts densos; reduce las llamadas al decodificador en un 96%.
  • Agregación superficial de máscaras — fusiona predicciones de máscaras aproximadas en una sola máscara más nítida.
  • Inyección de máscara desacoplada — el decodificador recibe features de máscara precalculadas en lugar de volver a ejecutarlas.

Resultado: aceleración de ~1,6× sobre Grounded-SAM en benchmarks de vocabulario abierto.

Formato de salida para los tres modelos

Todos devuelven la misma estructura general (cajas + etiquetas + scores + máscaras + IDs), lo cual es útil — tu pipeline aguas abajo no tiene que ramificarse según qué modelo se ejecutó.

Constrúyelo

Paso 1: Construcción del prompt

Construye un ayudante que convierta una frase del usuario en una lista de prompts de concepto de SAM 3. Esta es la frontera donde "lo que el usuario escribió" se encuentra con "lo que el modelo consume".

def split_concepts(sentence):
    """
    Heuristic splitter for multi-concept prompts.
    Returns list of short noun phrases.
    """
    for sep in [",", ";", "and", "or", "&"]:
        if sep in sentence:
            parts = [p.strip() for p in sentence.replace("and ", ",").split(",")]
            return [p for p in parts if p]
    return [sentence.strip()]

print(split_concepts("cats, dogs and balloons"))

SAM 3 acepta un concepto por pasada hacia adelante; para consultas multi-concepto, itera o procésalas en lote.

Paso 2: Ayudantes de posprocesamiento

Convierte las salidas en bruto de SAM 3 en una lista limpia de detecciones que coincida con el contrato de pipeline de nuestra Fase 4 Lección 16.

from dataclasses import dataclass
from typing import List

@dataclass
class ConceptDetection:
    concept: str
    instance_id: int
    box: tuple          # (x1, y1, x2, y2)
    score: float
    mask_rle: str       # run-length encoded


def rle_encode(binary_mask):
    flat = binary_mask.flatten().astype("uint8")
    runs = []
    prev, count = flat[0], 0
    for v in flat:
        if v == prev:
            count += 1
        else:
            runs.append((int(prev), count))
            prev, count = v, 1
    runs.append((int(prev), count))
    return ";".join(f"{v}x{c}" for v, c in runs)

El RLE mantiene pequeñas las cargas útiles de respuesta incluso para muchas máscaras de alta resolución. El mismo formato funciona en SAM 2, SAM 3 y Grounded SAM 2.

Paso 3: Una interfaz unificada de segmentación de vocabulario abierto

Envuelve cualquier backend que tengas (SAM 3, Grounded SAM 2, YOLO-World + SAM 2) detrás de un solo método. Tu código aguas abajo no cambia cuando cambia el backend.

from abc import ABC, abstractmethod
import numpy as np

class OpenVocabSeg(ABC):
    @abstractmethod
    def detect(self, image: np.ndarray, concept: str) -> List[ConceptDetection]:
        ...


class StubOpenVocabSeg(OpenVocabSeg):
    """
    Deterministic stub used for pipeline testing when real models are not loaded.
    """
    def detect(self, image, concept):
        h, w = image.shape[:2]
        return [
            ConceptDetection(
                concept=concept,
                instance_id=0,
                box=(w * 0.2, h * 0.3, w * 0.5, h * 0.8),
                score=0.89,
                mask_rle="0x100;1x50;0x200",
            ),
            ConceptDetection(
                concept=concept,
                instance_id=1,
                box=(w * 0.55, h * 0.25, w * 0.85, h * 0.75),
                score=0.74,
                mask_rle="0x80;1x40;0x220",
            ),
        ]

La subclase real SAM3OpenVocabSeg envolvería transformers.Sam3Model y Sam3Processor.

Paso 4: Uso de SAM 3 de Hugging Face (referencia)

Para el modelo real, la integración transformers:

from transformers import Sam3Processor, Sam3Model
import torch

processor = Sam3Processor.from_pretrained("facebook/sam3")
model = Sam3Model.from_pretrained("facebook/sam3").eval()

inputs = processor(images=pil_image, return_tensors="pt")
inputs = processor.set_text_prompt(inputs, "yellow school bus")

with torch.no_grad():
    outputs = model(**inputs)

masks = processor.post_process_masks(
    outputs.masks, inputs.original_sizes, inputs.reshaped_input_sizes
)
boxes = outputs.boxes
scores = outputs.scores

Un prompt, todas las coincidencias devueltas en una sola llamada.

Paso 5: Mide lo que Grounded SAM 2 te daba gratis

Un benchmark honesto: ¿qué pasa cuando reemplazas Grounded SAM 2 por SAM 3 en un pipeline real?

  • Latencia: SAM 3 ahorra una pasada hacia adelante (sin detector separado), pero el modelo en sí es más pesado; por lo general neutro en conjunto o una ligera aceleración.
  • Precisión: SAM 3 es sustancialmente mejor en conceptos raros o composicionales ("striped red umbrella"). Similar en conceptos comunes de una sola palabra.
  • Flexibilidad: Grounded SAM 2 te permite intercambiar detectores (DINO-X, Florence-2, Grounding DINO 1.5); SAM 3 es monolítico.

Conclusión: SAM 3 es el predeterminado para la segmentación de vocabulario abierto en 2026. Grounded SAM 2 sigue siendo la respuesta correcta cuando necesitas flexibilidad de detector o términos de uso diferentes.

Úsalo

Patrones de despliegue en producción:

  • Anotación en tiempo real — SAM 3 + la función de etiqueta-como-prompt-de-texto de CVAT. Los anotadores seleccionan un nombre de etiqueta; SAM 3 pre-etiqueta cada instancia coincidente. Revisa y corrige.
  • Analítica de video — SAM 3.1 Object Multiplex para rastreo multi-objeto; alimenta los frames al rastreador basado en memoria.
  • Robótica — SAM 3 para manipulación de vocabulario abierto ("pick up the red cup"); se ejecuta como una primitiva de planificación.
  • Imágenes médicas — SAM 3 ajustado con conceptos médicos; requiere solicitud de acceso en HF.

Ultralytics envuelve SAM 3 en su paquete de Python:

from ultralytics import SAM

model = SAM("sam3.pt")
results = model(image_path, prompts="yellow school bus")

La misma interfaz que YOLO y SAM 2.

Entrégalo

Esta lección produce:

  • outputs/prompt-open-vocab-stack-picker.md — un prompt que elige SAM 3 / Grounded SAM 2 / YOLO-World / SAM-MI según la latencia, la complejidad del concepto y el licenciamiento.
  • outputs/skill-concept-prompt-designer.md — una skill que convierte enunciados del usuario en prompts de concepto SAM 3 bien formados (división, desambiguación, fallbacks).

Ejercicios

  1. (Fácil) Ejecuta SAM 3 en 10 imágenes con prompts de concepto que elijas. Compáralo con SAM 2 + Grounding DINO 1.5 en las mismas imágenes. Reporta qué conceptos se le escaparon a cada modelo.
  2. (Medio) Construye una UI de "clic-para-incluir / clic-para-excluir" sobre SAM 3: un prompt de texto devuelve instancias candidatas; el usuario hace clic para elegir cuáles cuentan como positivas. Produce el conjunto final de conceptos como JSON.
  3. (Difícil) Haz fine-tuning de SAM 3 en un conjunto de conceptos personalizado (por ejemplo, 5 tipos de componentes electrónicos) con 20 imágenes etiquetadas cada uno. Compáralo con SAM 3 zero-shot en el mismo conjunto de prueba; mide la mejora del IoU de la máscara.

Términos Clave

Término Lo que la gente dice Lo que realmente significa
Segmentación de vocabulario abierto "Segmentar por texto" Producir máscaras para objetos descritos en lenguaje natural, no un conjunto fijo de etiquetas
PCS "Promptable Concept Segmentation" La tarea central de SAM 3 — dada una frase nominal o ejemplar de imagen, segmentar todas las instancias coincidentes
Prompt de concepto "La entrada de texto" Breve frase nominal o ejemplar de imagen; no una oración completa
Cabeza de presencia "¿Está aquí?" Módulo de SAM 3 que decide si el concepto existe en la imagen antes de la localización
SA-CO "Benchmark de SAM 3" Benchmark de segmentación de vocabulario abierto con 270 mil conceptos; 50 veces más grande que los benchmarks de vocabulario abierto anteriores
Object Multiplex "Actualización de SAM 3.1" Rastreo multi-objeto de memoria compartida; rastreo conjunto rápido de muchas instancias
Grounded SAM 2 "Pipeline modular" Cascada detector + SAM 2; aún relevante cuando importa el intercambio de detector
SAM-MI "Variante eficiente de SAM" Mask Injection para una aceleración de 1,6x sobre Grounded-SAM

Lecturas Adicionales

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).