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.
- 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.
pip install "libreyolo[siglip2]"Predicción
Los pesos se descargan de Hugging Face en el primer uso y quedan cacheados localmente.
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))# 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=Truefrom 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]))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.
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"])libreyolo val model=LibreSigLIP2b16-cls.pt data=imagenette160Exportación
| Tarea | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| classify | classify to ONNX: compatible | classify to TorchScript: compatible | classify to ExecuTorch: compatible | classify to TensorRT: compatible | classify to OpenVINO: compatible | classify to Paddle: no compatible | classify to MNN: no compatible | classify to RKNN: no compatible | classify to ncnn: no compatible | classify to TFLite: compatible | classify to CoreML: no compatible | classify to Core AI: compatible |
| embed | embed to ONNX: compatible | embed to TorchScript: compatible | embed to ExecuTorch: compatible | embed to TensorRT: compatible | embed to OpenVINO: compatible | embed to Paddle: no compatible | embed to MNN: no compatible | embed to RKNN: no compatible | embed to ncnn: no compatible | embed to TFLite: compatible | embed to CoreML: no compatible | embed 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.
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.# 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=onnxfrom 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.
| Archivo | Entrada (px) | Licencia de los pesos |
|---|---|---|
| classify | ||
| LibreSigLIP2b16-cls.pt | apache-2.0 | |
| LibreSigLIP2so400m-cls.pt | apache-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.