Ir al contenido

SAM 2.1

Acabamos de añadir soporte para el modelo SAM2.1, que es más preciso. ¡Pruébelo!

SAM 2: Segment Anything Model 2

Inferencia con Segment Anything 2 en Colab

SAM 2, el sucesor del Segment Anything Model (SAM) de Meta, es una herramienta de vanguardia diseñada para la segmentación integral de objetos tanto en imágenes como en vídeos. Destaca en el manejo de datos visuales complejos a través de una arquitectura de modelo unificada y adaptable que admite el procesamiento en tiempo real y la generalización zero-shot.

Resultados de ejemplo de SAM 2

Características clave



Ver: Cómo ejecutar la inferencia con SAM2 de Meta utilizando Ultralytics | Guía paso a paso 🎉

Arquitectura de modelo unificada

SAM 2 combina las capacidades de segmentación de imágenes y vídeos en un único modelo. Esta unificación simplifica la implementación y permite un rendimiento consistente en diferentes tipos de medios. Aprovecha una interfaz flexible basada en indicaciones, que permite a los usuarios especificar los objetos de interés a través de varios tipos de indicaciones, como puntos, cuadros delimitadores o máscaras.

Rendimiento en tiempo real

El modelo alcanza velocidades de inferencia en tiempo real, procesando aproximadamente 44 fotogramas por segundo. Esto hace que SAM 2 sea adecuado para aplicaciones que requieren retroalimentación inmediata, como la edición de vídeo y la realidad aumentada.

Generalización Zero-Shot

SAM 2 puede segmentar objetos que nunca ha encontrado antes, lo que demuestra una fuerte generalización zero-shot. Esto es particularmente útil en dominios visuales diversos o en evolución donde las categorías predefinidas pueden no cubrir todos los objetos posibles.

Refinamiento interactivo

Los usuarios pueden refinar iterativamente los resultados de la segmentación proporcionando indicaciones adicionales, lo que permite un control preciso sobre el resultado. Esta interactividad es esencial para ajustar los resultados en aplicaciones como la anotación de vídeo o las imágenes médicas.

Manejo avanzado de desafíos visuales

SAM 2 incluye mecanismos para gestionar los desafíos comunes de la segmentación de vídeo, como la oclusión y la reaparición de objetos. Utiliza un mecanismo de memoria sofisticado para realizar un seguimiento de los objetos a través de los fotogramas, lo que garantiza la continuidad incluso cuando los objetos están temporalmente ocultos o salen y vuelven a entrar en la escena.

Para una comprensión más profunda de la arquitectura y las capacidades de SAM 2, explore el artículo de investigación de SAM 2.

Rendimiento y detalles técnicos

SAM 2 establece un nuevo punto de referencia en el campo, superando a los modelos anteriores en varias métricas:

Métrica SAM 2 SOTA anterior
Segmentación de vídeo interactiva Mejor -
Interacciones humanas requeridas 3 veces menos Línea de base
Precisión de la segmentación de imágenes Mejorado SAM
Velocidad de Inferencia 6 veces más rápido SAM

Arquitectura del Modelo

Componentes centrales

  • Codificador de imágenes y vídeo: Utiliza una arquitectura basada en transformadores para extraer características de alto nivel tanto de imágenes como de fotogramas de vídeo. Este componente es responsable de comprender el contenido visual en cada paso de tiempo.
  • Codificador de Prompts: Procesa los prompts proporcionados por el usuario (puntos, cajas, máscaras) para guiar la tarea de segmentación. Esto permite que SAM 2 se adapte a la entrada del usuario y se dirija a objetos específicos dentro de una escena.
  • Mecanismo de Memoria: Incluye un codificador de memoria, un banco de memoria y un módulo de atención de memoria. Estos componentes almacenan y utilizan colectivamente información de fotogramas pasados, lo que permite que el modelo mantenga un seguimiento de objetos consistente a lo largo del tiempo.
  • Decodificador de máscaras: Genera las máscaras de segmentación finales basándose en las características de la imagen codificada y las indicaciones. En el vídeo, también utiliza el contexto de la memoria para garantizar un seguimiento preciso a través de los fotogramas.

