CLIP
CLIP є двовежовою моделлю, яка оцінює зображення відносно текстових запитів замість фіксованого набору міток. LibreYOLO підтримує її для класифікації без прикладів та ембедингів зображень/тексту без етапу навчання.
- Задачі
- classify, embed
- Розміри
- Встановлення
pip install libreyolo- Рівень підтримки
- Суміжний рівень, починаючи з v. Окремий інтерфейс продукту з власною фабрикою та контрактом.
- Ліцензії
- Код: MIT, ваги: MIT. Комерційне використання
Встановлення
CLIP потребує власного набору додаткових залежностей, який установлює пакети для включеного токенізатора BPE, щоб точно відтворювати ідентифікатори токенів.
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 використовує 1,000 назв# класів 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 завантажується з уже заданими
1,000 назвами класів ImageNet-1k.
З task="embed" передбачення повертає один L2-нормалізований вектор
зображення на вхід замість імовірностей класів, а embed_text() повертає
нормалізовані рядки тексту в тому самому векторному просторі, тому звичайний
скалярний добуток між ними є косинусною подібністю. iou не впливає на
жодне завдання; етапу NMS немає. Типи джерел, потокове передбачення та обробку
результатів описано в розділі передбачення.
Валідація
val() читає назви папок класів у поділі train/ ImageFolder, викликає з
ними set_classes(), а потім вимірює правильність top-1 і top-5 без
прикладів. Правильність залежить від того, як назви класів читаються як
запити, а не від оновлення ваг, оскільки навчання не виконується. Валідація
охоплює лише task="classify"; task="embed" не має валідатора датасету.
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-cls.pt") # data є коренем ImageFolder із поділом train/; назви папок стають# запитами класів без прикладів для цього запуску.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" трасує лише вежу зображення.
Для обох потрібен opset ONNX 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(), тому вбудовуються типові 1,000# класів 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.