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.
- 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.
pip install libreyoloPré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.
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ésfrom 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)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": ...}, ...]libreyolo predict model=LibreEoMTl-sem.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=TrueLa 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.
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)"]) # masquesprint(metrics["metrics/mAP50-95(B)"]) # boîtesfrom 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.yamlExporter
| Tâche | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| semantic | semantic to ONNX : pris en charge | semantic to TorchScript : pris en charge | semantic to ExecuTorch : non pris en charge | semantic to TensorRT : pris en charge | semantic to OpenVINO : pris en charge | semantic to Paddle : non pris en charge | semantic to MNN : non pris en charge | semantic to RKNN : non pris en charge | semantic to ncnn : non pris en charge | semantic to TFLite : non pris en charge | semantic to CoreML : non pris en charge | semantic to Core AI : non pris en charge |
| Instance segmentation | Instance segmentation to ONNX : non pris en charge | Instance segmentation to TorchScript : non pris en charge | Instance segmentation to ExecuTorch : non pris en charge | Instance segmentation to TensorRT : non pris en charge | Instance segmentation to OpenVINO : non pris en charge | Instance segmentation to Paddle : non pris en charge | Instance segmentation to MNN : non pris en charge | Instance segmentation to RKNN : non pris en charge | Instance segmentation to ncnn : non pris en charge | Instance segmentation to TFLite : non pris en charge | Instance segmentation to CoreML : non pris en charge | Instance segmentation to Core AI : non pris en charge |
| panoptic | panoptic to ONNX : non pris en charge | panoptic to TorchScript : non pris en charge | panoptic to ExecuTorch : non pris en charge | panoptic to TensorRT : non pris en charge | panoptic to OpenVINO : non pris en charge | panoptic to Paddle : non pris en charge | panoptic to MNN : non pris en charge | panoptic to RKNN : non pris en charge | panoptic to ncnn : non pris en charge | panoptic to TFLite : non pris en charge | panoptic to CoreML : non pris en charge | panoptic 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.
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 # 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.
| Fichier | Entrée (px) | Licence des poids |
|---|---|---|
| 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 | |
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.