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.
- 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.
pip install "libreyolo[clip]"Prédire
Les poids sont téléchargés depuis Hugging Face au premier usage, puis mis en cache localement.
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))# 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=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") # 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.
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"])libreyolo val model=LibreCLIPb32-cls.pt data=imagenette160Exporter
| Tâche | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| classify | classify to ONNX : pris en charge | classify to TorchScript : pris en charge | classify to ExecuTorch : pris en charge | classify to TensorRT : pris en charge | classify to OpenVINO : pris en charge | classify to Paddle : non pris en charge | classify to MNN : non pris en charge | classify to RKNN : non pris en charge | classify to ncnn : non pris en charge | classify to TFLite : non pris en charge | classify to CoreML : non pris en charge | classify to Core AI : pris en charge |
| embed | embed to ONNX : pris en charge | embed to TorchScript : pris en charge | embed to ExecuTorch : pris en charge | embed to TensorRT : pris en charge | embed to OpenVINO : pris en charge | embed to Paddle : non pris en charge | embed to MNN : non pris en charge | embed to RKNN : non pris en charge | embed to ncnn : non pris en charge | embed to TFLite : non pris en charge | embed to CoreML : non pris en charge | embed 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.
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.# 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=onnxfrom 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.
| Fichier | Entrée (px) | Licence des poids |
|---|---|---|
| classify | ||
| LibreCLIPb32-cls.pt | mit | |
| LibreCLIPb16-cls.pt | mit | |
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.