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.
Upstream
EoMT by TU Eindhoven, Mobile Perception Systems Lab, MIT. Paper, source
Licenses
Code MIT, weights MIT. Commercial use

Install

EoMT needs no optional extra. Everything it imports is in the base install.

bash
pip install libreyolo

Predict

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.

Semantic
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 image
Instance segmentation
from 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)
Panoptic
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": ...}, ...]
CLI
libreyolo predict model=LibreEoMTl-sem.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True

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

Semantic
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"])
Instance segmentation
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)"])   # boxes
Panoptic
from 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"])
CLI
libreyolo val model=LibreEoMTl-sem.pt data=my-dataset.yaml

Export

TaskONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
semanticsemantic to ONNX: supported. semantic to TorchScript: supported. semantic to ExecuTorch: not supportedsemantic to TensorRT: supported. semantic to OpenVINO: supported. semantic to Paddle: not supportedsemantic to MNN: not supportedsemantic to RKNN: not supportedsemantic to ncnn: not supportedsemantic to TFLite: not supportedsemantic to CoreML: not supportedsemantic to Core AI: not supported
Instance segmentationInstance segmentation to ONNX: not supportedInstance segmentation to TorchScript: not supportedInstance segmentation to ExecuTorch: not supportedInstance segmentation to TensorRT: not supportedInstance segmentation to OpenVINO: not supportedInstance segmentation to Paddle: not supportedInstance segmentation to MNN: not supportedInstance segmentation to RKNN: not supportedInstance segmentation to ncnn: not supportedInstance segmentation to TFLite: not supportedInstance segmentation to CoreML: not supportedInstance segmentation to Core AI: not supported
panopticpanoptic to ONNX: not supportedpanoptic to TorchScript: not supportedpanoptic to ExecuTorch: not supportedpanoptic to TensorRT: not supportedpanoptic to OpenVINO: not supportedpanoptic to Paddle: not supportedpanoptic to MNN: not supportedpanoptic to RKNN: not supportedpanoptic to ncnn: not supportedpanoptic to TFLite: not supportedpanoptic to CoreML: not supportedpanoptic 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.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreEoMTl-sem.pt")model.export(format="onnx")model.export(format="tensorrt", half=True)
CLI
libreyolo export model=LibreEoMTl-sem.pt format=onnxlibreyolo export model=LibreEoMTl-sem.pt format=tensorrt half=True
Use the exported file
from 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.

FileInput (px)Weights license
semantic
LibreEoMTl-sem.pt512mit
Instance segmentation
LibreEoMTl-seg.pt640mit
LibreEoMTl-seg-1280.ptmit
panoptic
LibreEoMTs-panoptic.ptmit
LibreEoMTb-panoptic.ptmit
LibreEoMTl-panoptic.ptmit

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

Verified against LibreYOLO v1.5.0. Support tables, checkpoints and benchmark numbers on this page are generated from the released library and the published weights, not written by hand.