CLIP
CLIP to model z dwiema wieżami, który ocenia obraz względem promptów tekstowych zamiast stałego zestawu etykiet. LibreYOLO obsługuje go w klasyfikacji zero-shot oraz do tworzenia embeddingów obrazu i tekstu, bez etapu trenowania.
- Zadania
- classify, embed
- Rozmiary
- Instalacja
pip install libreyolo- Poziom obsługi
- Poziom siostrzany, od wersji v. Osobna część produktu z własną fabryką i kontraktem.
- Projekt źródłowy
- CLIP / OpenCLIP, autorzy: OpenAI; LAION / ML Foundations, licencja: MIT. Publikacja, kod źródłowy
- Licencje
- Kod: MIT, wagi: MIT. Użycie komercyjne
Instalacja
CLIP wymaga własnego dodatku, który instaluje pakiety używane przez dołączony tokenizator BPE do dokładnego odtworzenia identyfikatorów tokenów.
pip install "libreyolo[clip]"Predykcja
Przy pierwszym użyciu wagi są pobierane z Hugging Face i zapisywane lokalnie w pamięci podręcznej.
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))# Bez wywołania set_classes() predykcja CLI używa 1000 nazw klas# ImageNet, które model wczytuje domyślnie.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") # Oba są znormalizowane normą L2, więc zwykły iloczyn skalarny jest podobieństwem cosinusowym.similarity = (image_embed @ text_embed.T).item()set_classes() to podstawowa operacja, dzięki której jest to klasyfikator
z otwartym słownikiem. Renderuje każdą etykietę we wszystkich szablonach
promptów, koduje i uśrednia wyniki, a następnie zapisuje powstałą macierz
[K, D] w pamięci podręcznej jako głowicę klasyfikatora, dzięki czemu nie jest
ona obliczana ponownie dla każdego obrazu. Metodę można wywołać ponownie, aby
w dowolnej chwili zmienić klasy. Bez tego wywołania LibreCLIP ma już ustawione
1000 nazw klas ImageNet-1k.
Przy task="embed" predykcja zwraca po jednym znormalizowanym normą L2 wektorze
obrazu dla każdego wejścia zamiast prawdopodobieństw klas, a embed_text()
zwraca znormalizowane wiersze tekstu w tej samej przestrzeni wektorowej. Zwykły
iloczyn skalarny między nimi jest więc podobieństwem cosinusowym. Argument iou
nie ma wpływu na żadne z tych zadań, ponieważ nie występuje etap NMS. Zobacz
stronę predykcji, aby poznać źródła, streaming i obsługę
wyników.
Walidacja
Metoda val() odczytuje nazwy folderów klas z podziału train/ ImageFolder,
wywołuje z nimi set_classes(), a następnie mierzy accuracy top-1 i top-5
w trybie zero-shot. Accuracy zależy od tego, jak nazwy klas sprawdzają się jako
prompty, a nie od aktualizacji wag, ponieważ model nie jest trenowany. Walidacja
obejmuje wyłącznie task="classify". Dla task="embed" nie ma walidatora
zbioru danych.
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-cls.pt") # data to katalog główny ImageFolder z podziałem train/; nazwy jego# folderów stają się promptami klas zero-shot dla tego uruchomienia.metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])libreyolo val model=LibreCLIPb32-cls.pt data=imagenette160Eksport
| Zadanie | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| classify | classify to ONNX: obsługiwane | classify to TorchScript: obsługiwane | classify to ExecuTorch: obsługiwane | classify to TensorRT: obsługiwane | classify to OpenVINO: obsługiwane | classify to Paddle: brak obsługi | classify to MNN: brak obsługi | classify to RKNN: brak obsługi | classify to ncnn: brak obsługi | classify to TFLite: brak obsługi | classify to CoreML: brak obsługi | classify to Core AI: obsługiwane |
| embed | embed to ONNX: obsługiwane | embed to TorchScript: obsługiwane | embed to ExecuTorch: obsługiwane | embed to TensorRT: obsługiwane | embed to OpenVINO: obsługiwane | embed to Paddle: brak obsługi | embed to MNN: brak obsługi | embed to RKNN: brak obsługi | embed to ncnn: brak obsługi | embed to TFLite: brak obsługi | embed to CoreML: brak obsługi | embed to Core AI: brak obsługi |
Eksport zapisuje bieżący stan modelu w stałym grafie. W przypadku
task="classify" etykiety ustawione ostatnio przez set_classes() oraz
rozdzielczość w chwili eksportu zostają zapisane w końcowej warstwie liniowej.
Wyeksportowany graf ONNX lub TensorRT jest więc zwykłym klasyfikatorem obrazów
[B, K], bez wieży tekstu i bez tokenizatora. Po zmianie klas lub rozmiaru należy
wyeksportować model ponownie. Eksport task="embed" śledzi tylko wieżę obrazu.
Oba warianty wymagają ONNX opset 14 lub nowszego, który eksporter ustawia
domyślnie.
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])model.export(format="onnx") # Bieżące etykiety set_classes() i rozdzielczość wejścia zostają zapisane# w grafie. Po zmianie którejkolwiek z nich należy ponowić eksport.# Tutaj nie ma wywołania set_classes(), więc zapisywanych jest 1000# domyślnych klas ImageNet wczytanych przez model.libreyolo export model=LibreCLIPb32-cls.pt format=onnxfrom libreyolo import LibreYOLO # task="embed" śledzi tylko wieżę obrazu; klasy nie są potrzebne.model = LibreYOLO("LibreCLIPb32-cls.pt", task="embed")model.export(format="onnx")Checkpointy
Wszystkie opublikowane pliki wag dla tej rodziny. Oba przekonwertowano
z checkpointów OpenCLIP wytrenowanych na LAION-2B (ViT-B-32 i ViT-B-16),
a nie w ramach trenowania na COCO.
| Plik | Wejście (px) | Licencja wag |
|---|---|---|
| classify | ||
| LibreCLIPb32-cls.pt | mit | |
| LibreCLIPb16-cls.pt | mit | |
Każdy z powyższych plików jest obecnie dostępny w organizacji LibreYOLO i pobierany przy pierwszym użyciu.
W danych treningowych LAION-2B udokumentowano występowanie materiałów CSAM (Stanford Internet Observatory, grudzień 2023). Od tego czasu LAION opublikował Re-LAION, oczyszczone ponowne wydanie. Jeśli te wagi mają być dalej udostępniane, w miarę dostępności należy preferować checkpointy utworzone z Re-LAION.
Licencjonowanie
Sprawdź licencję w repozytorium konkretnych pobieranych wag na Hugging Face. Każdy checkpoint w organizacji LibreYOLO ma licencję, która nie zawsze jest taka sama w całej rodzinie. To repozytorium jest źródłem rozstrzygającym, a poniższe podsumowanie opisuje stan z chwili ostatniej weryfikacji tej strony.
To opis obowiązujących licencji, a nie porada prawna. Jeśli odpowiedź ma znaczenie komercyjne, przeczytaj licencje i zasięgnij własnej porady prawnej.
- Oryginalna praca
- CLIP / OpenCLIP, OpenAI; LAION / ML Foundations
- Licencja projektu źródłowego
- MIT
- Kod źródłowy projektu
- github.com/mlfoundations/open_clip
- Kod LibreYOLO
- MIT
- Wagi
- MIT, ponownie opublikowane w huggingface.co/LibreYOLO
- Interpretacja
- 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.
Cytowanie
@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}
}Skopiowano z bloku cytowania autorów w github.com/mlfoundations/open_clip#citing.