SegFormer
SegFormer è un transformer per la segmentazione semantica che unisce un encoder gerarchico Mix Transformer (MiT) a una testa di decodifica leggera fatta di soli MLP, evitando i decoder pesanti e le codifiche posizionali fisse di cui avevano bisogno i transformer di segmentazione precedenti. LibreYOLO lo supporta per un solo task, la segmentazione semantica, in sei taglie.
- Task
- semantic
- Dimensioni
- Installa
pip install libreyolo- Livello di supporto
- Supportato, dalla v. Modelli addestrabili di supporto: mantenuti funzionanti nella CI, ricevono nuove funzionalità quando possibile.
- Origine
- SegFormer di NVIDIA, NVIDIA Source Code License (non-commercial, research or evaluation only). Articolo, sorgente
- Licenze
- Codice Apache-2.0, pesi NVIDIA Source Code License (non-commercial, research or evaluation only). Uso commerciale
Installazione
SegFormer non richiede nessun extra opzionale. Tutto ciò che importa è già nell'installazione di base.
pip install libreyoloPredizione
I pesi vengono scaricati da Hugging Face al primo utilizzo e restano nella cache locale.
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 porta la mappa densa delle classi: .data è un tensore
(H, W) di id di classe alla dimensione originale dell'immagine, e .classes
elenca gli id di classe effettivamente presenti. result.boxes è None,
perché non ci sono rilevamenti per singola istanza. conf e iou sono
accettati per parità di API ma non cambiano l'output: il modello restituisce
una classe per pixel, non rilevamenti per istanza da filtrare o deduplicare.
Vedi predizione per sorgenti, streaming e gestione dei
risultati.
Varianti
Sei taglie, da b0 a b5, che allargano e approfondiscono l'encoder Mix Transformer a ogni passo mantenendo lo stesso design della testa di decodifica fatta di soli MLP.
| File | Ingresso (px) | Licenza dei pesi |
|---|---|---|
| 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 | |
Oggi tutti i file elencati sopra sono presenti nell<link>organizzazione LibreYOLO</link> e vengono scaricati al primo utilizzo.
Addestramento
Per impostazione predefinita train() fa fine-tuning di un checkpoint
pubblicato. Se invece non passi nessun model_path a LibreSegformer(...), il
modello viene costruito con encoder e testa inizializzati a caso e addestrato
da zero: è l'unica strada per ottenere pesi che non portano nessuna delle
restrizioni non commerciali dei checkpoint preaddestrati (vedi
Licenze).
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 # Senza model_path: init casuale, nessun download. L'unica via a pesi# liberi dalla clausola non commerciale dei checkpoint preaddestrati.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=16Se lo lasci ai valori predefiniti, il trainer segue la ricetta ADE20K del paper di SegFormer: AdamW con un learning rate base per il backbone e la testa di decodifica addestrata a 10x quel valore, weight decay ovunque tranne che sui LayerNorm e sulla convoluzione posizionale del Mix-FFN, e uno schedule a decadimento lineare con warmup. La convergenza per le taglie più grandi, da b3 a b5, non è stata validata end to end.
Vedi addestramento per dataset, augmentation, multi-GPU e logger.
Validazione
val() restituisce un dizionario di chiavi metrics/: mIoU e accuratezza per
pixel, misurate su qualsiasi dataset nel formato con cui hai addestrato.
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.yamlEsportazione
| Task | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| semantic | semantic to ONNX: supportato | semantic to TorchScript: supportato | semantic to ExecuTorch: supportato | semantic to TensorRT: supportato | semantic to OpenVINO: supportato | semantic to Paddle: non supportato | semantic to MNN: non supportato | semantic to RKNN: non supportato | semantic to ncnn: non supportato | semantic to TFLite: non supportato | semantic to CoreML: non supportato | semantic to Core AI: non supportato |
Un artefatto esportato si ricarica con LibreYOLO() in base al suffisso del
file, quindi un file .onnx o .engine si comporta come un checkpoint e
restituisce lo stesso Results. Esportazione elenca gli
argomenti accettati da ogni formato.
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 # La factory smista in base al suffisso del file, quindi un artefatto# esportato si carica come un checkpoint qualsiasi e restituisce lo# stesso oggetto Results.model = LibreYOLO("LibreSegformerb0-sem.onnx")result = model(SAMPLE_IMAGE) print(result.semantic_mask.data.shape)Checkpoint
Tutti i file di pesi pubblicati per questa famiglia.
| File | Ingresso (px) | Licenza dei pesi |
|---|---|---|
| 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 | |
Oggi tutti i file elencati sopra sono presenti nell<link>organizzazione LibreYOLO</link> e vengono scaricati al primo utilizzo.
Licenze
Controlla la licenza nel repository Hugging Face degli specifici pesi che scarichi. Ogni checkpoint nell<link>organizzazione LibreYOLO</link> ne include una e non è sempre la stessa per tutta la famiglia. Quel repository è la fonte autorevole; il riepilogo seguente descrive le condizioni applicabili al momento dellultima verifica di questa pagina.
Questa è una descrizione delle licenze coinvolte, non una consulenza legale. Se la risposta è importante a fini commerciali, leggi personalmente le licenze e chiedi una consulenza indipendente.
- Lavoro originale
- SegFormer, NVIDIA
- Licenza upstream
- NVIDIA Source Code License (non-commercial, research or evaluation only)
- Sorgente upstream
- github.com/NVlabs/SegFormer
- Codice LibreYOLO
- MIT
- Pesi
- NVIDIA Source Code License (non-commercial, research or evaluation only), ripubblicati su huggingface.co/LibreYOLO
- Interpretazione
- 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.
L'encoder e la testa di decodifica di LibreSegformer sono un port in PyTorch dell'implementazione SegFormer di Hugging Face Transformers, sotto licenza Apache-2.0, e non di NVlabs/SegFormer: il repository originale di NVIDIA non è mai stato letto né copiato, ed è citato qui solo per attribuzione agli autori del paper. Solo i checkpoint preaddestrati qui sopra portano la restrizione non commerciale di NVIDIA; l'architettura e il codice di LibreYOLO restano MIT dall'inizio alla fine.
Citazione
@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}
}Copiato dal blocco di citazione degli autori disponibile su github.com/NVlabs/SegFormer#citation.