SigLIP2

SigLIP2 es un modelo de doble torre que puntúa una imagen frente a prompts de texto con una sigmoide independiente por clase, en lugar de un softmax compartido sobre un conjunto fijo de etiquetas. LibreYOLO lo soporta para clasificación zero-shot y embeddings de imagen y texto, sin ningún paso de entrenamiento.

Tareas
classify, embed
Tamaños
Instalación
pip install libreyolo
Nivel de compatibilidad
Nivel hermano, desde v. Una superficie de producto independiente con su propia factoría y su propio contrato.
Proyecto original
SigLIP 2 de Google DeepMind, Apache-2.0. Artículo, fuente
Licencias
Código MIT, pesos Apache-2.0. Uso comercial

Instalación

SigLIP2 necesita su propio extra, que instala el paquete SentencePiece que usa su tokenizador multilingüe.

bash
pip install "libreyolo[siglip2]"

Predicción

Los pesos se descargan de Hugging Face en el primer uso y quedan cacheados localmente.

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreSigLIP2b16-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])result = model(SAMPLE_IMAGE, save=True) print(model.names[result.probs.top1], float(result.probs.top1conf))
CLI
# Sin una llamada a set_classes(), predict desde la CLI usa los 1.000# nombres de clase de ImageNet que el modelo carga por defecto.libreyolo predict model=LibreSigLIP2b16-cls.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
Puntuación sigmoide multi-etiqueta
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreSigLIP2b16-cls.pt")model.set_classes(["a dog", "a cat", "outdoors"], multi_label=True)r = model(SAMPLE_IMAGE) # Probabilidades independientes por clase: más de una, o ninguna,# puede puntuar alto a la vez. El softmax (el valor por defecto) las# normaliza en una distribución de etiqueta única, igual que LibreCLIP.for i, name in model.names.items():    print(name, float(r.probs.data[i]))
Embeddings de imagen y texto
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreSigLIP2b16-cls.pt", task="embed")image_embed = model(SAMPLE_IMAGE).embeddings.datatext_embed = model.embed_text("a photo of a forklift") # Ambos están normalizados con L2, así que un simple producto escalar es la similitud coseno.similarity = (image_embed @ text_embed.T).item()

set_classes() es la primitiva que convierte esto en un clasificador de vocabulario abierto: inserta cada etiqueta en todas las plantillas de prompt, codifica y promedia los resultados, y cachea la matriz [K, D] resultante como cabeza del clasificador, de modo que no se recalcula en cada imagen. Vuelve a llamarla para cambiar las clases en cualquier momento. Si no la llamas, LibreSigLIP2 se carga con los 1.000 nombres de clase de ImageNet-1k ya asignados.

SigLIP puntúa cada clase de forma independiente: logit = scale * (image . text) + bias. Por defecto, ese conjunto de logits sigue pasando por un softmax, lo que da una distribución de etiqueta única que coincide con el comportamiento de top1/top5 de LibreCLIP. Pasar multi_label=True a set_classes() (o en la construcción) cambia a probabilidades sigmoides independientes, de modo que más de una clase, o ninguna, puede puntuar alto en la misma imagen. El tokenizador es un modelo SentencePiece multilingüe (vocabulario de Gemma), así que los nombres de clase en idiomas distintos del inglés funcionan igual.

Con task="embed", la predicción devuelve un vector de imagen normalizado con L2 por cada entrada en lugar de probabilidades de clase, y embed_text() devuelve filas de texto normalizadas en el mismo espacio vectorial, así que un simple producto escalar entre ambos es la similitud coseno. iou no tiene efecto en ninguna de las dos tareas; no hay paso de NMS. Consulta predicción para fuentes, streaming y manejo de resultados.

Validación

val() lee los nombres de las carpetas de clase del split train/ de un ImageFolder, llama a set_classes() con ellos y después mide la precisión zero-shot top-1 y top-5 con puntuación softmax. La precisión depende de cómo se lean los nombres de clase como prompts, no de ninguna actualización de pesos, ya que no hay nada que entrenar. La validación solo cubre task="classify"; task="embed" no tiene validador de dataset.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreSigLIP2b16-cls.pt") # data es una raíz ImageFolder con un split train/; sus nombres de# carpeta se convierten en los prompts de clase zero-shot de esta ejecución.metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])
CLI
libreyolo val model=LibreSigLIP2b16-cls.pt data=imagenette160

Exportación

TareaONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
classifyclassify to ONNX: compatibleclassify to TorchScript: compatibleclassify to ExecuTorch: compatibleclassify to TensorRT: compatibleclassify to OpenVINO: compatibleclassify to Paddle: no compatibleclassify to MNN: no compatibleclassify to RKNN: no compatibleclassify to ncnn: no compatibleclassify to TFLite: compatibleclassify to CoreML: no compatibleclassify to Core AI: compatible
embedembed to ONNX: compatibleembed to TorchScript: compatibleembed to ExecuTorch: compatibleembed to TensorRT: compatibleembed to OpenVINO: compatibleembed to Paddle: no compatibleembed to MNN: no compatibleembed to RKNN: no compatibleembed to ncnn: no compatibleembed to TFLite: compatibleembed to CoreML: no compatibleembed to Core AI: no compatible

