FOMO
O FOMO é um localizador de pontos baseado em grade: cada célula de uma grade de baixa resolução é classificada como fundo ou centro de objeto, sem regressão de bounding box. O LibreYOLO o suporta na tarefa de pontos.
- Tarefas
- point
- Tamanhos
- Instalação
pip install libreyolo- Nível de suporte
- Compatível, desde a v. Modelos treináveis complementares: mantidos verdes na CI, com recursos incorporados quando há oportunidade.
- Origem
- FOMO (Faster Objects, More Objects) por Edge Impulse, MIT. Artigo, código-fonte
- Licenças
- Código MIT, pesos MIT. Uso comercial
Instalação
O FOMO não precisa de nada além do pacote base.
pip install libreyoloPredição
Diferente de todas as outras famílias deste site, os pesos do LibreFOMO não são
baixados automaticamente: LibreYOLO("LibreFOMOs-point.pt") procura esse arquivo
no disco e levanta um ValueError citando o nome dele em vez de buscá-lo no
Hugging Face. Baixe um checkpoint da organização LibreYOLO
primeiro e carregue-o pelo caminho local, ou treine o seu (veja Treinamento abaixo).
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Os pesos do LibreFOMO não são baixados automaticamente (veja Checkpoints abaixo).# Aponte isto para um checkpoint que você já baixou localmente.model = LibreYOLO("./LibreFOMOs-point.pt")result = model(SAMPLE_IMAGE, save=True) for point in result.points: print(point.cls, point.conf, point.xy)libreyolo predict model=./LibreFOMOs-point.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=TrueO resultado traz um payload points no lugar de boxes: cada linha é
x, y, class, confidence, disponível como result.points.data ou pelos
acessores .xy, .xyn, .cls e .conf. Não há limiar de iou para definir,
porque não existem boxes a suprimir; predict(..., nms_radius=1) controla
quantas células de grade duas detecções precisam ter entre si para ambas
sobreviverem, e o nome do arquivo precisa carregar o sufixo de tarefa -point
do FOMO para o loader reconhecê-lo. Veja predição para fontes,
streaming e tratamento de resultados.
Variantes
Três tamanhos, s, m e l, usam backbones no estilo MobileNetV2
progressivamente mais largos em resoluções de entrada fixas e correspondentemente
maiores, cada um atrás de uma única cabeça de classificação 1x1. Esta família não
tem tabela de benchmark aqui; o tamanho do arquivo de checkpoint na tabela abaixo
é o sinal mais claro por tamanho publicado até agora.
Treinamento
from libreyolo import LibreYOLO model = LibreYOLO("./LibreFOMOs-point.pt")model.train( data="my-dataset.yaml", epochs=40, batch=32, lr0=3e-4,)# imgsz precisa ser passado: a CLI usa 640 por padrão, e o checkpoint# s aceita apenas os seus 96 nativos.libreyolo train model=./LibreFOMOs-point.pt data=my-dataset.yaml imgsz=96 epochs=40 batch=32 lr0=3e-4imgsz não é uma escolha livre: ele assume por padrão a resolução nativa do
checkpoint carregado, e passar um valor diferente levanta um ValueError citando
o tamanho esperado. Esses tamanhos são 96 para o s, 192 para o m e 224 para o
l. A CLI usa 640 como padrão de imgsz, então um comando libreyolo train
precisa defini-lo explicitamente para bater com o checkpoint.
Se você não mexer em mais nada, o treinador roda 40 épocas com batch 32 usando
Adam a lr0=3e-4, sem weight decay, e com a classe de primeiro plano pesando
100x mais que o fundo na loss de cross-entropy por célula, já que quase toda
célula da grade é fundo em uma cena típica. EMA e precisão mista ficam ambos
desligados por padrão, e nenhuma das augmentations geométricas ou de cor usadas
em outras partes do LibreYOLO é aplicada: mosaic, mixup, jitter de HSV, flip,
rotação, translação e shear estão todos zerados.
Esse é o caminho com que os checkpoints publicados do LibreFOMO foram treinados, do zero na COCO.
Veja treinamento para datasets e loggers.
Validação
val() despacha para um validador em nível de grade feito para esta família. Ao
lado das chaves metrics/precision, metrics/recall e metrics/mAP@ de
correspondência por pontos, compartilhadas com outras tarefas de pontos, ele
varre limiares de confiança e valores de nms_radius e publica a combinação de
melhor F1 em metrics/grid_F1, metrics/grid_precision, metrics/grid_recall e
metrics/grid_mean_distance, além do limiar e do raio que a produziram em
decode/threshold e decode/nms_radius.
from libreyolo import LibreYOLO model = LibreYOLO("./LibreFOMOs-point.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/grid_F1"])print(metrics["metrics/grid_precision"], metrics["metrics/grid_recall"])libreyolo val model=./LibreFOMOs-point.pt data=my-dataset.yamlExportação
| Tarefa | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| point | point to ONNX: compatível | point to TorchScript: compatível | point to ExecuTorch: compatível | point to TensorRT: compatível | point to OpenVINO: compatível | point to Paddle: incompatível | point to MNN: incompatível | point to RKNN: incompatível | point to ncnn: compatível | point to TFLite: incompatível | point to CoreML: incompatível | point to Core AI: compatível |
Um artefato exportado carrega de volta pelo LibreYOLO() a partir do sufixo do
arquivo, então um arquivo .onnx ou .engine se comporta como um checkpoint e
devolve o mesmo Results. Rodar o grafo em um runtime puro, sem o LibreYOLO
instalado, também é suportado, mas aí o pré-processamento e o pós-processamento
ficam por sua conta.
from libreyolo import LibreYOLO model = LibreYOLO("./LibreFOMOs-point.pt")model.export(format="onnx")model.export(format="tensorrt", half=True)libreyolo export model=./LibreFOMOs-point.pt format=onnxfrom libreyolo import LibreYOLO, SAMPLE_IMAGE # A factory decide pelo sufixo do arquivo, então um artefato exportado# carrega como qualquer checkpoint e devolve o mesmo objeto Results.model = LibreYOLO("./LibreFOMOs-point.onnx")result = model(SAMPLE_IMAGE) print(result.points.xy)Checkpoints
Todo arquivo de pesos publicado desta família. Nenhum deles baixa
automaticamente: pegue o arquivo que você quer na página do Hugging Face
vinculada e passe o caminho local dele para LibreYOLO().
| Arquivo | Entrada (px) | Licença dos pesos |
|---|---|---|
| point | ||
| LibreFOMOs-point.pt | mit | |
| LibreFOMOm-point.pt | mit | |
| LibreFOMOl-point.pt | mit | |
Todos os arquivos acima existem hoje na organização LibreYOLO e são baixados no primeiro uso.
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
- FOMO (Faster Objects, More Objects), Edge Impulse
- Licença original
- MIT
- Código-fonte original
- docs.edgeimpulse.com/docs/edge-impulse-studio/learning-blocks/object-detection/fomo-object-detection-for-constrained-devices
- Código do LibreYOLO
- MIT
- Pesos
- MIT, republicado em huggingface.co/LibreYOLO
- Interpretação
- FOMO is a technique Edge Impulse introduced through a blog post and its product documentation, not a code release, so there is no upstream repository or license to inherit. LibreYOLO's architecture is an original MobileNetV2-style reimplementation of the published description, and the LibreFOMO checkpoints are trained from scratch on COCO, so both the code and these weights are MIT, LibreYOLO's own. They are also not auto-downloaded: LibreYOLO("LibreFOMOs-point.pt") looks for that file locally and raises rather than fetching it, so get the checkpoint from the Hugging Face repository first. The name FOMO and the technique it describes remain Edge Impulse's.
Não há repositório de código upstream do FOMO para linkar: a Edge Impulse descreve a técnica em um post de blog e na documentação do seu produto, mas não liberou o código de treinamento ou de inferência do FOMO. A arquitetura e o treinamento aqui são a implementação própria do LibreYOLO dessa descrição publicada, e os checkpoints publicados do LibreFOMO são treinados do zero na COCO, então tanto o código quanto esses pesos são MIT, do próprio LibreYOLO. O nome FOMO e a técnica que ele descreve continuam sendo da Edge Impulse.