CLIP

CLIP est un modèle à deux tours qui évalue une image face à des prompts textuels plutôt que face à un ensemble d'étiquettes figé. LibreYOLO le prend en charge pour la classification en zero-shot et les embeddings image/texte, sans aucune étape d'entraînement.

Tâches
classify, embed
Tailles
Installer
pip install libreyolo
Niveau de support
Niveau parallèle, depuis v. Une interface produit distincte avec sa propre factory et son propre contrat.
Origine
CLIP / OpenCLIP par OpenAI; LAION / ML Foundations, MIT. Article, source
Licences
Code MIT, poids MIT. Usage commercial

Installation

CLIP demande son propre extra, qui installe les paquets dont son tokenizer BPE embarqué a besoin pour reproduire exactement les identifiants de tokens.

bash
pip install "libreyolo[clip]"

Prédire

Les poids sont téléchargés depuis Hugging Face au premier usage, puis mis en cache localement.

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
# Sans appel à set_classes(), la prédiction CLI utilise les 1 000 noms# de classes ImageNet chargés par défaut avec le modèle.libreyolo predict model=LibreCLIPb32-cls.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
Embeddings image et texte
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") # Tous deux sont normalisés L2 : un produit scalaire donne le cosinus.similarity = (image_embed @ text_embed.T).item()

set_classes() est la primitive qui fait de ce modèle un classifieur à vocabulaire ouvert : elle insère chaque étiquette dans chaque template de prompt, encode puis moyenne les résultats, et met en cache la matrice [K, D] obtenue comme tête de classification, si bien qu'elle n'est pas recalculée pour chaque image. Rappelez-la à tout moment pour changer de classes. Sans aucun appel, LibreCLIP se charge avec les 1 000 noms de classes d'ImageNet-1k déjà définis.

Avec task="embed", la prédiction renvoie un vecteur image normalisé L2 par entrée au lieu de probabilités de classes, et embed_text() renvoie des lignes de texte normalisées dans le même espace vectoriel, si bien qu'un simple produit scalaire entre les deux donne la similarité cosinus. iou n'a d'effet sur aucune des deux tâches ; il n'y a pas d'étape de NMS. Voir la prédiction pour les sources, le streaming et le traitement des résultats.

Valider

val() lit les noms des dossiers de classes sous un split train/ de type ImageFolder, appelle set_classes() avec eux, puis mesure l'exactitude zero-shot top-1 et top-5. L'exactitude dépend de la façon dont les noms de classes se lisent comme prompts, et non d'une mise à jour des poids, puisqu'il n'y a rien à entraîner. La validation ne couvre que task="classify" ; task="embed" n'a pas de validateur sur dataset.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-cls.pt") # data est une racine ImageFolder avec un split train/ ; ses noms de# dossiers deviennent les prompts de classes zero-shot de ce run.metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])
CLI
libreyolo val model=LibreCLIPb32-cls.pt data=imagenette160

Exporter

TâcheONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
classifyclassify to ONNX : pris en chargeclassify to TorchScript : pris en chargeclassify to ExecuTorch : pris en chargeclassify to TensorRT : pris en chargeclassify to OpenVINO : pris en chargeclassify to Paddle : non pris en chargeclassify to MNN : non pris en chargeclassify to RKNN : non pris en chargeclassify to ncnn : non pris en chargeclassify to TFLite : non pris en chargeclassify to CoreML : non pris en chargeclassify to Core AI : pris en charge
embedembed to ONNX : pris en chargeembed to TorchScript : pris en chargeembed to ExecuTorch : pris en chargeembed to TensorRT : pris en chargeembed to OpenVINO : pris en chargeembed to Paddle : non pris en chargeembed to MNN : non pris en chargeembed to RKNN : non pris en chargeembed to ncnn : non pris en chargeembed to TFLite : non pris en chargeembed to CoreML : non pris en chargeembed to Core AI : non pris en charge

L'export inscrit l'état courant du modèle dans un graphe figé. Pour task="classify", les dernières étiquettes définies par set_classes() et la résolution au moment de l'export sont figées dans une couche linéaire finale, si bien que le graphe ONNX ou TensorRT exporté est un classifieur d'images [B, K] ordinaire, sans tour texte ni tokenizer ; réexportez après avoir changé les classes ou la taille. L'export en task="embed" trace la seule tour image. Les deux exigent l'opset ONNX 14 ou supérieur, que l'exporteur définit par défaut.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])model.export(format="onnx") # Les étiquettes set_classes() actuelles et la résolution d'entrée sont# figées dans le graphe. Réexportez après avoir changé l'une ou l'autre.
CLI
# Aucun appel à set_classes() ici : cela fige donc les 1 000 classes# ImageNet par défaut chargées avec le modèle.libreyolo export model=LibreCLIPb32-cls.pt format=onnx
Export des embeddings
from libreyolo import LibreYOLO # task="embed" trace la seule tour image ; aucune classe requise.model = LibreYOLO("LibreCLIPb32-cls.pt", task="embed")model.export(format="onnx")

Checkpoints

Tous les fichiers de poids publiés de cette famille. Les deux sont convertis depuis les checkpoints d'OpenCLIP entraînés sur LAION-2B (ViT-B-32 et ViT-B-16), et non depuis un entraînement sur COCO.

FichierEntrée (px)Licence des poids
classify
LibreCLIPb32-cls.ptmit
LibreCLIPb16-cls.ptmit

Tous les fichiers ci-dessus sont actuellement disponibles dans l<link>organisation LibreYOLO</link> et sont téléchargés à la première utilisation.

Les données d'entraînement LAION-2B ont un historique documenté de contenus pédocriminels (CSAM) (Stanford Internet Observatory, décembre 2023). LAION a depuis publié Re-LAION, une réédition nettoyée ; si vous réhébergez ces poids ailleurs, préférez les checkpoints dérivés de Re-LAION lorsqu'ils existent.

Licence

Vérifiez la licence dans le dépôt Hugging Face des poids précis que vous téléchargez. Chaque checkpoint de l<link>organisation LibreYOLO</link> en possède une, et elles ne sont pas toujours identiques au sein dune même famille. Ce dépôt fait autorité ; le résumé ci-dessous décrit les conditions applicables lors de la dernière vérification de cette page.

Ceci décrit les licences concernées et ne constitue pas un conseil juridique. Si la réponse a une importance commerciale, lisez vous-même les licences et consultez votre propre avocat.

Travail d'origine
CLIP / OpenCLIP, OpenAI; LAION / ML Foundations
Licence du projet d'origine
MIT
Source du projet d'origine
github.com/mlfoundations/open_clip
Code de LibreYOLO
MIT
Poids
MIT, republiés sur huggingface.co/LibreYOLO
Interprétation
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.

Citation

@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}
}

Copié depuis le bloc de citation des auteurs sur github.com/mlfoundations/open_clip#citing.

Vérifié avec LibreYOLO v1.5.0. Les tableaux de support, les checkpoints et les chiffres de benchmark de cette page sont générés à partir de la bibliothèque publiée et des poids publiés, et non rédigés à la main.