Diagrama de arquitectura de SAM 2

Mecanismo de memoria y manejo de oclusión

El mecanismo de memoria permite que SAM 2 gestione las dependencias temporales y las oclusiones en los datos de vídeo. A medida que los objetos se mueven e interactúan, SAM 2 registra sus características en un banco de memoria. Cuando un objeto se ocluye, el modelo puede confiar en esta memoria para predecir su posición y apariencia cuando reaparece. El encabezado de oclusión maneja específicamente los escenarios en los que los objetos no están visibles, prediciendo la probabilidad de que un objeto esté ocluido.

Resolución de Ambigüedad Multi-Máscara

En situaciones con ambigüedad (por ejemplo, objetos superpuestos), SAM 2 puede generar múltiples predicciones de máscara. Esta característica es crucial para representar con precisión escenas complejas donde una sola máscara podría no describir suficientemente los matices de la escena.

Conjunto de datos SA-V

El conjunto de datos SA-V, desarrollado para el entrenamiento de SAM 2, es uno de los conjuntos de datos de segmentación de video más grandes y diversos disponibles. Incluye:

  • Más de 51.000 vídeos: Capturados en 47 países, proporcionando una amplia gama de escenarios del mundo real.
  • Más de 600.000 anotaciones de máscara: Anotaciones detalladas de máscaras espacio-temporales, denominadas "masklets", que cubren objetos y partes completas.
  • Escala del conjunto de datos: Cuenta con 4,5 veces más vídeos y 53 veces más anotaciones que los conjuntos de datos más grandes anteriores, lo que ofrece una diversidad y complejidad sin precedentes.

Benchmarks

Segmentación de objetos en video

SAM 2 ha demostrado un rendimiento superior en los principales benchmarks de segmentación de vídeo:

Conjunto de datos J&F J F
DAVIS 2017 82.5 79.8 85.2
YouTube-VOS 81.2 78.9 83.5

Segmentación interactiva

En tareas de segmentación interactiva, SAM 2 muestra una eficiencia y precisión significativas:

Conjunto de datos NoC@90 AUC
DAVIS Interactive 1.54 0.872

Instalación

Para instalar SAM 2, utilice el siguiente comando. Todos los modelos SAM 2 se descargarán automáticamente en el primer uso.

pip install ultralytics

Cómo usar SAM 2: Versatilidad en la segmentación de imágenes y videos

La siguiente tabla detalla los modelos SAM 2 disponibles, sus pesos pre-entrenados, las tareas admitidas y la compatibilidad con diferentes modos de funcionamiento como Inferencia, Validación, Entrenamiento y Exportación.

Tipo de Modelo Pesos Pre-entrenados Tareas admitidas Inferencia Validación Entrenamiento Exportar
SAM 2 muy pequeño sam2_t.pt Segmentación de instancias
SAM 2 pequeño sam2_s.pt Segmentación de instancias
Base de SAM 2 sam2_b.pt Segmentación de instancias
SAM 2 grande sam2_l.pt Segmentación de instancias
SAM 2.1 muy pequeño sam2.1_t.pt Segmentación de instancias
SAM 2.1 pequeño sam2.1_s.pt Segmentación de instancias
SAM 2.1 base sam2.1_b.pt Segmentación de instancias
SAM 2.1 grande sam2.1_l.pt Segmentación de instancias

Ejemplos de predicción de SAM 2

SAM 2 se puede utilizar en un amplio espectro de tareas, incluyendo la edición de vídeo en tiempo real, las imágenes médicas y los sistemas autónomos. Su capacidad para segmentar datos visuales tanto estáticos como dinámicos la convierte en una herramienta versátil para investigadores y desarrolladores.

Segmentar con Indicaciones

Segmentar con Indicaciones

Utiliza prompts para segmentar objetos específicos en imágenes o vídeos.

from ultralytics import SAM

# Load a model
model = SAM("sam2.1_b.pt")

# Display model information (optional)
model.info()

