CLIP
CLIP — двухбашенная модель, которая оценивает изображение по текстовым запросам, а не по фиксированному набору меток. LibreYOLO поддерживает её для zero-shot классификации и эмбеддингов изображений и текста, без этапа обучения.
- Задачи
- classify, embed
- Размеры
- Установка
pip install libreyolo- Уровень поддержки
- Смежный уровень, начиная с v. Отдельная часть продукта со своей фабрикой и контрактом.
- Исходный проект
- CLIP / OpenCLIP от OpenAI; LAION / ML Foundations, MIT. Статья, исходный код
- Лицензии
- Код: MIT, веса: MIT. Коммерческое использование
Установка
CLIP требует собственного extra, который подтягивает пакеты, нужные его встроенному BPE-токенизатору, чтобы воспроизводить точные id токенов.
pip install "libreyolo[clip]"Предсказание
Веса скачиваются с Hugging Face при первом запуске и кэшируются локально.
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreCLIPb32-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=LibreCLIPb32-cls.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreCLIPb32-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] кэширует как голову классификатора, поэтому она не пересчитывается для каждого изображения. Вызовите его снова, чтобы сменить классы в любой момент. Без такого вызова LibreCLIP загружается с уже заданными 1000 именами классов ImageNet-1k.
С task="embed" предсказание возвращает по одному L2-нормированному вектору изображения на каждый вход вместо вероятностей классов, а embed_text() возвращает нормированные строки текста в том же векторном пространстве, поэтому обычное скалярное произведение между ними — косинусная близость. iou не влияет ни на одну из этих задач; шага NMS здесь нет. Про источники, стриминг и обработку результатов см. предсказание.
Валидация
val() читает имена папок классов в сплите train/ формата ImageFolder, вызывает с ними set_classes(), а затем измеряет zero-shot точность top-1 и top-5. Точность зависит от того, как имена классов читаются в роли запросов, а не от какого-либо обновления весов, поскольку обучать здесь нечего. Валидация покрывает только task="classify"; у task="embed" валидатора датасета нет.
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-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=LibreCLIPb32-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(), и разрешение на момент экспорта запекаются в финальный линейный слой, поэтому экспортированный ONNX- или TensorRT-граф — обычный классификатор изображений [B, K] без текстовой башни и без токенизатора; после смены классов или размера экспортируйте заново. Экспорт с task="embed" трассирует только башню изображений. Обоим нужен ONNX opset 14 или выше, который экспортёр ставит по умолчанию.
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])model.export(format="onnx") # Текущие метки из set_classes() и разрешение входа запекаются# в граф. После смены любого из двух экспортируйте заново.# Здесь нет вызова set_classes(), поэтому запекаются 1000 классов# ImageNet, с которыми модель загружается по умолчанию.libreyolo export model=LibreCLIPb32-cls.pt format=onnxfrom libreyolo import LibreYOLO # task="embed" трассирует только башню изображений; классы не нужны.model = LibreYOLO("LibreCLIPb32-cls.pt", task="embed")model.export(format="onnx")Чекпойнты
Все опубликованные файлы весов этого семейства. Оба сконвертированы из чекпойнтов OpenCLIP, обученных на LAION-2B (ViT-B-32 и ViT-B-16), а не из какого-либо запуска обучения на COCO.
| Файл | Вход (пикс.) | Лицензия весов |
|---|---|---|
| classify | ||
| LibreCLIPb32-cls.pt | mit | |
| LibreCLIPb16-cls.pt | mit | |
Все перечисленные выше файлы уже доступны в организации LibreYOLO и скачиваются при первом использовании.
У обучающих данных LAION-2B есть задокументированная история присутствия материалов CSAM (Stanford Internet Observatory, декабрь 2023). Позже LAION выпустил Re-LAION — очищенное переиздание; если вы размещаете эти веса у себя и раздаёте дальше, отдавайте предпочтение чекпойнтам на основе Re-LAION, где они доступны.
Лицензирование
Проверяйте лицензию в репозитории конкретных весов на Hugging Face. Она указана для каждого чекпойнта в организации LibreYOLO и может различаться даже внутри одного семейства. Этот репозиторий считается авторитетным источником, а сводка ниже описывает условия на момент последней проверки страницы.
Это описание соответствующих лицензий, а не юридическая консультация. Если ответ важен для коммерческого использования, прочитайте лицензии самостоятельно и проконсультируйтесь с юристом.
- Оригинальная работа
- CLIP / OpenCLIP, OpenAI; LAION / ML Foundations
- Лицензия исходного проекта
- MIT
- Исходный код проекта
- github.com/mlfoundations/open_clip
- Код LibreYOLO
- MIT
- Веса
- MIT, повторно опубликованы на huggingface.co/LibreYOLO
- Толкование
- MIT is a permissive license, so these weights can be used in commercial and closed-source products. It asks you to keep the license text and copyright notice with any copy you redistribute, and it places no obligation on your own application code. LibreCLIP's tokenizer is vendored from the OpenAI CLIP / OpenCLIP byte-pair-encoding tokenizer (also MIT); its image and text towers are a clean-room re-implementation of the standard CLIP architecture, built without open_clip as a runtime dependency. The shipped checkpoints (b32, b16) are converted from OpenCLIP's LAION-2B-trained weights, which OpenCLIP publishes as MIT-redistributable. Training is not offered for this family: LibreCLIP is zero-shot, and set_classes() replaces the fine-tuning step a trained classifier would otherwise need.
Цитирование
@software{ilharco_gabriel_2021_5143773,
author = {Ilharco, Gabriel and
Wortsman, Mitchell and
Wightman, Ross and
Gordon, Cade and
Carlini, Nicholas and
Taori, Rohan and
Dave, Achal and
Shankar, Vaishaal and
Namkoong, Hongseok and
Miller, John and
Hajishirzi, Hannaneh and
Farhadi, Ali and
Schmidt, Ludwig},
title = {OpenCLIP},
month = jul,
year = 2021,
note = {If you use this software, please cite it as below.},
publisher = {Zenodo},
version = {0.1},
doi = {10.5281/zenodo.5143773},
url = {https://doi.org/10.5281/zenodo.5143773}
}Скопировано из блока цитирования авторов на странице github.com/mlfoundations/open_clip#citing.