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, используемый его мультиязычным токенизатором.

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 использует 1000 имён# классов ImageNet, с которыми модель загружается по умолчанию.libreyolo predict model=LibreSigLIP2b16-cls.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
Оценка сигмоидой с несколькими метками
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 загружается с уже заданными 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" валидатора датасета нет.

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(), и разрешение на момент экспорта запекаются в финальный линейный слой с обученными scale и bias, поэтому экспортированный граф — обычный классификатор изображений [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(), поэтому запекаются 1000 классов# 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. Таблицы поддержки, чекпойнты и результаты бенчмарков на этой странице сгенерированы из выпущенной библиотеки и опубликованных весов, а не написаны вручную.