SigLIP2
SigLIP2 to model dwuwieżowy, który ocenia obraz względem promptów tekstowych za pomocą niezależnej funkcji sigmoid dla każdej klasy zamiast wspólnego softmax dla stałego zbioru etykiet. LibreYOLO obsługuje go do klasyfikacji zero-shot oraz embeddingów obrazu i tekstu, bez etapu trenowania.
- Zadania
- classify, embed
- Rozmiary
- Instalacja
pip install libreyolo- Poziom obsługi
- Poziom siostrzany, od wersji v. Osobna część produktu z własną fabryką i kontraktem.
- Projekt źródłowy
- SigLIP 2, autorzy: Google DeepMind, licencja: Apache-2.0. Publikacja, kod źródłowy
- Licencje
- Kod: MIT, wagi: Apache-2.0. Użycie komercyjne
Instalacja
SigLIP2 wymaga własnego dodatku, który instaluje pakiet SentencePiece używany przez jego wielojęzyczny tokenizer.
pip install "libreyolo[siglip2]"Predykcja
Przy pierwszym użyciu wagi są pobierane z Hugging Face i zapisywane w lokalnej pamięci podręcznej.
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))# Bez wywołania set_classes() predykcja CLI używa 1000 nazw klas# ImageNet, które model wczytuje domyślnie.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) # Niezależne prawdopodobieństwa każdej klasy: więcej niż jedna klasa albo żadna# może jednocześnie uzyskać wysoki wynik. Softmax (domyślny) normalizuje je# do rozkładu jednoetykietowego, zgodnie z zachowaniem 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") # Oba są znormalizowane metodą L2, więc zwykły iloczyn skalarny to podobieństwo cosinusowe.similarity = (image_embed @ text_embed.T).item()set_classes() jest mechanizmem tworzącym z tego modelu klasyfikator z otwartym
słownikiem. Umieszcza każdą etykietę we wszystkich szablonach promptów, koduje i
uśrednia wyniki oraz zapisuje powstałą macierz [K, D] w pamięci podręcznej jako
głowicę klasyfikatora, dzięki czemu nie jest ona ponownie obliczana dla każdego
obrazu. Ponowne wywołanie pozwala w każdej chwili zmienić klasy. Bez wywołania
LibreSigLIP2 ma już ustawione 1000 nazw klas ImageNet-1k.
SigLIP ocenia każdą klasę niezależnie: logit = scale * (image . text) + bias.
Domyślnie ten zbiór logitów nadal przechodzi przez softmax, co daje rozkład
jednoetykietowy zgodny z zachowaniem top1/top5 w LibreCLIP. Przekazanie
multi_label=True do set_classes() (lub podczas tworzenia) przełącza na
niezależne prawdopodobieństwa sigmoid. Na tym samym obrazie wysoki wynik może
uzyskać więcej niż jedna klasa albo żadna. Tokenizer jest wielojęzycznym modelem
SentencePiece ze słownikiem Gemma, dlatego nazwy klas w językach innych niż
angielski działają tak samo.
Przy task="embed" predykcja zwraca jeden znormalizowany metodą L2 wektor obrazu
na wejście zamiast prawdopodobieństw klas, a embed_text() zwraca
znormalizowane wiersze tekstu w tej samej przestrzeni wektorowej. Zwykły iloczyn
skalarny jest więc ich podobieństwem cosinusowym. iou nie ma wpływu na żadne z
zadań, ponieważ nie ma etapu NMS. Więcej informacji o źródłach, streamingu i
obsłudze wyników zawiera strona predykcji.
Walidacja
val() odczytuje nazwy folderów klas z podziału train/ ImageFolder, wywołuje
dla nich set_classes(), a następnie mierzy dokładność zero-shot top-1 i top-5
z oceną softmax. Dokładność zależy od brzmienia nazw klas jako promptów, a nie
od aktualizacji wag, ponieważ nie ma niczego do trenowania. Walidacja obejmuje
wyłącznie task="classify". task="embed" nie ma walidatora zbioru danych.
from libreyolo import LibreYOLO model = LibreYOLO("LibreSigLIP2b16-cls.pt") # data to katalog główny ImageFolder z podziałem train/. Nazwy jego folderów# stają się promptami klas zero-shot w tym przebiegu.metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])libreyolo val model=LibreSigLIP2b16-cls.pt data=imagenette160Eksport
| Zadanie | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| classify | classify to ONNX: obsługiwane | classify to TorchScript: obsługiwane | classify to ExecuTorch: obsługiwane | classify to TensorRT: obsługiwane | classify to OpenVINO: obsługiwane | classify to Paddle: brak obsługi | classify to MNN: brak obsługi | classify to RKNN: brak obsługi | classify to ncnn: brak obsługi | classify to TFLite: obsługiwane | classify to CoreML: brak obsługi | classify to Core AI: obsługiwane |
| embed | embed to ONNX: obsługiwane | embed to TorchScript: obsługiwane | embed to ExecuTorch: obsługiwane | embed to TensorRT: obsługiwane | embed to OpenVINO: obsługiwane | embed to Paddle: brak obsługi | embed to MNN: brak obsługi | embed to RKNN: brak obsługi | embed to ncnn: brak obsługi | embed to TFLite: obsługiwane | embed to CoreML: brak obsługi | embed to Core AI: brak obsługi |
Eksport zapisuje bieżący stan modelu w stałym grafie. Dla task="classify"
etykiety ustawione ostatnio przez set_classes() i rozdzielczość w chwili
eksportu są wbudowane w końcową warstwę liniową z wyuczoną skalą i obciążeniem.
Wyeksportowany graf jest zwykłym klasyfikatorem obrazów [B, K] bez wieży
tekstowej ani tokenizera. Po zmianie klas lub rozmiaru trzeba wyeksportować go
ponownie. Eksport w trybie multi_label=True nie jest zaimplementowany. Najpierw
należy przywrócić False. Eksport task="embed" śledzi wyłącznie wieżę obrazu.
Oba wymagają opset ONNX 14 lub nowszego, który eksporter ustawia domyślnie.
from libreyolo import LibreYOLO model = LibreYOLO("LibreSigLIP2b16-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])model.export(format="onnx") # Bieżące etykiety set_classes() i rozdzielczość wejściowa są wbudowane# w graf. Po zmianie któregokolwiek elementu wykonaj ponowny eksport. multi_label# musi mieć wartość False (domyślną) podczas eksportu.# Nie wywołano set_classes(), dlatego w grafie zostanie zapisanych 1000# domyślnych klas ImageNet wczytywanych przez model.libreyolo export model=LibreSigLIP2b16-cls.pt format=onnxfrom libreyolo import LibreYOLO # task="embed" śledzi tylko wieżę obrazu. Klasy nie są potrzebne.model = LibreYOLO("LibreSigLIP2b16-cls.pt", task="embed")model.export(format="onnx")Checkpointy
Wszystkie opublikowane pliki wag dla tej rodziny. Oba przekonwertowano z
checkpointów Google na licencji Apache-2.0 siglip2-base-patch16-256 i
siglip2-so400m-patch14-384, a nie z przebiegu trenowania COCO.
| Plik | Wejście (px) | Licencja wag |
|---|---|---|
| classify | ||
| LibreSigLIP2b16-cls.pt | apache-2.0 | |
| LibreSigLIP2so400m-cls.pt | apache-2.0 | |
Każdy z powyższych plików jest obecnie dostępny w organizacji LibreYOLO i pobierany przy pierwszym użyciu.
Licencja
Sprawdź licencję w repozytorium konkretnych pobieranych wag na Hugging Face. Każdy checkpoint w organizacji LibreYOLO ma licencję, która nie zawsze jest taka sama w całej rodzinie. To repozytorium jest źródłem rozstrzygającym, a poniższe podsumowanie opisuje stan z chwili ostatniej weryfikacji tej strony.
To opis obowiązujących licencji, a nie porada prawna. Jeśli odpowiedź ma znaczenie komercyjne, przeczytaj licencje i zasięgnij własnej porady prawnej.
- Oryginalna praca
- SigLIP 2, Google DeepMind
- Licencja projektu źródłowego
- Apache-2.0
- Kod źródłowy projektu
- github.com/huggingface/transformers
- Kod LibreYOLO
- MIT
- Wagi
- Apache-2.0, ponownie opublikowane w huggingface.co/LibreYOLO
- Interpretacja
- 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.
Cytowanie
@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},
}Skopiowano z bloku cytowania autorów w huggingface.co/google/siglip2-base-patch16-256#bibtex-entry-and-citation-info.