EoMT
Uma rede de segmentação construída sobre um vision transformer simples, sem decoder de pixels dedicado: queries aprendidas extras, adicionadas ao próprio encoder, predizem as máscaras. O LibreYOLO a suporta para segmentação semântica, de instâncias e panóptica.
- Tarefas
- semantic, instance segmentation, panoptic
- Tamanhos
- s, b, l at 512 px
- Instalação
pip install libreyolo- Nível de suporte
- Somente inferência, desde a v. Somente predição, validação e exportação. Os recursos de treinamento não se aplicam.
- Origem
- EoMT por TU Eindhoven, Mobile Perception Systems Lab, MIT. Artigo, código-fonte
- Licenças
- Código MIT, pesos MIT. Uso comercial
Instalação
O EoMT não precisa de nenhum extra opcional. Tudo o que ele importa está na instalação base.
pip install libreyoloPredição
Os pesos são baixados do Hugging Face no primeiro uso e ficam em cache local.
O sufixo de tarefa no nome do arquivo (-sem, -seg, -panoptic) seleciona a
tarefa, e LibreYOLO() a infere a partir desse nome de arquivo, então nenhum
argumento task= é necessário.
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreEoMTl-sem.pt")result = model(SAMPLE_IMAGE, save=True) mask = result.semantic_maskprint(mask.data.shape) # (H, W) ids de classeprint(mask.classes) # ids de classe presentes na imagem, ordenadosfrom libreyolo import LibreYOLO, SAMPLE_IMAGE # O sufixo -seg no nome do arquivo seleciona a tarefa de instâncias,# então nenhum argumento de tarefa é necessário aqui.model = LibreYOLO("LibreEoMTl-seg.pt")result = model(SAMPLE_IMAGE, save=True) print(result.boxes.xyxy)print(result.masks.data.shape)from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreEoMTl-panoptic.pt")result = model(SAMPLE_IMAGE, save=True) pan = result.panopticprint(pan.data.shape) # (H, W) ids de segmentoprint(pan.segments_info) # [{"id": ..., "category_id": ...}, ...]libreyolo predict model=LibreEoMTl-sem.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=TrueA segmentação semântica preenche result.semantic_mask, um array (H, W) de
ids de classe em .data. A segmentação de instâncias preenche result.boxes e
result.masks, no mesmo formato que todas as outras famílias de segmentação
devolvem. A segmentação panóptica preenche result.panoptic: um mapa (H, W)
de ids de segmento em .data, mais .segments_info, uma lista de dicts
{"id", "category_id"}, um por segmento. conf filtra a seleção de queries;
iou não tem efeito na tarefa semântica, já que ela faz argmax por pixel, sem
etapa de NMS. Veja predição para fontes, streaming e
tratamento de resultados.
Variantes
Três tamanhos de encoder, s/b/l, todos baseados em DINOv2. O checkpoint semântico é treinado em ADE20K a 512 px; os checkpoints de instâncias e panóptico são treinados em COCO a 640 px, com um segundo checkpoint de instâncias treinado a 1280 px. O upstream publica pesos de segmentação de instâncias com DINOv2 apenas no tamanho l; s e b saem só para as tarefas semântica e panóptica. Variantes do EoMT baseadas em DINOv3 existem no upstream, mas não são distribuídas aqui, porque dependem de pesos DINOv3 restritos e não comerciais.
O LibreYOLO não treina o EoMT: train() levanta NotImplementedError para esta
família, que o nível de suporte acima marca como somente
inferência.
Validação
val() despacha por tarefa. A semântica devolve metrics/mIoU e
metrics/pixel_accuracy. A segmentação de instâncias devolve as mesmas chaves
de mAP de máscara e de box que as outras famílias de segmentação. A panóptica
devolve o Panoptic Quality como metrics/PQ, dividido em metrics/SQ
(qualidade de segmentação) e metrics/RQ (qualidade de reconhecimento), mais
metrics/PQ_things e metrics/PQ_stuff.
from libreyolo import LibreYOLO model = LibreYOLO("LibreEoMTl-sem.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mIoU"])print(metrics["metrics/pixel_accuracy"])from libreyolo import LibreYOLO model = LibreYOLO("LibreEoMTl-seg.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95(M)"]) # máscarasprint(metrics["metrics/mAP50-95(B)"]) # boxesfrom libreyolo import LibreYOLO model = LibreYOLO("LibreEoMTl-panoptic.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/PQ"])print(metrics["metrics/SQ"], metrics["metrics/RQ"])libreyolo val model=LibreEoMTl-sem.pt data=my-dataset.yamlExportação
| Tarefa | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| semantic | semantic to ONNX: compatível | semantic to TorchScript: compatível | semantic to ExecuTorch: incompatível | semantic to TensorRT: compatível | semantic to OpenVINO: compatível | semantic to Paddle: incompatível | semantic to MNN: incompatível | semantic to RKNN: incompatível | semantic to ncnn: incompatível | semantic to TFLite: incompatível | semantic to CoreML: incompatível | semantic to Core AI: incompatível |
| Instance segmentation | Instance segmentation to ONNX: incompatível | Instance segmentation to TorchScript: incompatível | Instance segmentation to ExecuTorch: incompatível | Instance segmentation to TensorRT: incompatível | Instance segmentation to OpenVINO: incompatível | Instance segmentation to Paddle: incompatível | Instance segmentation to MNN: incompatível | Instance segmentation to RKNN: incompatível | Instance segmentation to ncnn: incompatível | Instance segmentation to TFLite: incompatível | Instance segmentation to CoreML: incompatível | Instance segmentation to Core AI: incompatível |
| panoptic | panoptic to ONNX: incompatível | panoptic to TorchScript: incompatível | panoptic to ExecuTorch: incompatível | panoptic to TensorRT: incompatível | panoptic to OpenVINO: incompatível | panoptic to Paddle: incompatível | panoptic to MNN: incompatível | panoptic to RKNN: incompatível | panoptic to ncnn: incompatível | panoptic to TFLite: incompatível | panoptic to CoreML: incompatível | panoptic to Core AI: incompatível |
Hoje só a tarefa semântica exporta: a segmentação de instâncias e a panóptica
chamam export() e recebem NotImplementedError, porque a saída de máscaras
por query ainda não tem um contrato de exportação de runtime. Um artefato
semântico exportado é carregado de volta por LibreYOLO() pelo sufixo do
arquivo, então um arquivo .onnx ou .engine se comporta como um checkpoint e
devolve o mesmo Results.
from libreyolo import LibreYOLO model = LibreYOLO("LibreEoMTl-sem.pt")model.export(format="onnx")model.export(format="tensorrt", half=True)libreyolo export model=LibreEoMTl-sem.pt format=onnxlibreyolo export model=LibreEoMTl-sem.pt format=tensorrt half=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # A factory roteia pelo sufixo do arquivo, então um artefato exportado# carrega como qualquer checkpoint e devolve o mesmo objeto Results.model = LibreYOLO("LibreEoMTl-sem.onnx")result = model(SAMPLE_IMAGE) print(result.semantic_mask.data.shape)Checkpoints
Todos os arquivos de pesos publicados desta família.
| Arquivo | Entrada (px) | Licença dos pesos |
|---|---|---|
| semantic | ||
| LibreEoMTl-sem.pt | 512 | mit |
| Instance segmentation | ||
| LibreEoMTl-seg.pt | 640 | mit |
| LibreEoMTl-seg-1280.pt | mit | |
| panoptic | ||
| LibreEoMTs-panoptic.pt | mit | |
| LibreEoMTb-panoptic.pt | mit | |
| LibreEoMTl-panoptic.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
- EoMT, TU Eindhoven, Mobile Perception Systems Lab
- Licença original
- MIT
- Código-fonte original
- github.com/tue-mps/eomt
- Código do LibreYOLO
- MIT
- Pesos
- MIT, republicado em huggingface.co/LibreYOLO
- Interpretação
- MIT is a permissive license, so this code and these weights can be used in commercial and closed-source products. It asks only that you keep the copyright and license notice with any copy you redistribute. LibreYOLO ships only the DINOv2-backed EoMT checkpoints, sizes s/b/l; the DINOv3 EoMT variants are excluded because they depend on gated non-commercial DINOv3 weights. DINOv2 itself is Apache-2.0. The semantic checkpoint is trained on ADE20K and the instance and panoptic checkpoints on COCO; both are research datasets, and users remain responsible for dataset-license compliance when validating or fine-tuning against them.
Citação
@inproceedings{kerssies2025eomt,
author = {Kerssies, Tommie and Cavagnero, Niccol\`{o} and Hermans, Alexander and Norouzi, Narges and Averta, Giuseppe and Leibe, Bastian and Dubbelman, Gijs and {de Geus}, Daan},
title = {{Your ViT is Secretly an Image Segmentation Model}},
booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
year = {2025},
}Copiado do bloco de citação dos autores em github.com/tue-mps/eomt#bibtex-citation.