La exportación fija el estado actual del modelo en un grafo estático. Para task="classify", las últimas etiquetas que asignó set_classes() y la resolución en el momento de exportar quedan fijadas en una capa lineal final con la escala y el bias aprendidos, de modo que el grafo exportado es un clasificador de imágenes [B, K] corriente, sin torre de texto y sin tokenizador; vuelve a exportar después de cambiar las clases o el tamaño. La exportación en modo multi_label=True no está implementada; vuelve a ponerlo en False primero. La exportación con task="embed" traza solo la torre de imagen. Ambas necesitan el opset 14 de ONNX o superior, que el exportador establece por defecto.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreSigLIP2b16-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])model.export(format="onnx") # Las etiquetas actuales de set_classes() y la resolución de entrada# quedan fijadas en el grafo. Vuelve a exportar si cambias cualquiera.# multi_label debe ser False (el valor por defecto) al exportar.
CLI
# Aquí no hay llamada a set_classes(), así que esto fija las 1.000# clases de ImageNet por defecto con las que se carga el modelo.libreyolo export model=LibreSigLIP2b16-cls.pt format=onnx
Exportación de embeddings
from libreyolo import LibreYOLO # task="embed" traza solo la torre de imagen; no hacen falta clases.model = LibreYOLO("LibreSigLIP2b16-cls.pt", task="embed")model.export(format="onnx")

Checkpoints

Todos los archivos de pesos publicados de esta familia. Ambos están convertidos a partir de los checkpoints siglip2-base-patch16-256 y siglip2-so400m-patch14-384 de Google, con licencia Apache-2.0, no de ningún entrenamiento con COCO.

ArchivoEntrada (px)Licencia de los pesos
classify
LibreSigLIP2b16-cls.ptapache-2.0
LibreSigLIP2so400m-cls.ptapache-2.0

Todos los archivos anteriores existen hoy en la organización de LibreYOLO y se descargan la primera vez que se usan.

Licencia

Comprueba la licencia en el repositorio de Hugging Face de los pesos concretos que descargues. Cada checkpoint de la organización de LibreYOLO incluye una, y no siempre es la misma en toda una familia. Ese repositorio es la fuente autorizada; el resumen siguiente describe qué se aplicaba cuando se verificó esta página por última vez.

Esta es una descripción de las licencias implicadas, no asesoramiento legal. Si la respuesta es importante a nivel comercial, lee las licencias y busca tu propio asesoramiento.

Trabajo original
SigLIP 2, Google DeepMind
Licencia del proyecto original
Apache-2.0
Fuente del proyecto original
github.com/huggingface/transformers
Código de LibreYOLO
MIT
Pesos
Apache-2.0, republicados en huggingface.co/LibreYOLO
Interpretación
Apache-2.0 is a permissive license, so these weights can be used in commercial and closed-source products. It asks you to keep its license text and attribution notices with any copy of the weights you redistribute, and it grants a patent license. It places no obligation on your own application code. LibreSigLIP2's image and text towers are a clean-room re-implementation structured to match Hugging Face Transformers' SigLIP reference implementation, built without transformers as a runtime dependency; the multilingual SentencePiece tokenizer (Gemma vocabulary) is shipped verbatim from the Apache-2.0 google/siglip2-* release. The shipped checkpoints (b16, so400m) are converted from Google's Apache-2.0 siglip2-base-patch16-256 and siglip2-so400m-patch14-384 weights, a metadata wrap with the learned parameters unchanged. Training is not offered for this family: LibreSigLIP2 is zero-shot, and set_classes() replaces the fine-tuning step a trained classifier would otherwise need.

Cita

@misc{tschannen2025siglip2multilingualvisionlanguage,
      title={SigLIP 2: Multilingual Vision-Language Encoders with Improved Semantic Understanding, Localization, and Dense Features}, 
      author={Michael Tschannen and Alexey Gritsenko and Xiao Wang and Muhammad Ferjad Naeem and Ibrahim Alabdulmohsin and Nikhil Parthasarathy and Talfan Evans and Lucas Beyer and Ye Xia and Basil Mustafa and Olivier Hénaff and Jeremiah Harmsen and Andreas Steiner and Xiaohua Zhai},
      year={2025},
      eprint={2502.14786},
      archivePrefix={arXiv},
      primaryClass={cs.CV},
      url={https://arxiv.org/abs/2502.14786}, 
}

Copiado del bloque de cita de los autores en huggingface.co/google/siglip2-base-patch16-256#bibtex-entry-and-citation-info.

Verificado con LibreYOLO v1.5.0. Las tablas de compatibilidad, los checkpoints y las cifras de rendimiento de esta página se generan a partir de la biblioteca publicada y los pesos publicados; no se escriben a mano.