CLIP
CLIP è un modello a due torri che confronta un'immagine con dei prompt testuali invece che con un insieme fisso di etichette. LibreYOLO lo supporta per la classificazione zero-shot e per l'embedding di immagini e testo, senza nessun passaggio di addestramento.
- Task
- classify, embed
- Dimensioni
- Installa
pip install libreyolo- Livello di supporto
- Livello parallelo, dalla v. Un'interfaccia di prodotto separata, con una propria factory e un proprio contratto.
- Licenze
- Codice MIT, pesi MIT. Uso commerciale
Installazione
CLIP richiede un extra dedicato, che installa i pacchetti usati dal suo tokenizer BPE incorporato per riprodurre esattamente gli id dei token.
pip install "libreyolo[clip]"Predizione
I pesi vengono scaricati da Hugging Face al primo utilizzo e restano nella cache locale.
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))# Senza una chiamata a set_classes(), predict da CLI usa i 1.000 nomi# di classe ImageNet con cui il modello viene caricato di default.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") # Entrambi sono normalizzati L2, quindi un semplice prodotto scalare è la similarità coseno.similarity = (image_embed @ text_embed.T).item()set_classes() è l'unica primitiva che rende questo modello un classificatore
a vocabolario aperto: inserisce ogni etichetta in ciascun template di prompt,
codifica e media i risultati e memorizza nella cache la matrice [K, D]
risultante come testa del classificatore, così non viene ricalcolata per ogni
immagine. Chiamala di nuovo per cambiare classi in qualsiasi momento. Senza
nessuna chiamata, LibreCLIP viene caricato con i 1.000 nomi di classe di
ImageNet-1k già impostati.
Con task="embed", la predizione restituisce un vettore immagine normalizzato
L2 per ogni input invece delle probabilità di classe, e embed_text()
restituisce righe di testo normalizzate nello stesso spazio vettoriale, quindi
un semplice prodotto scalare tra i due è la similarità coseno. iou non ha
effetto su nessuno dei due task; non c'è nessun passaggio di NMS. Vedi
predizione per sorgenti, streaming e gestione dei risultati.
Validazione
val() legge i nomi delle cartelle di classe sotto lo split train/ di un
ImageFolder, li passa a set_classes() e poi misura l'accuratezza zero-shot
top-1 e top-5. L'accuratezza dipende da come i nomi delle classi funzionano
come prompt, non da un aggiornamento dei pesi, dato che non c'è niente da
addestrare. La validazione copre solo task="classify"; task="embed" non ha
un validatore su dataset.
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-cls.pt") # data è una directory radice ImageFolder con uno split train/; i nomi# delle cartelle diventano i prompt di classe zero-shot per questa esecuzione.metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])libreyolo val model=LibreCLIPb32-cls.pt data=imagenette160Esportazione
| Task | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| classify | classify to ONNX: supportato | classify to TorchScript: supportato | classify to ExecuTorch: supportato | classify to TensorRT: supportato | classify to OpenVINO: supportato | classify to Paddle: non supportato | classify to MNN: non supportato | classify to RKNN: non supportato | classify to ncnn: non supportato | classify to TFLite: non supportato | classify to CoreML: non supportato | classify to Core AI: supportato |
| embed | embed to ONNX: supportato | embed to TorchScript: supportato | embed to ExecuTorch: supportato | embed to TensorRT: supportato | embed to OpenVINO: supportato | embed to Paddle: non supportato | embed to MNN: non supportato | embed to RKNN: non supportato | embed to ncnn: non supportato | embed to TFLite: non supportato | embed to CoreML: non supportato | embed to Core AI: non supportato |
L'esportazione fissa lo stato corrente del modello in un grafo statico. Per
task="classify", le ultime etichette impostate da set_classes() e la
risoluzione al momento dell'esportazione vengono fissate in un layer lineare
finale, quindi il grafo ONNX o TensorRT esportato è un normale classificatore
di immagini [B, K] senza torre testuale e senza tokenizer; riesporta dopo
aver cambiato le classi o la dimensione. L'esportazione con task="embed"
traccia solo la torre delle immagini. Entrambe richiedono l'opset ONNX 14 o
superiore, che l'esportatore imposta di default.
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])model.export(format="onnx") # Le etichette correnti di set_classes() e la risoluzione di input# vengono fissate nel grafo. Riesporta dopo aver cambiato una delle due.# Qui non c'è nessuna chiamata a set_classes(), quindi vengono fissate# le 1.000 classi ImageNet predefinite con cui il modello viene caricato.libreyolo export model=LibreCLIPb32-cls.pt format=onnxfrom libreyolo import LibreYOLO # task="embed" traccia solo la torre delle immagini; non servono classi.model = LibreYOLO("LibreCLIPb32-cls.pt", task="embed")model.export(format="onnx")Checkpoint
Tutti i file di pesi pubblicati per questa famiglia. Entrambi sono convertiti
dai checkpoint di OpenCLIP addestrati su LAION-2B (ViT-B-32 e ViT-B-16),
non da un addestramento su COCO.
| File | Ingresso (px) | Licenza dei pesi |
|---|---|---|
| classify | ||
| LibreCLIPb32-cls.pt | mit | |
| LibreCLIPb16-cls.pt | mit | |
Oggi tutti i file elencati sopra sono presenti nell<link>organizzazione LibreYOLO</link> e vengono scaricati al primo utilizzo.
I dati di addestramento LAION-2B hanno una storia documentata di contenuti CSAM (Stanford Internet Observatory, dicembre 2023). Da allora LAION ha pubblicato Re-LAION, una nuova release ripulita; se ridistribuisci ulteriormente questi pesi, preferisci dove disponibili i checkpoint derivati da Re-LAION.
Licenze
Controlla la licenza nel repository Hugging Face degli specifici pesi che scarichi. Ogni checkpoint nell<link>organizzazione LibreYOLO</link> ne include una e non è sempre la stessa per tutta la famiglia. Quel repository è la fonte autorevole; il riepilogo seguente descrive le condizioni applicabili al momento dellultima verifica di questa pagina.
Questa è una descrizione delle licenze coinvolte, non una consulenza legale. Se la risposta è importante a fini commerciali, leggi personalmente le licenze e chiedi una consulenza indipendente.
- Lavoro originale
- CLIP / OpenCLIP, OpenAI; LAION / ML Foundations
- Licenza upstream
- MIT
- Sorgente upstream
- github.com/mlfoundations/open_clip
- Codice LibreYOLO
- MIT
- Pesi
- MIT, ripubblicati su huggingface.co/LibreYOLO
- Interpretazione
- 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.
Citazione
@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}
}Copiato dal blocco di citazione degli autori disponibile su github.com/mlfoundations/open_clip#citing.