CLIP

CLIP — двухбашенная модель, которая оценивает изображение по текстовым запросам, а не по фиксированному набору меток. LibreYOLO поддерживает её для zero-shot классификации и эмбеддингов изображений и текста, без этапа обучения.

Задачи
classify, embed
Размеры
Установка
pip install libreyolo
Уровень поддержки
Смежный уровень, начиная с v. Отдельная часть продукта со своей фабрикой и контрактом.
Исходный проект
CLIP / OpenCLIP от OpenAI; LAION / ML Foundations, MIT. Статья, исходный код
Лицензии
Код: MIT, веса: MIT. Коммерческое использование

Установка

CLIP требует собственного extra, который подтягивает пакеты, нужные его встроенному BPE-токенизатору, чтобы воспроизводить точные id токенов.

bash
pip install "libreyolo[clip]"

Предсказание

Веса скачиваются с Hugging Face при первом запуске и кэшируются локально.

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

Python
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"])
CLI
libreyolo val model=LibreCLIPb32-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(), и разрешение на момент экспорта запекаются в финальный линейный слой, поэтому экспортированный ONNX- или TensorRT-граф — обычный классификатор изображений [B, K] без текстовой башни и без токенизатора; после смены классов или размера экспортируйте заново. Экспорт с task="embed" трассирует только башню изображений. Обоим нужен ONNX opset 14 или выше, который экспортёр ставит по умолчанию.

Python
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() и разрешение входа запекаются# в граф. После смены любого из двух экспортируйте заново.
CLI
# Здесь нет вызова set_classes(), поэтому запекаются 1000 классов# ImageNet, с которыми модель загружается по умолчанию.libreyolo export model=LibreCLIPb32-cls.pt format=onnx
Экспорт эмбеддингов
from 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.ptmit
LibreCLIPb16-cls.ptmit

Все перечисленные выше файлы уже доступны в организации 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.

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