# Run inference with bboxes prompt
results = model("path/to/image.jpg", bboxes=[100, 100, 200, 200])

# 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

Segmentar todo

Segmentar toda la imagen o el contenido de vídeo sin prompts específicos.

from ultralytics import SAM

# Load a model
model = SAM("sam2.1_b.pt")

# Display model information (optional)
model.info()

# Run inference
model("path/to/video.mp4")
# Run inference with a SAM 2 model
yolo predict model=sam2.1_b.pt source=path/to/video.mp4

Segmentar vídeo y rastrear objetos

Segmentar vídeo

Segmentar todo el contenido de vídeo con prompts específicos y rastrear objetos.

from ultralytics.models.sam import SAM2VideoPredictor

# Create SAM2VideoPredictor
overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model="sam2_b.pt")
predictor = SAM2VideoPredictor(overrides=overrides)

# Run inference with single point
results = predictor(source="test.mp4", points=[920, 470], labels=[1])

# Run inference with multiple points
results = predictor(source="test.mp4", points=[[920, 470], [909, 138]], labels=[1, 1])

# Run inference with multiple points prompt per object
results = predictor(source="test.mp4", points=[[[920, 470], [909, 138]]], labels=[[1, 1]])

# Run inference with negative points prompt
results = predictor(source="test.mp4", points=[[[920, 470], [909, 138]]], labels=[[1, 0]])
  • Este ejemplo demuestra cómo SAM 2 puede utilizarse para segmentar todo el contenido de una imagen o vídeo si no se proporcionan indicaciones (bboxes/puntos/máscaras).

Segmentación y seguimiento interactivos y dinámicos

SAM2DynamicInteractivePredictor es una extensión gratuita de SAM2 que permite la interacción dinámica con múltiples fotogramas y capacidades de aprendizaje continuo. Este predictor admite actualizaciones rápidas en tiempo real y gestión de memoria para mejorar el rendimiento del seguimiento en una secuencia de imágenes. Comparado con el SAM2 original, SAM2DynamicInteractivePredictor reconstruye el flujo de inferencia para hacer el mejor uso de los modelos SAM2 preentrenados sin requerir entrenamiento adicional.

Resultados de ejemplo de SAM 2

Características clave

Ofrece tres mejoras significativas:

  1. Dinámica interactiva: Añadir nuevos avisos para la fusión/desconexión de nuevas instancias en los siguientes fotogramas en cualquier momento durante el procesamiento de vídeo
  2. Aprendizaje continuo: Añadir nuevas indicaciones para las instancias existentes con el fin de mejorar el rendimiento del modelo a lo largo del tiempo.
  3. Compatibilidad con varias imágenes independientes: Procese varias imágenes independientes (no necesariamente de una secuencia de vídeo) con memoria compartida y seguimiento de objetos entre imágenes.

Capacidades básicas

  • Flexibilidad de indicaciones: Acepta cuadros delimitadores, puntos y máscaras como instrucciones.
  • Gestión del banco de memoria: Mantiene un banco de memoria dinámico para almacenar los estados de los objetos a través de las tramas.
  • Seguimiento multiobjeto: Admite el seguimiento de varios objetos simultáneamente con ID de objeto individuales.
  • Actualizaciones en tiempo real: Permite añadir nuevas indicaciones durante la inferencia sin reprocesar los fotogramas anteriores.
  • Procesamiento independiente de imágenes: Procesamiento de imágenes independientes con contexto de memoria compartida para la coherencia de objetos entre imágenes.

Adición dinámica de objetos

from ultralytics.models.sam import SAM2DynamicInteractivePredictor

# Create SAM2DynamicInteractivePredictor
overrides = dict(conf=0.01, task="segment", mode="predict", imgsz=1024, model="sam2_t.pt", save=False)
predictor = SAM2DynamicInteractivePredictor(overrides=overrides, max_obj_num=10)

# Define a category by box prompt
predictor.inference(img="image1.jpg", bboxes=[[100, 100, 200, 200]], obj_ids=[1], update_memory=True)

