EoMT

Un réseau de segmentation bâti sur un vision transformer standard, sans pixel decoder dédié : ce sont des queries apprises ajoutées à l'encodeur lui-même qui prédisent les masques. LibreYOLO le prend en charge pour la segmentation sémantique, d'instances et panoptique.

Tâches
semantic, instance segmentation, panoptic
Tailles
s, b, l at 512 px
Installer
pip install libreyolo
Niveau de support
Inférence uniquement, depuis v. Prédiction, validation et export uniquement. Les fonctionnalités d'entraînement ne s'appliquent pas.
Origine
EoMT par TU Eindhoven, Mobile Perception Systems Lab, MIT. Article, source
Licences
Code MIT, poids MIT. Usage commercial

Installation

EoMT ne demande aucun extra optionnel. Tout ce qu'il importe fait partie de l'installation de base.

bash
pip install libreyolo

Prédire

Les poids sont téléchargés depuis Hugging Face au premier usage, puis mis en cache localement. Le suffixe de tâche dans le nom de fichier (-sem, -seg, -panoptic) sélectionne la tâche, et LibreYOLO() la déduit de ce nom de fichier, donc aucun argument task= n'est nécessaire.

Sémantique
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 présents dans l'image, triés
Segmentation d'instances
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Le suffixe -seg dans le nom de fichier sélectionne la tâche instance,# donc aucun argument task n'est nécessaire ici.model = LibreYOLO("LibreEoMTl-seg.pt")result = model(SAMPLE_IMAGE, save=True) print(result.boxes.xyxy)print(result.masks.data.shape)
Panoptique
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 segmentprint(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

La segmentation sémantique remplit result.semantic_mask, un tableau (H, W) d'ids de classe sur .data. La segmentation d'instances remplit result.boxes et result.masks, la même forme que renvoie toute autre famille de segmentation. La segmentation panoptique remplit result.panoptic : une carte d'ids de segment (H, W) sur .data, plus .segments_info, une liste de dicts {"id", "category_id"}, un par segment. conf filtre la sélection des queries ; iou n'a aucun effet sur la tâche sémantique, puisqu'elle fait un argmax par pixel sans étape de NMS. Voir la prédiction pour les sources, le streaming et le traitement des résultats.

Variantes

Trois tailles d'encodeur, s/b/l, toutes adossées à DINOv2. Le checkpoint sémantique est entraîné sur ADE20K en 512 px ; les checkpoints instance et panoptique sont entraînés sur COCO en 640 px, avec un second checkpoint instance entraîné en 1280 px. En amont, les poids de segmentation d'instances DINOv2 ne sont fournis qu'en taille l ; s et b ne sont publiés que pour le sémantique et le panoptique. Des variantes d'EoMT adossées à DINOv3 existent en amont mais ne sont pas fournies ici, car elles dépendent de poids DINOv3 non commerciaux à accès restreint.

LibreYOLO n'entraîne pas EoMT : train() lève NotImplementedError pour cette famille, ce que le niveau de support ci-dessus signale comme inférence seule.

Valider

val() aiguille selon la tâche. Le sémantique renvoie metrics/mIoU et metrics/pixel_accuracy. La segmentation d'instances renvoie les mêmes clés de mAP masques et boîtes que les autres familles de segmentation. Le panoptique renvoie la Panoptic Quality sous metrics/PQ, décomposée en metrics/SQ (qualité de segmentation) et metrics/RQ (qualité de reconnaissance), plus metrics/PQ_things et metrics/PQ_stuff.

Sémantique
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"])
Segmentation d'instances
from libreyolo import LibreYOLO model = LibreYOLO("LibreEoMTl-seg.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95(M)"])   # masquesprint(metrics["metrics/mAP50-95(B)"])   # boîtes
Panoptique
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

Exporter

TâcheONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
semanticsemantic to ONNX : pris en chargesemantic to TorchScript : pris en chargesemantic to ExecuTorch : non pris en chargesemantic to TensorRT : pris en chargesemantic to OpenVINO : pris en chargesemantic to Paddle : non pris en chargesemantic to MNN : non pris en chargesemantic to RKNN : non pris en chargesemantic to ncnn : non pris en chargesemantic to TFLite : non pris en chargesemantic to CoreML : non pris en chargesemantic to Core AI : non pris en charge
Instance segmentationInstance segmentation to ONNX : non pris en chargeInstance segmentation to TorchScript : non pris en chargeInstance segmentation to ExecuTorch : non pris en chargeInstance segmentation to TensorRT : non pris en chargeInstance segmentation to OpenVINO : non pris en chargeInstance segmentation to Paddle : non pris en chargeInstance segmentation to MNN : non pris en chargeInstance segmentation to RKNN : non pris en chargeInstance segmentation to ncnn : non pris en chargeInstance segmentation to TFLite : non pris en chargeInstance segmentation to CoreML : non pris en chargeInstance segmentation to Core AI : non pris en charge
panopticpanoptic to ONNX : non pris en chargepanoptic to TorchScript : non pris en chargepanoptic to ExecuTorch : non pris en chargepanoptic to TensorRT : non pris en chargepanoptic to OpenVINO : non pris en chargepanoptic to Paddle : non pris en chargepanoptic to MNN : non pris en chargepanoptic to RKNN : non pris en chargepanoptic to ncnn : non pris en chargepanoptic to TFLite : non pris en chargepanoptic to CoreML : non pris en chargepanoptic to Core AI : non pris en charge

Seule la tâche sémantique s'exporte aujourd'hui : la segmentation d'instances et la segmentation panoptique appellent export() et obtiennent NotImplementedError, parce que leur sortie de masques par query n'a pas encore de contrat d'export runtime. Un artefact sémantique exporté se recharge via LibreYOLO() selon son extension de fichier, si bien qu'un fichier .onnx ou .engine se comporte comme un checkpoint et renvoie le même 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
Utiliser le fichier exporté
from libreyolo import LibreYOLO, SAMPLE_IMAGE # La factory s'appuie sur l'extension du fichier, donc un artefact# exporté se charge comme un checkpoint et renvoie le même Results.model = LibreYOLO("LibreEoMTl-sem.onnx")result = model(SAMPLE_IMAGE) print(result.semantic_mask.data.shape)

Checkpoints

Tous les fichiers de poids publiés de cette famille.

FichierEntrée (px)Licence des poids
semantic
LibreEoMTl-sem.pt512mit
Instance segmentation
LibreEoMTl-seg.pt640mit
LibreEoMTl-seg-1280.ptmit
panoptic
LibreEoMTs-panoptic.ptmit
LibreEoMTb-panoptic.ptmit
LibreEoMTl-panoptic.ptmit

Tous les fichiers ci-dessus sont actuellement disponibles dans l<link>organisation LibreYOLO</link> et sont téléchargés à la première utilisation.

Licence

Vérifiez la licence dans le dépôt Hugging Face des poids précis que vous téléchargez. Chaque checkpoint de l<link>organisation LibreYOLO</link> en possède une, et elles ne sont pas toujours identiques au sein dune même famille. Ce dépôt fait autorité ; le résumé ci-dessous décrit les conditions applicables lors de la dernière vérification de cette page.

Ceci décrit les licences concernées et ne constitue pas un conseil juridique. Si la réponse a une importance commerciale, lisez vous-même les licences et consultez votre propre avocat.

Travail d'origine
EoMT, TU Eindhoven, Mobile Perception Systems Lab
Licence du projet d'origine
MIT
Source du projet d'origine
github.com/tue-mps/eomt
Code de LibreYOLO
MIT
Poids
MIT, republiés sur huggingface.co/LibreYOLO
Interprétation
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},
}

Copié depuis le bloc de citation des auteurs sur github.com/tue-mps/eomt#bibtex-citation.

Vérifié avec LibreYOLO v1.5.0. Les tableaux de support, les checkpoints et les chiffres de benchmark de cette page sont générés à partir de la bibliothèque publiée et des poids publiés, et non rédigés à la main.