CLIP
CLIP é um modelo de torre dupla que pontua uma imagem contra prompts de texto em vez de um conjunto fixo de rótulos. O LibreYOLO oferece suporte a ele para classificação zero-shot e embeddings de imagem e texto, sem nenhuma etapa de treinamento.
- Tarefas
- classify, embed
- Tamanhos
- Instalação
pip install libreyolo- Nível de suporte
- Nível irmão, desde a v. Uma superfície de produto separada, com sua própria fábrica e seu próprio contrato.
- Origem
- CLIP / OpenCLIP por OpenAI; LAION / ML Foundations, MIT. Artigo, código-fonte
- Licenças
- Código MIT, pesos MIT. Uso comercial
Instalação
O CLIP precisa do seu próprio extra, que instala os pacotes usados pelo tokenizador BPE embutido para reproduzir exatamente os mesmos ids de token.
pip install "libreyolo[clip]"Predição
Os pesos são baixados do Hugging Face no primeiro uso e ficam em cache 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))# Sem uma chamada a set_classes(), o predict da CLI usa os 1.000# nomes de classe do ImageNet que o modelo carrega por padrão.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 são normalizados por L2, então um simples produto escalar é a similaridade de cosseno.similarity = (image_embed @ text_embed.T).item()set_classes() é a primitiva que transforma isso em um classificador de vocabulário aberto: ela insere cada rótulo em todos os templates de prompt, codifica e faz a média dos resultados, e guarda em cache a matriz [K, D] resultante como cabeça do classificador, de modo que ela não é recalculada a cada imagem. Basta chamá-la de novo para mudar as classes a qualquer momento. Sem nenhuma chamada, o LibreCLIP carrega já com os 1.000 nomes de classe do ImageNet-1k definidos.
Com task="embed", a predição devolve um vetor de imagem normalizado por L2 para cada entrada em vez de probabilidades de classe, e embed_text() devolve linhas de texto normalizadas no mesmo espaço vetorial, então um simples produto escalar entre eles é a similaridade de cosseno. iou não tem efeito em nenhuma das duas tarefas; não existe etapa de NMS. Veja predição para fontes, streaming e tratamento de resultados.
Validação
val() lê os nomes das pastas de classe sob o split train/ de um ImageFolder, chama set_classes() com eles e então mede a acurácia zero-shot top-1 e top-5. A acurácia depende de como os nomes das classes funcionam como prompts, não de qualquer atualização de pesos, já que não há nada para treinar. A validação cobre apenas task="classify"; task="embed" não tem validador de dataset.
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-cls.pt") # data é uma raiz ImageFolder com um split train/; os nomes das pastas# viram os prompts de classe zero-shot desta execução.metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])libreyolo val model=LibreCLIPb32-cls.pt data=imagenette160Exportação
| Tarefa | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| classify | classify to ONNX: compatível | classify to TorchScript: compatível | classify to ExecuTorch: compatível | classify to TensorRT: compatível | classify to OpenVINO: compatível | classify to Paddle: incompatível | classify to MNN: incompatível | classify to RKNN: incompatível | classify to ncnn: incompatível | classify to TFLite: incompatível | classify to CoreML: incompatível | classify to Core AI: compatível |
| embed | embed to ONNX: compatível | embed to TorchScript: compatível | embed to ExecuTorch: compatível | embed to TensorRT: compatível | embed to OpenVINO: compatível | embed to Paddle: incompatível | embed to MNN: incompatível | embed to RKNN: incompatível | embed to ncnn: incompatível | embed to TFLite: incompatível | embed to CoreML: incompatível | embed to Core AI: incompatível |
A exportação fixa o estado atual do modelo em um grafo estático. Para task="classify", os últimos rótulos definidos por set_classes() e a resolução no momento da exportação ficam fixados em uma camada linear final, de modo que o grafo ONNX ou TensorRT exportado é um classificador de imagens [B, K] comum, sem torre de texto e sem tokenizador; exporte de novo depois de mudar as classes ou o tamanho. A exportação com task="embed" traça apenas a torre de imagem. Ambas precisam do opset 14 do ONNX ou superior, que o exportador define por padrão.
from libreyolo import LibreYOLO model = LibreYOLO("LibreCLIPb32-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])model.export(format="onnx") # Os rótulos atuais de set_classes() e a resolução de entrada ficam# fixados no grafo. Exporte de novo depois de mudar qualquer um dos dois.# Aqui não há chamada a set_classes(), então isso fixa as 1.000# classes padrão do ImageNet com as quais o modelo carrega.libreyolo export model=LibreCLIPb32-cls.pt format=onnxfrom libreyolo import LibreYOLO # task="embed" traça apenas a torre de imagem; nenhuma classe é necessária.model = LibreYOLO("LibreCLIPb32-cls.pt", task="embed")model.export(format="onnx")Checkpoints
Todos os arquivos de pesos publicados desta família. Ambos são convertidos a partir dos checkpoints do OpenCLIP treinados com LAION-2B (ViT-B-32 e ViT-B-16), não de nenhum treinamento em COCO.
| Arquivo | Entrada (px) | Licença dos pesos |
|---|---|---|
| classify | ||
| LibreCLIPb32-cls.pt | mit | |
| LibreCLIPb16-cls.pt | mit | |
Todos os arquivos acima existem hoje na organização LibreYOLO e são baixados no primeiro uso.
Os dados de treinamento do LAION-2B têm um histórico documentado de conteúdo CSAM (Stanford Internet Observatory, dezembro de 2023). Desde então a LAION publicou o Re-LAION, uma reedição limpa; se você for re-hospedar esses pesos por conta própria, prefira os checkpoints derivados do Re-LAION quando estiverem disponíveis.
Licenciamento
Confira a licença no repositório do Hugging Face correspondente aos pesos que você baixar. Cada checkpoint na organização LibreYOLO tem uma licença, e ela nem sempre é a mesma em toda a família. Esse repositório é a fonte oficial. O resumo abaixo descreve o que se aplicava na última verificação desta página.
Esta é uma descrição das licenças envolvidas, não uma orientação jurídica. Se a resposta tiver importância comercial, leia as licenças e procure sua própria assessoria.
- Trabalho original
- CLIP / OpenCLIP, OpenAI; LAION / ML Foundations
- Licença original
- MIT
- Código-fonte original
- github.com/mlfoundations/open_clip
- Código do LibreYOLO
- MIT
- Pesos
- MIT, republicado em huggingface.co/LibreYOLO
- Interpretação
- 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ção
@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 do bloco de citação dos autores em github.com/mlfoundations/open_clip#citing.