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.

bash
pip install "libreyolo[clip]"

Predição

Os pesos são baixados do Hugging Face no primeiro uso e ficam em cache localmente.

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
# 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=True
Embedding de imagem e texto
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") # 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.

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

Exportação

TarefaONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
classifyclassify to ONNX: compatívelclassify to TorchScript: compatívelclassify to ExecuTorch: compatívelclassify to TensorRT: compatívelclassify to OpenVINO: compatívelclassify to Paddle: incompatívelclassify to MNN: incompatívelclassify to RKNN: incompatívelclassify to ncnn: incompatívelclassify to TFLite: incompatívelclassify to CoreML: incompatívelclassify to Core AI: compatível
embedembed to ONNX: compatívelembed to TorchScript: compatívelembed to ExecuTorch: compatívelembed to TensorRT: compatívelembed to OpenVINO: compatívelembed to Paddle: incompatívelembed to MNN: incompatívelembed to RKNN: incompatívelembed to ncnn: incompatívelembed to TFLite: incompatívelembed to CoreML: incompatívelembed 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.

Python
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.
CLI
# 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=onnx
Exportação de embeddings
from 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.

ArquivoEntrada (px)Licença dos pesos
classify
LibreCLIPb32-cls.ptmit
LibreCLIPb16-cls.ptmit

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

Verificado com o LibreYOLO v1.5.0. As tabelas de suporte, os checkpoints e os números de benchmark desta página são gerados a partir da biblioteca lançada e dos pesos publicados, não escritos à mão.