# Detect this particular object in a new image
results = predictor(source="image2.jpg")

# Add new category with a new object ID
results = predictor(
    source="image4.jpg",
    bboxes=[[300, 300, 400, 400]],  # New object
    obj_ids=[2],  # New object ID
    update_memory=True,  # Add to memory
)
# Perform inference
results = predictor.inference(img="image5.jpg")

# Add refinement prompts to the same category to boost performance
# This helps when object appearance changes significantly
results = predictor(
    source="image6.jpg",
    points=[[150, 150]],  # Refinement point
    labels=[1],  # Positive point
    obj_ids=[2],  # Same object ID
    update_memory=True,  # Update memory with new information
)
# Perform inference on new image
results = predictor(source="image7.jpg")

Nota

El SAM2DynamicInteractivePredictor está diseñado para trabajar con modelos SAM2 , y admite la adición/refinación de categorías por todos los indicaciones de casilla/punto/máscara que SAM2 soporta de forma nativa. Resulta especialmente útil en situaciones en las que los objetos aparecen o cambian con el tiempo, como en las tareas de anotación de vídeo o edición interactiva.

Argumentos

Nombre Valor predeterminado Tipo de datos Descripción
max_obj_num 3 str El número máximo preestablecido de categorías
update_memory False bool Si se actualiza la memoria con nuevas indicaciones
obj_ids None List[int] Lista de identificadores de objetos correspondientes a los avisos

Casos de uso

SAM2DynamicInteractivePredictor es ideal para:

  • Flujos de trabajo de anotación de vídeo en los que aparecen nuevos objetos durante la secuencia
  • Edición interactiva de vídeo que requiere la adición y el perfeccionamiento de objetos en tiempo real
  • Aplicaciones de vigilancia con necesidades de seguimiento dinámico de objetos
  • Imágenes médicas para el seguimiento de estructuras anatómicas a través de series temporales
  • Sistemas autónomos que requieren detección y seguimiento adaptativos de objetos
  • Conjuntos de datos de varias imágenes para la segmentación coherente de objetos en imágenes independientes
  • Análisis de recopilación de imágenes en las que es necesario rastrear objetos en distintas escenas
  • Segmentación entre dominios aprovechando la memoria de diversos contextos de imagen
  • Anotación semiautomática para crear conjuntos de datos eficientes con una intervención manual mínima

Comparación de SAM 2 vs YOLO

Aquí comparamos los modelos SAM2 de Meta, incluyendo la variante SAM2-t más pequeña, con el modelo de segmentación más pequeño de Ultralytics, YOLO11n-seg:

