EoMT
Una red de segmentación construida sobre un vision transformer puro sin decoder de píxeles dedicado: unas queries aprendidas extra añadidas al propio encoder predicen las máscaras. LibreYOLO la soporta para segmentación semántica, de instancias y panóptica.
- Tareas
- semantic, instance segmentation, panoptic
- Tamaños
- s, b, l at 512 px
- Instalación
pip install libreyolo- Nivel de compatibilidad
- Solo inferencia, desde v. Solo permite predecir, validar y exportar. Las funciones de entrenamiento no se aplican.
- Licencias
- Código MIT, pesos MIT. Uso comercial
Instalación
EoMT no necesita ningún extra opcional. Todo lo que importa está en la instalación base.
pip install libreyoloPredicción
Los pesos se descargan de Hugging Face en el primer uso y se guardan en la caché
local. El sufijo de tarea del nombre del archivo (-sem, -seg, -panoptic)
selecciona la tarea, y LibreYOLO() la deduce de ese nombre, así que no hace
falta ningún argumento task=.
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 claseprint(mask.classes) # ids de clase presentes en la imagen, ordenadosfrom libreyolo import LibreYOLO, SAMPLE_IMAGE # El sufijo -seg del nombre del archivo selecciona la tarea de# instancias, así que aquí no hace falta ningún argumento task.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=TrueLa segmentación semántica rellena result.semantic_mask, un array (H, W) de
ids de clase en .data. La segmentación de instancias rellena result.boxes y
result.masks, con la misma forma que devuelve cualquier otra familia de
segmentación. La segmentación panóptica rellena result.panoptic: un mapa de
ids de segmento (H, W) en .data, más .segments_info, una lista de dicts
{"id", "category_id"}, uno por segmento. conf filtra la selección de
queries; iou no tiene ningún efecto en la tarea semántica, porque hace argmax
por píxel sin paso de NMS. Consulta predicción para fuentes,
streaming y manejo de resultados.
Variantes
Tres tamaños de encoder, s/b/l, todos basados en DINOv2. El checkpoint semántico está entrenado en ADE20K a 512 px; los checkpoints de instancias y panóptico están entrenados en COCO a 640 px, con un segundo checkpoint de instancias entrenado a 1280 px. Upstream solo publica pesos de segmentación de instancias con DINOv2 en el tamaño l; s y b se publican únicamente para semántica y panóptica. Existen variantes de EoMT basadas en DINOv3 en upstream, pero no se distribuyen aquí, porque dependen de pesos DINOv3 restringidos y no comerciales.
LibreYOLO no entrena EoMT: train() lanza NotImplementedError para esta
familia, algo que el nivel de soporte de arriba marca como solo
inferencia.
Validación
val() despacha según la tarea. La semántica devuelve metrics/mIoU y
metrics/pixel_accuracy. La segmentación de instancias devuelve las mismas
claves de mAP de máscaras y bounding boxes que las demás familias de
segmentación. La panóptica devuelve la Panoptic Quality como metrics/PQ,
dividida en metrics/SQ (calidad de segmentación) y metrics/RQ (calidad de
reconocimiento), más metrics/PQ_things y 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)"]) # bounding 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.yamlExportación
| Tarea | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| semantic | semantic to ONNX: compatible | semantic to TorchScript: compatible | semantic to ExecuTorch: no compatible | semantic to TensorRT: compatible | semantic to OpenVINO: compatible | semantic to Paddle: no compatible | semantic to MNN: no compatible | semantic to RKNN: no compatible | semantic to ncnn: no compatible | semantic to TFLite: no compatible | semantic to CoreML: no compatible | semantic to Core AI: no compatible |
| Instance segmentation | Instance segmentation to ONNX: no compatible | Instance segmentation to TorchScript: no compatible | Instance segmentation to ExecuTorch: no compatible | Instance segmentation to TensorRT: no compatible | Instance segmentation to OpenVINO: no compatible | Instance segmentation to Paddle: no compatible | Instance segmentation to MNN: no compatible | Instance segmentation to RKNN: no compatible | Instance segmentation to ncnn: no compatible | Instance segmentation to TFLite: no compatible | Instance segmentation to CoreML: no compatible | Instance segmentation to Core AI: no compatible |
| panoptic | panoptic to ONNX: no compatible | panoptic to TorchScript: no compatible | panoptic to ExecuTorch: no compatible | panoptic to TensorRT: no compatible | panoptic to OpenVINO: no compatible | panoptic to Paddle: no compatible | panoptic to MNN: no compatible | panoptic to RKNN: no compatible | panoptic to ncnn: no compatible | panoptic to TFLite: no compatible | panoptic to CoreML: no compatible | panoptic to Core AI: no compatible |
Hoy por hoy solo se exporta la tarea semántica: la segmentación de instancias y
la panóptica llaman a export() y reciben NotImplementedError, porque su
salida de máscaras por query todavía no tiene un contrato de exportación en
runtime. Un artefacto semántico exportado se vuelve a cargar con LibreYOLO()
según su extensión de archivo, así que un archivo .onnx o .engine se comporta
como un checkpoint y devuelve el mismo 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 factoría enruta según la extensión del archivo, así que un artefacto# exportado se carga como cualquier checkpoint y devuelve el mismo objeto# Results.model = LibreYOLO("LibreEoMTl-sem.onnx")result = model(SAMPLE_IMAGE) print(result.semantic_mask.data.shape)Checkpoints
Todos los archivos de pesos publicados de esta familia.
| Archivo | Entrada (px) | Licencia de los 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 los archivos anteriores existen hoy en la organización de LibreYOLO y se descargan la primera vez que se usan.
Licencia
Comprueba la licencia en el repositorio de Hugging Face de los pesos concretos que descargues. Cada checkpoint de la organización de LibreYOLO incluye una, y no siempre es la misma en toda una familia. Ese repositorio es la fuente autorizada; el resumen siguiente describe qué se aplicaba cuando se verificó esta página por última vez.
Esta es una descripción de las licencias implicadas, no asesoramiento legal. Si la respuesta es importante a nivel comercial, lee las licencias y busca tu propio asesoramiento.
- Trabajo original
- EoMT, TU Eindhoven, Mobile Perception Systems Lab
- Licencia del proyecto original
- MIT
- Fuente del proyecto original
- github.com/tue-mps/eomt
- Código de LibreYOLO
- MIT
- Pesos
- MIT, republicados en huggingface.co/LibreYOLO
- Interpretación
- 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
@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 del bloque de cita de los autores en github.com/tue-mps/eomt#bibtex-citation.