SigLIP2
SigLIP2 — двухбашенная модель, которая оценивает изображение по текстовым запросам независимой сигмоидой на каждый класс, а не общим softmax по фиксированному набору меток. LibreYOLO поддерживает её для zero-shot классификации и эмбеддингов изображений и текста, без этапа обучения.
- Задачи
- classify, embed
- Размеры
- Установка
pip install libreyolo- Уровень поддержки
- Смежный уровень, начиная с v. Отдельная часть продукта со своей фабрикой и контрактом.
- Исходный проект
- SigLIP 2 от Google DeepMind, Apache-2.0. Статья, исходный код
- Лицензии
- Код: MIT, веса: Apache-2.0. Коммерческое использование
Установка
SigLIP2 требует собственного extra, который подтягивает пакет SentencePiece, используемый его мультиязычным токенизатором.
pip install "libreyolo[siglip2]"Предсказание
Веса скачиваются с Hugging Face при первом запуске и кэшируются локально.
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))# Без вызова set_classes() предсказание из CLI использует 1000 имён# классов ImageNet, с которыми модель загружается по умолчанию.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) # Независимые вероятности по каждому классу: высоко сразу могут# оценить несколько классов или ни одного. 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 загружается с уже заданными 1000 именами классов ImageNet-1k.
SigLIP оценивает каждый класс независимо: logit = scale * (image . text) + bias. По умолчанию этот набор логитов всё же проходит через softmax, давая распределение с одной меткой, которое повторяет поведение top1/top5 у LibreCLIP. Передача multi_label=True в set_classes() (или при создании модели) переключает на независимые сигмоидные вероятности, поэтому на одном и том же изображении высоко могут оценить сразу несколько классов или ни одного. Токенизатор — мультиязычная модель 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" валидатора датасета нет.
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"])libreyolo val model=LibreSigLIP2b16-cls.pt data=imagenette160Экспорт
| Задача | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| classify | classify 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: поддерживается |
| embed | embed 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(), и разрешение на момент экспорта запекаются в финальный линейный слой с обученными scale и bias, поэтому экспортированный граф — обычный классификатор изображений [B, K] без текстовой башни и без токенизатора; после смены классов или размера экспортируйте заново. Экспорт в режиме multi_label=True не реализован; сначала верните значение False. Экспорт с task="embed" трассирует только башню изображений. Обоим нужен ONNX opset 14 или выше, который экспортёр ставит по умолчанию.
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 (по умолчанию).# Здесь нет вызова set_classes(), поэтому запекаются 1000 классов# ImageNet, с которыми модель загружается по умолчанию.libreyolo export model=LibreSigLIP2b16-cls.pt format=onnxfrom 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.pt | apache-2.0 | |
| LibreSigLIP2so400m-cls.pt | apache-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.