EoMT
A segmentation network built on a plain vision transformer with no dedicated pixel decoder: extra learned queries added to the encoder itself predict the masks. LibreYOLO supports it for semantic, instance and panoptic segmentation.
- Tasks
- semantic, instance segmentation, panoptic
- Sizes
- s, b, l at 512 px
- Install
pip install libreyolo- Support tier
- Inference only, since v. Predict, validate and export only. Training features do not apply.
- Licenses
- Code MIT, weights MIT. Commercial use
Install
EoMT needs no optional extra. Everything it imports is in the base install.
pip install libreyoloPredict
Weights download from Hugging Face on first use and are cached locally. The
task suffix in the filename (-sem, -seg, -panoptic) selects the task, and
LibreYOLO() infers it from that filename so no task= argument is needed.
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) class idsprint(mask.classes) # sorted class ids present in the imagefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # The -seg suffix in the filename selects the instance task, so no# task argument is needed here.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) segment idsprint(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=TrueSemantic segmentation fills result.semantic_mask, a (H, W) array of
class ids on .data. Instance segmentation fills result.boxes and
result.masks, the same shape every other segmentation family returns.
Panoptic segmentation fills result.panoptic: a (H, W) segment-id map on
.data, plus .segments_info, a list of {"id", "category_id"} dicts, one
per segment. conf filters query selection; iou has no effect on the
semantic task, since it argmaxes per pixel with no NMS step. See
prediction for sources, streaming and result handling.
Variants
Three encoder sizes, s/b/l, all DINOv2-backed. The semantic checkpoint is trained on ADE20K at 512 px; the instance and panoptic checkpoints are trained on COCO at 640 px, with a second instance checkpoint trained at 1280 px. Upstream ships DINOv2 instance-segmentation weights only at size l; s and b are published for semantic and panoptic only. DINOv3-backed EoMT variants exist upstream but are not shipped here, because they depend on gated non-commercial DINOv3 weights.
LibreYOLO does not train EoMT: train() raises NotImplementedError for this
family, which the support tier above marks as inference only.
Validate
val() dispatches by task. Semantic returns metrics/mIoU and
metrics/pixel_accuracy. Instance segmentation returns the same mask and box
mAP keys as other segmentation families. Panoptic returns Panoptic Quality as
metrics/PQ, split into metrics/SQ (segmentation quality) and metrics/RQ
(recognition quality), plus metrics/PQ_things and 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)"]) # masksprint(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.yamlExport
| Task | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| semantic | semantic to ONNX: supported. | semantic to TorchScript: supported. | semantic to ExecuTorch: not supported | semantic to TensorRT: supported. | semantic to OpenVINO: supported. | semantic to Paddle: not supported | semantic to MNN: not supported | semantic to RKNN: not supported | semantic to ncnn: not supported | semantic to TFLite: not supported | semantic to CoreML: not supported | semantic to Core AI: not supported |
| Instance segmentation | Instance segmentation to ONNX: not supported | Instance segmentation to TorchScript: not supported | Instance segmentation to ExecuTorch: not supported | Instance segmentation to TensorRT: not supported | Instance segmentation to OpenVINO: not supported | Instance segmentation to Paddle: not supported | Instance segmentation to MNN: not supported | Instance segmentation to RKNN: not supported | Instance segmentation to ncnn: not supported | Instance segmentation to TFLite: not supported | Instance segmentation to CoreML: not supported | Instance segmentation to Core AI: not supported |
| panoptic | panoptic to ONNX: not supported | panoptic to TorchScript: not supported | panoptic to ExecuTorch: not supported | panoptic to TensorRT: not supported | panoptic to OpenVINO: not supported | panoptic to Paddle: not supported | panoptic to MNN: not supported | panoptic to RKNN: not supported | panoptic to ncnn: not supported | panoptic to TFLite: not supported | panoptic to CoreML: not supported | panoptic to Core AI: not supported |
Only the semantic task exports today: instance and panoptic segmentation call
export() and get NotImplementedError, because their query-mask output has
no runtime export contract yet. An exported semantic artifact loads back
through LibreYOLO() on its file suffix, so a .onnx or .engine file
behaves like a checkpoint and returns the same 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 # The factory routes on the file suffix, so an exported artifact loads# like any checkpoint and returns the same Results object.model = LibreYOLO("LibreEoMTl-sem.onnx")result = model(SAMPLE_IMAGE) print(result.semantic_mask.data.shape)Checkpoints
Every published weight file for this family.
| File | Input (px) | Weights license |
|---|---|---|
| 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 | |
Every file above exists in the LibreYOLO org today and downloads on first use.
Licensing
Check the license on the Hugging Face repository of the specific weights you download. Every checkpoint in the LibreYOLO org carries one, and they are not always the same across a family. That repository is the authoritative source; the summary below describes what applied when this page was last verified.
This is a description of the licenses involved, not legal advice. If the answer matters commercially, read the licenses yourself and take your own counsel.
- Original work
- EoMT, TU Eindhoven, Mobile Perception Systems Lab
- Upstream license
- MIT
- Upstream source
- github.com/tue-mps/eomt
- LibreYOLO code
- MIT
- Weights
- MIT, republished at huggingface.co/LibreYOLO
- Interpretation
- 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.
Citation
@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},
}Copied from the authors' citation block at github.com/tue-mps/eomt#bibtex-citation.