Ver como markdown

Detecção de vocabulário aberto

A detecção de vocabulário aberto substitui a lista fixa de classes de um checkpoint por palavras que você escolhe na hora da chamada. No LibreYOLO ela não é uma tarefa separada: é a tarefa detect atendida por um tier de modelos separado, carregado pela factory LibreOpenVocab em vez do LibreYOLO.

Definição

A detecção de vocabulário aberto retorna Results de detecção comuns: caixas, confianças e índices de classe, com result.names mapeando esses índices de volta para as strings que você pediu. O que muda é de onde vem a lista de classes. Um detector convencional é treinado com um conjunto fixo de categorias e nunca consegue emitir uma categoria fora dele. Esses modelos recebem o vocabulário como texto no momento da inferência, então set_classes(["forklift", "safety cone"]) basta para que essas sejam as classes.

O LibreYOLO não tem uma chave de tarefa open-vocabulary. Esses modelos declaram SUPPORTED_TASKS = ("detect",) como qualquer outro detector. O que os separa é o caminho de carregamento: são snapshots da Hugging Face em vez de checkpoints de state-dict do LibreYOLO, então ficam de fora da factory LibreYOLO() e são construídos por LibreOpenVocab(). Essa factory é irmã de LibreSAM() e LibreVLM(), não uma substituta de LibreYOLO().

Os scores são scores de detecção reais, não uma legenda gerada e interpretada depois. Cada família pontua as regiões da imagem em relação ao embedding de texto de cada prompt.

Modelos

Quatro famílias formam o tier, e todas elas só fazem predição. Carregue qualquer uma delas por alias pelo LibreOpenVocab.

Grounding DINO, da IDEA Research, nos tamanhos t e b. É o padrão do tier e a única família que aceita text_threshold, um segundo corte sobre o score de token da frase decodificada.

OWLv2, do Google Research, nos tamanhos b16 e l14. Ele pontua as regiões da imagem em relação a embeddings de texto de um codificador no estilo CLIP.

OMDet-Turbo, do Om AI Lab, em um único tamanho t. Ele desacopla os embeddings de classe de um prompt de tarefa em linguagem natural, e é a única família aqui que suprime caixas sobrepostas dentro do seu próprio pós-processamento, então iou= é respeitado.

OV-DEIM, nos tamanhos s, m e l, um detector no estilo DETR que casa as queries do decodificador com embeddings de texto de uma torre de texto MobileCLIP embutida. É correspondência um-para-um com seleção top-K, então nenhum NMS roda em lugar nenhum.

Os pesos do OV-DEIM são o caso restrito deste tier. Os pesos do detector são CC BY-NC 4.0, não comerciais. A torre de texto embutida está sob a licença Machine Learning Research Model da Apple, apenas para uso em pesquisa. O checkpoint l acrescenta um fine-tuning de backbone DINOv3-S sob a DINOv3 License da Meta. Os três textos de licença acompanham o repositório de pesos, e a biblioteca registra no log o mesmo resumo quando resolve os pesos, antes de o modelo ser construído. Leia OV-DEIM antes de fazer deploy dele.

O tier precisa de um extra:

bash
pip install "libreyolo[openvocab]"

Isso cobre transformers e timm para as três famílias encapsuladas, e os pacotes huggingface_hub, safetensors, regex e ftfy de que o OV-DEIM precisa por ser um port nativo.

Um segundo tier também aceita um vocabulário de texto: LibreVLM() carrega modelos generativos de visão e linguagem, como Qwen3-VL e Florence-2, e transforma a saída deles nos mesmos Results. Ele compartilha a mesma superfície set_classes(). A diferença está no que produz as caixas: as famílias desta página são detectores discriminativos que emitem scores diretamente, enquanto o tier de VLMs as gera.

Predição

Python
from libreyolo import LibreOpenVocab, SAMPLE_IMAGE model = LibreOpenVocab("grounding-dino-t")model.set_classes(["person", "dog", "skateboard"]) result = model.predict(SAMPLE_IMAGE, conf=0.25)print(result.names)for box in result.boxes:    print(box.cls, box.conf, box.xyxy)
Trocar o vocabulário
from libreyolo import LibreOpenVocab, SAMPLE_IMAGE model = LibreOpenVocab("owlv2-b16") # set_classes é persistente: vale até a próxima chamada dele.# Os rótulos precisam ser únicos em minúsculas e sem os artigos.model.set_classes(["a red backpack", "traffic cone"])result = model.predict(SAMPLE_IMAGE) model.set_classes(["bicycle wheel"])result = model.predict(SAMPLE_IMAGE)
Limiar de texto do Grounding DINO
from libreyolo import LibreOpenVocab, SAMPLE_IMAGE model = LibreOpenVocab("grounding-dino-b")model.set_classes(["remote control", "school bus"]) # conf filtra pelo score da caixa, e text_threshold pelo score de token# da frase decodificada. Ambos assumem 0.25 quando não são definidos.# Só o Grounding DINO aceita text_threshold; os outros levantam erro.result = model.predict(SAMPLE_IMAGE, conf=0.25, text_threshold=0.3)

set_classes() recebe uma lista não vazia de strings de rótulo e vale até ser chamada de novo. Os rótulos precisam ser únicos depois de convertidos para minúsculas e sem os artigos iniciais, então "a bus" e "bus" não podem coexistir em um mesmo vocabulário. Frases de várias palavras são rótulos como quaisquer outros, e cada família transforma a lista na sua própria entrada de texto antes de tokenizar, então "traffic cone" é uma query diferente de "cone".

Três argumentos de predição se comportam de forma diferente aqui em relação a um detector nativo. imgsz= é rejeitado, porque o processador é quem cuida do redimensionamento nessas famílias. augment=True é rejeitado, já que o data augmentation em tempo de teste está fora do escopo do tier. iou= vale apenas para a família cujo processador roda a própria supressão; onde nada é suprimido, passá-lo gera um aviso e o valor é ignorado.

Quando não é definido, conf assume o padrão da própria família carregada em vez do 0.25 usual de predict(), e esse padrão não é o mesmo em todo o tier. Defina o valor explicitamente ao comparar duas famílias na mesma imagem.

track() levanta erro em todo o tier. Em vez disso, rode predict() quadro a quadro. Veja predição para fontes, streaming e tratamento de resultados.

Treinamento

Nenhuma família deste tier treina dentro do LibreYOLO. train() levanta erro: faça fine-tuning upstream e carregue os pesos resultantes. O vocabulário passado para set_classes() é a única configuração que muda o que um modelo carregado detecta.

Validação

Não existe validador para este tier, e val() levanta erro. A validação de vocabulário aberto precisa de um validador dedicado, porque o validador de detecção padrão alimenta o modelo diretamente com tensores de imagem, enquanto essas famílias exigem entradas condicionadas por texto construídas junto com eles.

Exportação

A exportação está fora do escopo do tier e export() levanta erro. Esses modelos rodam por predict() no PyTorch.

Verificado com o LibreYOLO v1.5.0.