Modelo Tamaño
(MB)
Parámetros
(M)
Velocidad (CPU)
(ms/im)
Meta SAM-b 375 93.7 49401
Meta SAM2-b 162 80.8 31901
Meta SAM2-t 78.1 38.9 25997
MobileSAM 40.7 10.1 25381
FastSAM-s con backbone YOLOv8 23.7 11.8 55.9
Ultralytics YOLOv8n-seg 6.7 (11.7 veces más pequeño) 3.4 (11.4 veces menos) 24.5 (1061 veces más rápido)
Ultralytics YOLO11n-seg 5.9 (13.2 veces más pequeño) 2.9 (13.4 veces menos) 30.1 (864 veces 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. Si bien SAM proporciona capacidades únicas de segmentación automática, los modelos YOLO, particularmente YOLOv8n-seg y YOLO11n-seg, son significativamente más pequeños, rápidos y computacionalmente eficientes.

Pruebas realizadas en un Apple M4 Pro 2025 con 24 GB de RAM usando torch==2.6.0 y ultralytics==8.3.90. Para reproducir esta prueba:

Ejemplo

from ultralytics import ASSETS, SAM, YOLO, FastSAM

# Profile SAM2-t, SAM2-b, SAM-b, MobileSAM
for file in ["sam_b.pt", "sam2_b.pt", "sam2_t.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
for file_name in ["yolov8n-seg.pt", "yolo11n-seg.pt"]:
    model = YOLO(file_name)
    model.info()
    model(ASSETS)

Autoanotación: Creación eficiente de conjuntos de datos

La autoanotación es una potente característica de SAM 2, que permite a los usuarios generar conjuntos de datos de segmentación de forma rápida y precisa aprovechando los modelos preentrenados. Esta capacidad es particularmente útil para crear conjuntos de datos grandes y de alta calidad sin un extenso esfuerzo manual.

Cómo autoanotar con SAM 2



Ver: Anotación automática con Segment Anything 2 Model de Meta usando Ultralytics | Etiquetado de datos

Para autoanotar su conjunto de datos utilizando SAM 2, siga este ejemplo:

Ejemplo de autoanotación

from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolo11x.pt", sam_model="sam2_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 'yolo11x.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 la segmentación (admite las variantes SAM, SAM2 y los modelos mobile_sam).
device str '' Dispositivo de cálculo (p. ej., 'cuda:0', 'cpu' o '' para la detección automática de dispositivos).
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 no máxima para filtrar cuadros superpuestos.
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 eficiencia de memoria.
classes list[int] None Lista de índices de clase para detectar (p. ej., [0, 1] para persona y bicicleta).
output_dir str None Directorio para guardar las anotaciones (por defecto './labels' relativo a la ruta de datos).

Esta función facilita la creación rápida de conjuntos de datos de segmentación de alta calidad, ideal para investigadores y desarrolladores que buscan acelerar sus proyectos.

Limitaciones

A pesar de sus puntos fuertes, SAM 2 tiene ciertas limitaciones:

  • Estabilidad del seguimiento: SAM 2 puede perder el seguimiento de objetos durante secuencias extendidas o cambios significativos de punto de vista.
  • Confusión de objetos: El modelo a veces puede confundir objetos de apariencia similar, especialmente en escenas concurridas.
  • Eficiencia con múltiples objetos: La eficiencia de la segmentación disminuye al procesar múltiples objetos simultáneamente debido a la falta de comunicación entre objetos.
  • Detalle Precisión: Puede perder detalles finos, especialmente con objetos que se mueven rápidamente. Las indicaciones adicionales pueden abordar parcialmente este problema, pero la suavidad temporal no está garantizada.

Citas y agradecimientos

Si SAM 2 es una parte crucial de su trabajo de investigación o desarrollo, cite el modelo utilizando la siguiente referencia:

@article{ravi2024sam2,
  title={SAM 2: Segment Anything in Images and Videos},
  author={Ravi, Nikhila and Gabeur, Valentin and Hu, Yuan-Ting and Hu, Ronghang and Ryali, Chaitanya and Ma, Tengyu and Khedr, Haitham and R{\"a}dle, Roman and Rolland, Chloe and Gustafson, Laura and Mintun, Eric and Pan, Junting and Alwala, Kalyan Vasudev and Carion, Nicolas and Wu, Chao-Yuan and Girshick, Ross and Doll{\'a}r, Piotr and Feichtenhofer, Christoph},
  journal={arXiv preprint},
  year={2024}
}

Extendemos nuestra gratitud a Meta AI por sus contribuciones a la comunidad de la IA con este innovador modelo y conjunto de datos.

Preguntas frecuentes

¿Qué es SAM 2 y cómo mejora el modelo Segment Anything Model (SAM) original?

SAM 2, el sucesor del Segment Anything Model (SAM) de Meta, es una herramienta de vanguardia diseñada para la segmentación integral de objetos tanto en imágenes como en vídeos. Destaca en el manejo de datos visuales complejos a través de una arquitectura de modelo unificada y adaptable que admite el procesamiento en tiempo real y la generalización zero-shot. SAM 2 ofrece varias mejoras con respecto al SAM original, incluyendo:

  • Arquitectura de Modelo Unificada: Combina capacidades de segmentación de imágenes y vídeo en un solo modelo.
  • Rendimiento en tiempo real: Procesa aproximadamente 44 fotogramas por segundo, lo que lo hace adecuado para aplicaciones que requieren retroalimentación inmediata.
  • Generalización Zero-Shot: Segmenta objetos que nunca ha encontrado antes, útil en diversos dominios visuales.
  • Refinamiento Interactivo: Permite a los usuarios refinar iterativamente los resultados de la segmentación proporcionando indicaciones adicionales.
  • Manejo Avanzado de Desafíos Visuales: Gestiona desafíos comunes de segmentación de video, como la oclusión y reaparición de objetos.

Para obtener más detalles sobre la arquitectura y las capacidades de SAM 2, explora el artículo de investigación de SAM 2.

¿Cómo puedo usar SAM 2 para la segmentación de video en tiempo real?

SAM 2 se puede utilizar para la segmentación de vídeo en tiempo real aprovechando su interfaz adaptable y sus capacidades de inferencia en tiempo real. Aquí hay un ejemplo básico:

Segmentar con Indicaciones

Utiliza prompts para segmentar objetos específicos en imágenes o vídeos.

from ultralytics import SAM

# Load a model
model = SAM("sam2_b.pt")

# Display model information (optional)
model.info()

# Segment with bounding box prompt
results = model("path/to/image.jpg", bboxes=[100, 100, 200, 200])

# Segment with point prompt
results = model("path/to/image.jpg", points=[150, 150], labels=[1])

Para un uso más completo, consulta la sección Cómo usar SAM 2.

¿Qué conjuntos de datos se utilizan para entrenar SAM 2 y cómo mejoran su rendimiento?

SAM 2 se entrena con el conjunto de datos SA-V, uno de los conjuntos de datos de segmentación de vídeo más grandes y diversos disponibles. El conjunto de datos SA-V incluye:

  • Más de 51.000 vídeos: Capturados en 47 países, proporcionando una amplia gama de escenarios del mundo real.
  • Más de 600.000 anotaciones de máscara: Anotaciones detalladas de máscaras espacio-temporales, denominadas "masklets", que cubren objetos y partes completas.
  • Escala del conjunto de datos: Cuenta con 4,5 veces más vídeos y 53 veces más anotaciones que los conjuntos de datos más grandes anteriores, lo que ofrece una diversidad y complejidad sin precedentes.

Este extenso conjunto de datos permite a SAM 2 alcanzar un rendimiento superior en los principales bancos de pruebas de segmentación de vídeo y mejora sus capacidades de generalización zero-shot. Para más información, consulta la sección Conjunto de datos SA-V.

¿Cómo maneja SAM 2 las oclusiones y reapariciones de objetos en la segmentación de video?

SAM 2 incluye un mecanismo de memoria sofisticado para gestionar las dependencias temporales y las oclusiones en los datos de vídeo. El mecanismo de memoria consiste en:

  • Codificador de Memoria y Banco de Memoria: Almacena características de fotogramas anteriores.
  • Módulo de Atención de Memoria: Utiliza la información almacenada para mantener un seguimiento consistente de los objetos a lo largo del tiempo.
  • Cabezal de oclusión: Maneja específicamente los escenarios en los que los objetos no son visibles, prediciendo la probabilidad de que un objeto esté ocluido.

Este mecanismo asegura la continuidad incluso cuando los objetos están temporalmente ocultos o entran y salen de la escena. Para más detalles, consulte la sección de Mecanismo de Memoria y Manejo de Oclusión.

¿Cómo se compara SAM 2 con otros modelos de segmentación como YOLO11?

Los modelos SAM 2, como SAM2-t y SAM2-b de Meta, ofrecen potentes capacidades de segmentación zero-shot, pero son significativamente más grandes y lentos en comparación con los modelos YOLO11. Por ejemplo, YOLO11n-seg es aproximadamente 13 veces más pequeño y más de 860 veces más rápido que SAM2-b. Si bien SAM 2 destaca en escenarios de segmentación versátiles, basados en prompts y zero-shot, YOLO11 está optimizado para la velocidad, la eficiencia y las aplicaciones en tiempo real, lo que lo hace más adecuado para la implementación en entornos con recursos limitados.



📅 Creado hace 1 año ✏️ Actualizado hace 4 días

Comentarios