SigLIP2
O SigLIP2 é um modelo de torre dupla que pontua uma imagem contra prompts de texto com uma sigmoide independente por classe, em vez de um softmax compartilhado sobre um conjunto fixo de rótulos. O LibreYOLO oferece suporte a ele para classificação zero-shot e embedding de imagem e texto, sem nenhuma etapa de treinamento.
- Tarefas
- classify, embed
- Tamanhos
- Instalação
pip install libreyolo- Nível de suporte
- Nível irmão, desde a v. Uma superfície de produto separada, com sua própria fábrica e seu próprio contrato.
- Origem
- SigLIP 2 por Google DeepMind, Apache-2.0. Artigo, código-fonte
- Licenças
- Código MIT, pesos Apache-2.0. Uso comercial
Instalação
O SigLIP2 precisa do seu próprio extra, que instala o pacote SentencePiece usado pelo seu tokenizador multilíngue.
pip install "libreyolo[siglip2]"Predição
Os pesos são baixados do Hugging Face no primeiro uso e ficam em cache 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))# Sem uma chamada a set_classes(), o predict da CLI usa os 1.000# nomes de classe do ImageNet que o modelo carrega por padrão.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 independentes por classe: mais de uma, ou nenhuma,# pode pontuar alto ao mesmo tempo. Já o softmax (o padrão) normaliza# tudo em uma distribuição de rótulo único, igual ao 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 são normalizados por L2, então um simples produto escalar é a similaridade de cosseno.similarity = (image_embed @ text_embed.T).item()set_classes() é a primitiva que transforma isso em um classificador de vocabulário aberto: ela insere cada rótulo em todos os templates de prompt, codifica e faz a média dos resultados, e guarda em cache a matriz [K, D] resultante como cabeça do classificador, de modo que ela não é recalculada a cada imagem. Basta chamá-la de novo para mudar as classes a qualquer momento. Sem nenhuma chamada, o LibreSigLIP2 carrega já com os 1.000 nomes de classe do ImageNet-1k definidos.
O SigLIP pontua cada classe de forma independente: logit = scale * (image . text) + bias. Por padrão, esse conjunto de logits ainda passa por um softmax, o que dá uma distribuição de rótulo único que corresponde ao comportamento de top1/top5 do LibreCLIP. Passar multi_label=True para set_classes() (ou na construção) troca isso por probabilidades sigmoides independentes, de modo que mais de uma classe, ou nenhuma, pode pontuar alto na mesma imagem. O tokenizador é um modelo SentencePiece multilíngue (vocabulário do Gemma), então nomes de classe em idiomas diferentes do inglês funcionam da mesma forma.
Com task="embed", a predição devolve um vetor de imagem normalizado por L2 para cada entrada em vez de probabilidades de classe, e embed_text() devolve linhas de texto normalizadas no mesmo espaço vetorial, então um simples produto escalar entre eles é a similaridade de cosseno. iou não tem efeito em nenhuma das duas tarefas; não existe etapa de NMS. Veja predição para fontes, streaming e tratamento de resultados.
Validação
val() lê os nomes das pastas de classe sob o split train/ de um ImageFolder, chama set_classes() com eles e então mede a acurácia zero-shot top-1 e top-5 com pontuação por softmax. A acurácia depende de como os nomes das classes funcionam como prompts, não de qualquer atualização de pesos, já que não há nada para treinar. A validação cobre apenas task="classify"; task="embed" não tem validador de dataset.
from libreyolo import LibreYOLO model = LibreYOLO("LibreSigLIP2b16-cls.pt") # data é uma raiz ImageFolder com um split train/; os nomes das pastas# viram os prompts de classe zero-shot desta execução.metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])libreyolo val model=LibreSigLIP2b16-cls.pt data=imagenette160Exportação
| Tarefa | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| classify | classify to ONNX: compatível | classify to TorchScript: compatível | classify to ExecuTorch: compatível | classify to TensorRT: compatível | classify to OpenVINO: compatível | classify to Paddle: incompatível | classify to MNN: incompatível | classify to RKNN: incompatível | classify to ncnn: incompatível | classify to TFLite: compatível | classify to CoreML: incompatível | classify to Core AI: compatível |
| embed | embed to ONNX: compatível | embed to TorchScript: compatível | embed to ExecuTorch: compatível | embed to TensorRT: compatível | embed to OpenVINO: compatível | embed to Paddle: incompatível | embed to MNN: incompatível | embed to RKNN: incompatível | embed to ncnn: incompatível | embed to TFLite: compatível | embed to CoreML: incompatível | embed to Core AI: incompatível |
A exportação fixa o estado atual do modelo em um grafo estático. Para task="classify", os últimos rótulos definidos por set_classes() e a resolução no momento da exportação ficam fixados em uma camada linear final com o scale e o bias aprendidos, de modo que o grafo exportado é um classificador de imagens [B, K] comum, sem torre de texto e sem tokenizador; exporte de novo depois de mudar as classes ou o tamanho. A exportação no modo multi_label=True não está implementada; volte o valor para False antes. A exportação com task="embed" traça apenas a torre de imagem. Ambas precisam do opset 14 do ONNX ou superior, que o exportador define por padrão.
from libreyolo import LibreYOLO model = LibreYOLO("LibreSigLIP2b16-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])model.export(format="onnx") # Os rótulos atuais de set_classes() e a resolução de entrada ficam# fixados no grafo. Exporte de novo depois de mudar qualquer um dos# dois. multi_label precisa ser False (o padrão) na hora de exportar.# Aqui não há chamada a set_classes(), então isso fixa as 1.000# classes padrão do ImageNet com as quais o modelo carrega.libreyolo export model=LibreSigLIP2b16-cls.pt format=onnxfrom libreyolo import LibreYOLO # task="embed" traça apenas a torre de imagem; nenhuma classe é necessária.model = LibreYOLO("LibreSigLIP2b16-cls.pt", task="embed")model.export(format="onnx")Checkpoints
Todos os arquivos de pesos publicados desta família. Ambos são convertidos a partir dos checkpoints Apache-2.0 siglip2-base-patch16-256 e siglip2-so400m-patch14-384 do Google, não de nenhum treinamento em COCO.
| Arquivo | Entrada (px) | Licença dos pesos |
|---|---|---|
| classify | ||
| LibreSigLIP2b16-cls.pt | apache-2.0 | |
| LibreSigLIP2so400m-cls.pt | apache-2.0 | |
Todos os arquivos acima existem hoje na organização LibreYOLO e são baixados no primeiro uso.
Licenciamento
Confira a licença no repositório do Hugging Face correspondente aos pesos que você baixar. Cada checkpoint na organização LibreYOLO tem uma licença, e ela nem sempre é a mesma em toda a família. Esse repositório é a fonte oficial. O resumo abaixo descreve o que se aplicava na última verificação desta página.
Esta é uma descrição das licenças envolvidas, não uma orientação jurídica. Se a resposta tiver importância comercial, leia as licenças e procure sua própria assessoria.
- Trabalho original
- SigLIP 2, Google DeepMind
- Licença original
- Apache-2.0
- Código-fonte original
- github.com/huggingface/transformers
- Código do LibreYOLO
- MIT
- Pesos
- Apache-2.0, republicado em huggingface.co/LibreYOLO
- Interpretação
- 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ção
@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 do bloco de citação dos autores em huggingface.co/google/siglip2-base-patch16-256#bibtex-entry-and-citation-info.