SigLIP2

SigLIP2, це двобаштова модель, що оцінює зображення відносно текстових підказок незалежною sigmoid для кожного класу, а не спільною softmax для фіксованого набору міток. LibreYOLO підтримує її для zero-shot класифікації та ембедингів зображень і тексту без етапу навчання.

Задачі
classify, embed
Розміри
Встановлення
pip install libreyolo
Рівень підтримки
Суміжний рівень, починаючи з v. Окремий інтерфейс продукту з власною фабрикою та контрактом.
Першоджерело
SigLIP 2, автори: Google DeepMind, ліцензія Apache-2.0. Стаття, джерело
Ліцензії
Код: MIT, ваги: Apache-2.0. Комерційне використання

Встановлення

SigLIP2 потребує власної додаткової залежності, яка встановлює пакет SentencePiece для її багатомовного токенізатора.

bash
pip install "libreyolo[siglip2]"

Передбачення

Під час першого використання ваги завантажуються з Hugging Face і кешуються локально.

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
# Без виклику set_classes() команда CLI predict використовує 1 000 назв# класів ImageNet, які модель стандартно завантажує.libreyolo predict model=LibreSigLIP2b16-cls.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
Багатоміткове оцінювання 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) # Незалежні ймовірності для класів: одночасно високий бал можуть# мати кілька класів або жоден. Натомість Softmax (стандартний режим)# нормалізує їх у розподіл для однієї мітки, як у 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") # Обидва L2-нормалізовані, тому звичайний скалярний добуток є косинусною подібністю.similarity = (image_embed @ text_embed.T).item()

set_classes(), це основна операція, яка робить класифікатор відкритим: вона підставляє кожну мітку в усі шаблони підказок, кодує й усереднює результати та кешує отриману матрицю [K, D] як голову класифікатора, тому вона не обчислюється знову для кожного зображення. Викличте її ще раз, щоб будь-коли змінити класи. Без виклику LibreSigLIP2 завантажується з уже заданими 1 000 назвами класів ImageNet-1k.

SigLIP оцінює кожен клас незалежно: logit = scale * (image . text) + bias. Стандартно цей набір логітів усе одно проходить через softmax, утворюючи одномітковий розподіл, що відповідає поведінці top1 і top5 LibreCLIP. Передавання multi_label=True до set_classes() або конструктора натомість перемикає на незалежні ймовірності sigmoid, тому на одному зображенні високий бал можуть мати кілька класів або жоден. Токенізатор є багатомовною моделлю SentencePiece зі словником Gemma, тому назви класів іншими мовами працюють так само.

З task="embed" передбачення повертає один L2-нормалізований вектор зображення на кожен вхід замість імовірностей класів, а embed_text() повертає нормалізовані рядки тексту в тому самому векторному просторі, тому звичайний скалярний добуток між ними дорівнює косинусній подібності. iou не впливає на жодну задачу, оскільки етапу NMS немає. Джерела, потокову обробку й роботу з результатами описано в розділі передбачення.

Валідація

val() читає назви каталогів класів у поділі train/ ImageFolder, викликає з ними set_classes(), а потім вимірює точність zero-shot top-1 і top-5 з оцінюванням softmax. Точність залежить від того, як назви класів сприймаються як підказки, а не від оновлення ваг, оскільки навчання не відбувається. Валідація охоплює лише task="classify"; для task="embed" немає валідатора датасету.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreSigLIP2b16-cls.pt") # data, це корінь ImageFolder із поділом train/; назви його каталогів# стають підказками класів zero-shot для цього запуску.metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])
CLI
libreyolo val model=LibreSigLIP2b16-cls.pt data=imagenette160

Експорт

ЗадачаONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
classifyclassify to ONNX: підтримуєтьсяclassify to TorchScript: підтримуєтьсяclassify to ExecuTorch: підтримуєтьсяclassify to TensorRT: підтримуєтьсяclassify to OpenVINO: підтримуєтьсяclassify to Paddle: не підтримуєтьсяclassify to MNN: не підтримуєтьсяclassify to RKNN: не підтримуєтьсяclassify to ncnn: не підтримуєтьсяclassify to TFLite: підтримуєтьсяclassify to CoreML: не підтримуєтьсяclassify to Core AI: підтримується
embedembed to ONNX: підтримуєтьсяembed to TorchScript: підтримуєтьсяembed to ExecuTorch: підтримуєтьсяembed to TensorRT: підтримуєтьсяembed to OpenVINO: підтримуєтьсяembed to Paddle: не підтримуєтьсяembed to MNN: не підтримуєтьсяembed to RKNN: не підтримуєтьсяembed to ncnn: не підтримуєтьсяembed to TFLite: підтримуєтьсяembed to CoreML: не підтримуєтьсяembed to Core AI: не підтримується

Експорт вбудовує поточний стан моделі у фіксований граф. Для task="classify" останні мітки, задані через set_classes(), і роздільна здатність під час експорту вбудовуються в кінцевий лінійний шар разом із навченими масштабом і зміщенням. Тому експортований граф є звичайним класифікатором зображень [B, K] без текстової башти й токенізатора; після зміни класів або розміру експортуйте знову. Експорт у режимі multi_label=True не реалізовано, спочатку поверніть значення False. Експорт task="embed" трасує лише башту зображень. Обом варіантам потрібен ONNX opset 14 або новіший, який експортер задає стандартно.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreSigLIP2b16-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])model.export(format="onnx") # Поточні мітки set_classes() і роздільна здатність входу вбудовуються# в граф. Після зміни будь-чого з них виконайте експорт знову. Під час# експорту multi_label має бути False (стандартне значення).
CLI
# Тут немає виклику set_classes(), тому вбудовуються стандартні 1 000# класів ImageNet, які завантажує модель.libreyolo export model=LibreSigLIP2b16-cls.pt format=onnx
Експорт ембедингів
from libreyolo import LibreYOLO # task="embed" трасує лише башту зображень; класи не потрібні.model = LibreYOLO("LibreSigLIP2b16-cls.pt", task="embed")model.export(format="onnx")

Контрольні точки

Усі опубліковані файли ваг для цього сімейства. Обидва перетворено з контрольних точок Google siglip2-base-patch16-256 і siglip2-so400m-patch14-384 за ліцензією Apache-2.0, а не з будь-якого навчання на COCO.

ФайлВхід (пікс.)Ліцензія ваг
classify
LibreSigLIP2b16-cls.ptapache-2.0
LibreSigLIP2so400m-cls.ptapache-2.0

Кожен наведений вище файл уже доступний у організації LibreYOLO і завантажується під час першого використання.

Ліцензування

Перевіряйте ліцензію в репозиторії Hugging Face конкретних ваг, які завантажуєте. Кожна контрольна точка в організації LibreYOLO має ліцензію, і вона не завжди однакова для всього сімейства. Цей репозиторій є авторитетним джерелом, а наведене нижче резюме описує умови на момент останньої перевірки сторінки.

Це опис відповідних ліцензій, а не юридична консультація. Якщо відповідь має комерційне значення, самостійно прочитайте ліцензії та зверніться по юридичну консультацію.

Оригінальна робота
SigLIP 2, Google DeepMind
Ліцензія першоджерела
Apache-2.0
Джерело першоджерела
github.com/huggingface/transformers
Код LibreYOLO
MIT
Ваги
Apache-2.0, повторно опубліковано на huggingface.co/LibreYOLO
Тлумачення
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.

Цитування

@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}, 
}

Скопійовано з блоку цитування авторів на сторінці huggingface.co/google/siglip2-base-patch16-256#bibtex-entry-and-citation-info.

Перевірено з LibreYOLO v1.5.0. Таблиці підтримки, контрольні точки й результати бенчмарків на цій сторінці згенеровано з випущеної бібліотеки та опублікованих ваг, а не написано вручну.