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.
Proyecto original
EoMT de TU Eindhoven, Mobile Perception Systems Lab, MIT. Artículo, fuente
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.

bash
pip install libreyolo

Predicció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=.

Semántica
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, ordenados
Segmentación de instancias
from 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)
Panóptica
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": ...}, ...]
CLI
libreyolo predict model=LibreEoMTl-sem.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True

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

Semántica
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"])
Segmentación de instancias
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 boxes
Panóptica
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

Exportación

TareaONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
semanticsemantic to ONNX: compatiblesemantic to TorchScript: compatiblesemantic to ExecuTorch: no compatiblesemantic to TensorRT: compatiblesemantic to OpenVINO: compatiblesemantic to Paddle: no compatiblesemantic to MNN: no compatiblesemantic to RKNN: no compatiblesemantic to ncnn: no compatiblesemantic to TFLite: no compatiblesemantic to CoreML: no compatiblesemantic to Core AI: no compatible
Instance segmentationInstance segmentation to ONNX: no compatibleInstance segmentation to TorchScript: no compatibleInstance segmentation to ExecuTorch: no compatibleInstance segmentation to TensorRT: no compatibleInstance segmentation to OpenVINO: no compatibleInstance segmentation to Paddle: no compatibleInstance segmentation to MNN: no compatibleInstance segmentation to RKNN: no compatibleInstance segmentation to ncnn: no compatibleInstance segmentation to TFLite: no compatibleInstance segmentation to CoreML: no compatibleInstance segmentation to Core AI: no compatible
panopticpanoptic to ONNX: no compatiblepanoptic to TorchScript: no compatiblepanoptic to ExecuTorch: no compatiblepanoptic to TensorRT: no compatiblepanoptic to OpenVINO: no compatiblepanoptic to Paddle: no compatiblepanoptic to MNN: no compatiblepanoptic to RKNN: no compatiblepanoptic to ncnn: no compatiblepanoptic to TFLite: no compatiblepanoptic to CoreML: no compatiblepanoptic 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.

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
Usar el archivo exportado
from 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.

ArchivoEntrada (px)Licencia de los pesos
semantic
LibreEoMTl-sem.pt512mit
Instance segmentation
LibreEoMTl-seg.pt640mit
LibreEoMTl-seg-1280.ptmit
panoptic
LibreEoMTs-panoptic.ptmit
LibreEoMTb-panoptic.ptmit
LibreEoMTl-panoptic.ptmit

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.

Verificado con LibreYOLO v1.5.0. Las tablas de compatibilidad, los checkpoints y las cifras de rendimiento de esta página se generan a partir de la biblioteca publicada y los pesos publicados; no se escriben a mano.