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.

bash
pip install "libreyolo[siglip2]"

Predykcja

Przy pierwszym użyciu wagi są pobierane z Hugging Face i zapisywane w lokalnej pamięci podręcznej.

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
# 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=True
Wieloetykietowa ocena sigmoid
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) # 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]))
Embedding obrazu i tekstu
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.

Python
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"])
CLI
libreyolo val model=LibreSigLIP2b16-cls.pt data=imagenette160

Eksport

ZadanieONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
classifyclassify to ONNX: obsługiwaneclassify to TorchScript: obsługiwaneclassify to ExecuTorch: obsługiwaneclassify to TensorRT: obsługiwaneclassify to OpenVINO: obsługiwaneclassify to Paddle: brak obsługiclassify to MNN: brak obsługiclassify to RKNN: brak obsługiclassify to ncnn: brak obsługiclassify to TFLite: obsługiwaneclassify to CoreML: brak obsługiclassify to Core AI: obsługiwane
embedembed to ONNX: obsługiwaneembed to TorchScript: obsługiwaneembed to ExecuTorch: obsługiwaneembed to TensorRT: obsługiwaneembed to OpenVINO: obsługiwaneembed to Paddle: brak obsługiembed to MNN: brak obsługiembed to RKNN: brak obsługiembed to ncnn: brak obsługiembed to TFLite: obsługiwaneembed to CoreML: brak obsługiembed 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.

Python
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.
CLI
# 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=onnx
Eksport embeddingów
from 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.

PlikWejście (px)Licencja wag
classify
LibreSigLIP2b16-cls.ptapache-2.0
LibreSigLIP2so400m-cls.ptapache-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.

Zweryfikowano z LibreYOLO v1.5.0. Tabele obsługi, checkpointy i wyniki benchmarków na tej stronie są generowane na podstawie wydanej biblioteki i opublikowanych wag, a nie wpisywane ręcznie.