CLIP
CLIP es un modelo de doble torre que puntúa una imagen frente a prompts de texto en lugar de un conjunto fijo de etiquetas. LibreYOLO lo soporta para clasificación zero-shot y embeddings de imagen y texto, sin ningún paso de entrenamiento.
- Tareas
- classify, embed
- Tamaños
- Instalación
pip install libreyolo- Nivel de compatibilidad
- Nivel hermano, desde v. Una superficie de producto independiente con su propia factoría y su propio contrato.
- Licencias
- Código MIT, pesos MIT. Uso comercial
Instalación
CLIP necesita su propio extra, que instala los paquetes que usa su tokenizador BPE incluido para reproducir exactamente los mismos ids de token.
pip install "libreyolo[clip]"Predicción
Los pesos se descargan de Hugging Face en el primer uso y quedan cacheados localmente.
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))# Sin una llamada a set_classes(), predict desde la CLI usa los 1.000# nombres de clase de ImageNet que el modelo carga por defecto.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") # Ambos están normalizados con L2, así que un simple producto escalar es la similitud coseno.similarity = (image_embed @ text_embed.T).item()set_classes() es la primitiva que convierte esto en un clasificador de vocabulario abierto: inserta cada etiqueta en todas las plantillas de prompt, codifica y promedia los resultados, y cachea la matriz [K, D] resultante como cabeza del clasificador, de modo que no se recalcula en cada imagen. Vuelve a llamarla para cambiar las clases en cualquier momento. Si no la llamas, LibreCLIP se carga con los 1.000 nombres de clase de ImageNet-1k ya asignados.
Con task="embed", la predicción devuelve un vector de imagen normalizado con L2 por cada entrada en lugar de probabilidades de clase, y embed_text() devuelve filas de texto normalizadas en el mismo espacio vectorial, así que un simple producto escalar entre ambos es la similitud coseno. iou no tiene efecto en ninguna de las dos tareas; no hay paso de NMS. Consulta predicción para fuentes, streaming y manejo de resultados.
Validación
val() lee los nombres de las carpetas de clase del split train/ de un ImageFolder, llama a set_classes() con ellos y después mide la precisión zero-shot top-1 y top-5. La precisión depende de cómo se lean los nombres de clase como prompts, no de ninguna actualización de pesos, ya que no hay nada que entrenar. La validación solo cubre task="classify"; task="embed" no tiene validador de dataset.
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-cls.pt") # data es una raíz ImageFolder con un split train/; sus nombres de# carpeta se convierten en los prompts de clase zero-shot de esta ejecución.metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])libreyolo val model=LibreCLIPb32-cls.pt data=imagenette160Exportación
| Tarea | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| classify | classify to ONNX: compatible | classify to TorchScript: compatible | classify to ExecuTorch: compatible | classify to TensorRT: compatible | classify to OpenVINO: compatible | classify to Paddle: no compatible | classify to MNN: no compatible | classify to RKNN: no compatible | classify to ncnn: no compatible | classify to TFLite: no compatible | classify to CoreML: no compatible | classify to Core AI: compatible |
| embed | embed to ONNX: compatible | embed to TorchScript: compatible | embed to ExecuTorch: compatible | embed to TensorRT: compatible | embed to OpenVINO: compatible | embed to Paddle: no compatible | embed to MNN: no compatible | embed to RKNN: no compatible | embed to ncnn: no compatible | embed to TFLite: no compatible | embed to CoreML: no compatible | embed to Core AI: no compatible |
La exportación fija el estado actual del modelo en un grafo estático. Para task="classify", las últimas etiquetas que asignó set_classes() y la resolución en el momento de exportar quedan fijadas en una capa lineal final, de modo que el grafo ONNX o TensorRT exportado es un clasificador de imágenes [B, K] corriente, sin torre de texto y sin tokenizador; vuelve a exportar después de cambiar las clases o el tamaño. La exportación con task="embed" traza solo la torre de imagen. Ambas necesitan el opset 14 de ONNX o superior, que el exportador establece por defecto.
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])model.export(format="onnx") # Las etiquetas actuales de set_classes() y la resolución de entrada# quedan fijadas en el grafo. Vuelve a exportar si cambias cualquiera.# Aquí no hay llamada a set_classes(), así que esto fija las 1.000# clases de ImageNet por defecto con las que se carga el modelo.libreyolo export model=LibreCLIPb32-cls.pt format=onnxfrom libreyolo import LibreYOLO # task="embed" traza solo la torre de imagen; no hacen falta clases.model = LibreYOLO("LibreCLIPb32-cls.pt", task="embed")model.export(format="onnx")Checkpoints
Todos los archivos de pesos publicados de esta familia. Ambos están convertidos a partir de los checkpoints de OpenCLIP entrenados con LAION-2B (ViT-B-32 y ViT-B-16), no de ningún entrenamiento con COCO.
| Archivo | Entrada (px) | Licencia de los pesos |
|---|---|---|
| classify | ||
| LibreCLIPb32-cls.pt | mit | |
| LibreCLIPb16-cls.pt | mit | |
Todos los archivos anteriores existen hoy en la organización de LibreYOLO y se descargan la primera vez que se usan.
Los datos de entrenamiento de LAION-2B tienen un historial documentado de contenido CSAM (Stanford Internet Observatory, diciembre de 2023). Desde entonces LAION ha publicado Re-LAION, una reedición limpia; si vuelves a alojar estos pesos por tu cuenta, prefiere los checkpoints derivados de Re-LAION cuando estén disponibles.
Licencia
Comprueba la licencia en el repositorio de Hugging Face de los pesos concretos que descargues. Cada checkpoint de la organización de LibreYOLO incluye una, y no siempre es la misma en toda una familia. Ese repositorio es la fuente autorizada; el resumen siguiente describe qué se aplicaba cuando se verificó esta página por última vez.
Esta es una descripción de las licencias implicadas, no asesoramiento legal. Si la respuesta es importante a nivel comercial, lee las licencias y busca tu propio asesoramiento.
- Trabajo original
- CLIP / OpenCLIP, OpenAI; LAION / ML Foundations
- Licencia del proyecto original
- MIT
- Fuente del proyecto original
- github.com/mlfoundations/open_clip
- Código de LibreYOLO
- MIT
- Pesos
- MIT, republicados en huggingface.co/LibreYOLO
- Interpretación
- 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.
Cita
@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}
}Copiado del bloque de cita de los autores en github.com/mlfoundations/open_clip#citing.