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.
Origine
CLIP / OpenCLIP di OpenAI; LAION / ML Foundations, MIT. Articolo, sorgente
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.

bash
pip install "libreyolo[clip]"

Predizione

I pesi vengono scaricati da Hugging Face al primo utilizzo e restano nella cache locale.

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
# 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=True
Embedding di immagini e testo
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") # 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.

Python
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"])
CLI
libreyolo val model=LibreCLIPb32-cls.pt data=imagenette160

Esportazione

TaskONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
classifyclassify to ONNX: supportatoclassify to TorchScript: supportatoclassify to ExecuTorch: supportatoclassify to TensorRT: supportatoclassify to OpenVINO: supportatoclassify to Paddle: non supportatoclassify to MNN: non supportatoclassify to RKNN: non supportatoclassify to ncnn: non supportatoclassify to TFLite: non supportatoclassify to CoreML: non supportatoclassify to Core AI: supportato
embedembed to ONNX: supportatoembed to TorchScript: supportatoembed to ExecuTorch: supportatoembed to TensorRT: supportatoembed to OpenVINO: supportatoembed to Paddle: non supportatoembed to MNN: non supportatoembed to RKNN: non supportatoembed to ncnn: non supportatoembed to TFLite: non supportatoembed to CoreML: non supportatoembed 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.

Python
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.
CLI
# 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=onnx
Esportazione degli embedding
from 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.

FileIngresso (px)Licenza dei pesi
classify
LibreCLIPb32-cls.ptmit
LibreCLIPb16-cls.ptmit

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
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.

Verificato con LibreYOLO v1.5.0. Le tabelle di supporto, i checkpoint e i dati dei benchmark in questa pagina vengono generati dalla libreria rilasciata e dai pesi pubblicati, non scritti a mano.