SegFormer
SegFormer to transformer do segmentacji semantycznej, który łączy hierarchiczny enkoder Mix Transformer (MiT) z lekkim dekoderem opartym wyłącznie na MLP, unikając ciężkich dekoderów i stałych kodowań pozycyjnych potrzebnych we wcześniejszych transformerach do segmentacji. LibreYOLO obsługuje go w jednym zadaniu, segmentacji semantycznej, w sześciu rozmiarach.
- Zadania
- semantic
- Rozmiary
- Instalacja
pip install libreyolo- Poziom obsługi
- Obsługiwany, od wersji v. Dodatkowe trenowalne modele: testy CI pozostają zielone, a funkcje są dodawane w miarę możliwości.
- Projekt źródłowy
- SegFormer, autorzy: NVIDIA, licencja: NVIDIA Source Code License (non-commercial, research or evaluation only). Publikacja, kod źródłowy
- Licencje
- Kod: Apache-2.0, wagi: NVIDIA Source Code License (non-commercial, research or evaluation only). Użycie komercyjne
Instalacja
SegFormer nie wymaga opcjonalnych dodatków. Wszystkie importowane przez niego 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.
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreSegformerb0-sem.pt")result = model(SAMPLE_IMAGE, save=True) mask = result.semantic_maskprint(mask.data.shape, mask.classes)libreyolo predict model=LibreSegformerb0-sem.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Trueresult.semantic_mask zawiera gęstą mapę klas: .data to tensor (H, W)
z identyfikatorami klas w oryginalnym rozmiarze obrazu, a .classes zawiera
identyfikatory klas rzeczywiście obecnych na obrazie. result.boxes ma wartość
None, ponieważ nie ma detekcji poszczególnych instancji. Parametry conf i
iou są przyjmowane dla zgodności API, ale nie zmieniają wyniku: model zwraca
jedną klasę na piksel, a nie detekcje instancji wymagające filtrowania lub
usuwania duplikatów. Informacje o źródłach, strumieniowaniu i obsłudze wyników
znajdziesz w sekcji predykcja.
Warianty
Dostępnych jest sześć rozmiarów, od b0 do b5. Każdy kolejny poszerza i pogłębia enkoder Mix Transformer, zachowując tę samą konstrukcję dekodera opartą wyłącznie na MLP.
| Plik | Wejście (px) | Licencja wag |
|---|---|---|
| semantic | ||
| LibreSegformerb0-sem.pt | other | |
| LibreSegformerb1-sem.pt | other | |
| LibreSegformerb2-sem.pt | other | |
| LibreSegformerb3-sem.pt | other | |
| LibreSegformerb4-sem.pt | other | |
| LibreSegformerb5-sem.pt | other | |
Każdy z powyższych plików jest obecnie dostępny w organizacji LibreYOLO i pobierany przy pierwszym użyciu.
Trenowanie
Metoda train() domyślnie dostraja opublikowany punkt kontrolny. Zamiast tego
wywołaj LibreSegformer(...) bez model_path, aby zbudować model z losowo
zainicjalizowanym enkoderem i głowicą oraz trenować go od podstaw. Jest to jedyna
droga do wag nieobjętych niekomercyjnym ograniczeniem wstępnie wytrenowanych
punktów kontrolnych (zobacz Licencjonowanie).
from libreyolo import LibreYOLO model = LibreYOLO("LibreSegformerb0-sem.pt")model.train(data="my-dataset.yaml", epochs=160, imgsz=512, batch=8)libreyolo train model=LibreSegformerb0-sem.pt data=my-dataset.yaml \ epochs=160 imgsz=512 batch=8from libreyolo.models.segformer.model import LibreSegformer # Brak model_path oznacza losową inicjalizację bez pobierania. To jedyna# droga do wag wolnych od niekomercyjnych warunków wstępnie wytrenowanych punktów kontrolnych.model = LibreSegformer(size="b0", nb_classes=150)model.train(data="my-dataset.yaml", epochs=160, imgsz=512, batch=8)libreyolo train model=LibreSegformerb0-sem.pt data=my-dataset.yaml \ epochs=160 device=0,1 batch=16Przy ustawieniach domyślnych trener stosuje konfigurację ADE20K z publikacji SegFormer: AdamW z podstawową szybkością uczenia dla backbone i głowicą dekodera trenowaną z szybkością 10 razy większą, zanik wag wszędzie poza LayerNorm i konwolucją pozycyjną Mix-FFN oraz liniowy harmonogram zaniku z rozgrzewką. Zbieżność większych rozmiarów, od b3 do b5, nie została zweryfikowana kompleksowo.
Informacje o zbiorach danych, augmentacji, wielu GPU i loggerach znajdziesz w sekcji trenowanie.
Walidacja
Metoda val() zwraca słownik kluczy metrics/: mIoU i dokładność pikselową,
mierzone na dowolnym zbiorze danych w formacie użytym do trenowania.
from libreyolo import LibreYOLO model = LibreYOLO("LibreSegformerb0-sem.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mIoU"])print(metrics["metrics/pixel_accuracy"])libreyolo val model=LibreSegformerb0-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: obsługiwane | 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 |
Wyeksportowany artefakt jest ponownie ładowany przez LibreYOLO() na podstawie
rozszerzenia pliku, więc plik .onnx lub .engine zachowuje się jak punkt
kontrolny i zwraca ten sam obiekt Results. Sekcja eksport
zawiera argumenty akceptowane przez każdy format.
from libreyolo import LibreYOLO model = LibreYOLO("LibreSegformerb0-sem.pt")model.export(format="onnx", imgsz=512)model.export(format="tensorrt", imgsz=512, half=True)libreyolo export model=LibreSegformerb0-sem.pt format=onnx imgsz=512libreyolo export model=LibreSegformerb0-sem.pt format=tensorrt imgsz=512 half=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # Fabryka wybiera ścieżkę na podstawie rozszerzenia pliku, dlatego# artefakt ładuje się jak punkt kontrolny i zwraca ten sam obiekt Results.model = LibreYOLO("LibreSegformerb0-sem.onnx")result = model(SAMPLE_IMAGE) print(result.semantic_mask.data.shape)Punkty kontrolne
Wszystkie opublikowane pliki wag dla tej rodziny.
| Plik | Wejście (px) | Licencja wag |
|---|---|---|
| semantic | ||
| LibreSegformerb0-sem.pt | other | |
| LibreSegformerb1-sem.pt | other | |
| LibreSegformerb2-sem.pt | other | |
| LibreSegformerb3-sem.pt | other | |
| LibreSegformerb4-sem.pt | other | |
| LibreSegformerb5-sem.pt | other | |
Każdy z powyższych plików jest obecnie dostępny w organizacji LibreYOLO i pobierany przy pierwszym użyciu.
Licencjonowanie
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
- SegFormer, NVIDIA
- Licencja projektu źródłowego
- NVIDIA Source Code License (non-commercial, research or evaluation only)
- Kod źródłowy projektu
- github.com/NVlabs/SegFormer
- Kod LibreYOLO
- MIT
- Wagi
- NVIDIA Source Code License (non-commercial, research or evaluation only), ponownie opublikowane w huggingface.co/LibreYOLO
- Interpretacja
- The pretrained ADE20K checkpoints LibreYOLO hosts for this family are converted from NVIDIA's official SegFormer release under the NVIDIA Source Code License. That license permits redistributing the weights and derivative works, provided the license text and attribution notices travel with them, but it limits USE to non-commercial research or evaluation, a restriction its Section 3.2 carries forward into every derivative and that cannot be relicensed away: these weights are NOT covered by LibreYOLO's normal permissive terms, and that limitation binds you, not just LibreYOLO. LibreYOLO's own SegFormer implementation is a separate Apache-2.0 port of Hugging Face Transformers' code, unrelated to NVIDIA's repository, so a model you train from scratch with LibreSegformer(...).train(...) carries none of this restriction.
Enkoder i głowica dekodera LibreSegformer są portem implementacji SegFormer z Hugging Face Transformers na licencji Apache-2.0, a nie portem NVlabs/SegFormer. Oryginalnego repozytorium NVIDIA nigdy nie odczytywano ani nie kopiowano, a wymieniono je tutaj wyłącznie w celu przypisania autorstwa autorom publikacji. Niekomercyjne ograniczenie NVIDIA dotyczy tylko powyższych wstępnie wytrenowanych punktów kontrolnych. Architektura i własny kod LibreYOLO pozostają w całości na licencji MIT.
Cytowanie
@inproceedings{xie2021segformer,
title={SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers},
author={Xie, Enze and Wang, Wenhai and Yu, Zhiding and Anandkumar, Anima and Alvarez, Jose M and Luo, Ping},
booktitle={Neural Information Processing Systems (NeurIPS)},
year={2021}
}Skopiowano z bloku cytowania autorów w github.com/NVlabs/SegFormer#citation.