SigLIP2
SigLIP2, це двобаштова модель, що оцінює зображення відносно текстових підказок незалежною sigmoid для кожного класу, а не спільною softmax для фіксованого набору міток. LibreYOLO підтримує її для zero-shot класифікації та ембедингів зображень і тексту без етапу навчання.
- Задачі
- classify, embed
- Розміри
- Встановлення
pip install libreyolo- Рівень підтримки
- Суміжний рівень, починаючи з v. Окремий інтерфейс продукту з власною фабрикою та контрактом.
- Ліцензії
- Код: MIT, ваги: Apache-2.0. Комерційне використання
Встановлення
SigLIP2 потребує власної додаткової залежності, яка встановлює пакет 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 predict використовує 1 000 назв# класів 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 завантажується з уже
заданими 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" немає валідатора датасету.
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(), і
роздільна здатність під час експорту вбудовуються в кінцевий лінійний шар
разом із навченими масштабом і зміщенням. Тому експортований граф є звичайним
класифікатором зображень [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(), тому вбудовуються стандартні 1 000# класів 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.