EoMT
Sieć segmentacji oparta na prostym transformerze wizyjnym bez dedykowanego dekodera pikseli: dodatkowe wyuczone zapytania dodane do samego enkodera przewidują maski. LibreYOLO obsługuje ją do segmentacji semantycznej, instancji i panoptycznej.
- Zadania
- semantic, instance segmentation, panoptic
- Rozmiary
- s, b, l at 512 px
- Instalacja
pip install libreyolo- Poziom obsługi
- Tylko inferencja, od wersji v. Tylko predykcja, walidacja i eksport. Funkcje trenowania nie mają zastosowania.
- Projekt źródłowy
- EoMT, autorzy: TU Eindhoven, Mobile Perception Systems Lab, licencja: MIT. Publikacja, kod źródłowy
- Licencje
- Kod: MIT, wagi: MIT. Użycie komercyjne
Instalacja
EoMT nie wymaga żadnego opcjonalnego dodatku. Wszystkie importowane elementy znajdują się w instalacji podstawowej.
pip install libreyoloPredykcja
Przy pierwszym użyciu wagi są pobierane z Hugging Face i zapisywane w lokalnej
pamięci podręcznej. Sufiks zadania w nazwie pliku (-sem, -seg, -panoptic)
wybiera zadanie, a LibreYOLO() wnioskuje je z tej nazwy, więc argument task=
nie jest potrzebny.
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), identyfikatory klasprint(mask.classes) # posortowane identyfikatory klas obecnych na obraziefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # Sufiks -seg w nazwie pliku wybiera zadanie segmentacji instancji,# dlatego nie trzeba podawać argumentu zadania.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), identyfikatory segmentówprint(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=TrueSegmentacja semantyczna wypełnia result.semantic_mask, czyli tablicę
identyfikatorów klas (H, W) w polu .data. Segmentacja instancji wypełnia
result.boxes i result.masks o takim samym kształcie, jaki zwracają inne
rodziny segmentacji. Segmentacja panoptyczna wypełnia result.panoptic: mapę
identyfikatorów segmentów (H, W) w polu .data oraz .segments_info, listę
słowników {"id", "category_id"}, po jednym na segment. Argument conf
filtruje wybór zapytań. iou nie ma wpływu na zadanie semantyczne, ponieważ
wybiera ono argmax dla każdego piksela bez etapu NMS. Więcej informacji o
źródłach, streamingu i obsłudze wyników zawiera strona
predykcji.
Warianty
Dostępne są trzy rozmiary enkodera, s/b/l, wszystkie z backbone DINOv2. Checkpoint semantyczny wytrenowano na ADE20K przy 512 px, a checkpointy instancji i panoptyczny na COCO przy 640 px. Drugi checkpoint instancji wytrenowano przy 1280 px. Projekt źródłowy publikuje wagi segmentacji instancji z DINOv2 tylko w rozmiarze l. Rozmiary s i b są dostępne wyłącznie dla segmentacji semantycznej i panoptycznej. Warianty EoMT z backbone DINOv3 istnieją w projekcie źródłowym, ale nie są tu udostępniane, ponieważ zależą od kontrolowanych, niekomercyjnych wag DINOv3.
LibreYOLO nie trenuje EoMT: train() zgłasza NotImplementedError dla tej
rodziny, którą powyższy poziom obsługi oznacza jako przeznaczoną
wyłącznie do inferencji.
Walidacja
val() wybiera ścieżkę według zadania. Segmentacja semantyczna zwraca
metrics/mIoU i metrics/pixel_accuracy. Segmentacja instancji zwraca te same
klucze mAP masek i ramek co inne rodziny segmentacji. Segmentacja panoptyczna
zwraca Panoptic Quality jako metrics/PQ, podzielone na metrics/SQ (jakość
segmentacji) i metrics/RQ (jakość rozpoznawania), a także metrics/PQ_things
i 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)"]) # maskiprint(metrics["metrics/mAP50-95(B)"]) # ramkifrom 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.yamlEksport
| Zadanie | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| semantic | semantic to ONNX: obsługiwane | semantic to TorchScript: obsługiwane | semantic to ExecuTorch: brak obsługi | semantic to TensorRT: obsługiwane | semantic to OpenVINO: obsługiwane | semantic to Paddle: brak obsługi | semantic to MNN: brak obsługi | semantic to RKNN: brak obsługi | semantic to ncnn: brak obsługi | semantic to TFLite: brak obsługi | semantic to CoreML: brak obsługi | semantic to Core AI: brak obsługi |
| Instance segmentation | Instance segmentation to ONNX: brak obsługi | Instance segmentation to TorchScript: brak obsługi | Instance segmentation to ExecuTorch: brak obsługi | Instance segmentation to TensorRT: brak obsługi | Instance segmentation to OpenVINO: brak obsługi | Instance segmentation to Paddle: brak obsługi | Instance segmentation to MNN: brak obsługi | Instance segmentation to RKNN: brak obsługi | Instance segmentation to ncnn: brak obsługi | Instance segmentation to TFLite: brak obsługi | Instance segmentation to CoreML: brak obsługi | Instance segmentation to Core AI: brak obsługi |
| panoptic | panoptic to ONNX: brak obsługi | panoptic to TorchScript: brak obsługi | panoptic to ExecuTorch: brak obsługi | panoptic to TensorRT: brak obsługi | panoptic to OpenVINO: brak obsługi | panoptic to Paddle: brak obsługi | panoptic to MNN: brak obsługi | panoptic to RKNN: brak obsługi | panoptic to ncnn: brak obsługi | panoptic to TFLite: brak obsługi | panoptic to CoreML: brak obsługi | panoptic to Core AI: brak obsługi |
Obecnie eksportowane jest tylko zadanie semantyczne. Wywołanie export() dla
segmentacji instancji lub panoptycznej zgłasza NotImplementedError, ponieważ
ich wyjście zapytań i masek nie ma jeszcze kontraktu eksportu środowiska
uruchomieniowego. Wyeksportowany artefakt semantyczny jest ponownie ładowany
przez LibreYOLO() na podstawie rozszerzenia pliku, więc plik .onnx lub
.engine zachowuje się jak checkpoint i zwraca ten sam obiekt 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 # Fabryka wybiera ścieżkę na podstawie rozszerzenia pliku, więc wyeksportowany artefakt# ładuje się jak każdy checkpoint i zwraca ten sam obiekt Results.model = LibreYOLO("LibreEoMTl-sem.onnx")result = model(SAMPLE_IMAGE) print(result.semantic_mask.data.shape)Checkpointy
Wszystkie opublikowane pliki wag dla tej rodziny.
| Plik | Wejście (px) | Licencja wag |
|---|---|---|
| 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 | |
Każdy z powyższych plików jest obecnie dostępny w organizacji LibreYOLO i pobierany przy pierwszym użyciu.
Licencja
Sprawdź licencję w repozytorium konkretnych pobieranych wag na Hugging Face. Każdy checkpoint w organizacji LibreYOLO ma licencję, która nie zawsze jest taka sama w całej rodzinie. To repozytorium jest źródłem rozstrzygającym, a poniższe podsumowanie opisuje stan z chwili ostatniej weryfikacji tej strony.
To opis obowiązujących licencji, a nie porada prawna. Jeśli odpowiedź ma znaczenie komercyjne, przeczytaj licencje i zasięgnij własnej porady prawnej.
- Oryginalna praca
- EoMT, TU Eindhoven, Mobile Perception Systems Lab
- Licencja projektu źródłowego
- MIT
- Kod źródłowy projektu
- github.com/tue-mps/eomt
- Kod LibreYOLO
- MIT
- Wagi
- MIT, ponownie opublikowane w huggingface.co/LibreYOLO
- Interpretacja
- 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.
Cytowanie
@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},
}Skopiowano z bloku cytowania autorów w github.com/tue-mps/eomt#bibtex-citation.