SegFormer
SegFormer est un transformer de segmentation sémantique qui associe un encodeur hiérarchique Mix Transformer (MiT) à une tête de décodage légère entièrement composée de MLP. Il évite ainsi les décodeurs lourds et les encodages positionnels fixes dont avaient besoin les transformers de segmentation antérieurs. LibreYOLO le prend en charge pour une seule tâche, la segmentation sémantique, dans six tailles.
- Tâches
- semantic
- Tailles
- Installer
pip install libreyolo- Niveau de support
- Pris en charge, depuis v. Modèles entraînables complémentaires : maintenus au vert dans la CI, avec des fonctionnalités ajoutées selon les occasions.
- Origine
- SegFormer par NVIDIA, NVIDIA Source Code License (non-commercial, research or evaluation only). Article, source
- Licences
- Code Apache-2.0, poids NVIDIA Source Code License (non-commercial, research or evaluation only). Usage commercial
Installer
SegFormer ne nécessite aucun extra facultatif. Tous ses imports sont inclus dans l'installation de base.
pip install libreyoloPrédire
Les poids sont téléchargés depuis Hugging Face à la première utilisation et mis en cache localement.
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 contient la carte de classes dense\u00a0: .data est un
tenseur (H, W) d'identifiants de classe à la taille de l'image d'origine, et
.classes énumère les identifiants de classe réellement présents.
result.boxes vaut None, puisqu'il n'existe aucune détection par instance.
conf et iou sont acceptés pour assurer la parité de l'API, mais ils ne
modifient pas la sortie\u00a0: le modèle renvoie une classe par pixel et non des
détections par instance à filtrer ou dédupliquer. Consultez la
prédiction pour les sources, le streaming et la gestion des
résultats.
Variantes
Six tailles, de b0 à b5, élargissent et approfondissent l'encodeur Mix Transformer à chaque étape tout en conservant la même conception de tête de décodage entièrement composée de MLP.
| Fichier | Entrée (px) | Licence des poids |
|---|---|---|
| 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 | |
Tous les fichiers ci-dessus sont actuellement disponibles dans l<link>organisation LibreYOLO</link> et sont téléchargés à la première utilisation.
Entraîner
Par défaut, train() effectue le fine-tuning d'un checkpoint publié. Si vous
ne transmettez aucun model_path à LibreSegformer(...), il construit au
contraire un encodeur et une tête initialisés aléatoirement et les entraîne à
partir de zéro. C'est la seule voie vers des poids dépourvus de la restriction
non commerciale des checkpoints pré-entraînés (consultez la section
Licence).
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 # Aucun model_path : initialisation aléatoire, aucun téléchargement. C'est la# seule voie vers des poids exempts de la clause non commerciale des checkpoints pré-entraînés.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=16Sans configuration supplémentaire, le trainer suit la recette ADE20K de l'article SegFormer\u00a0: AdamW au learning rate de base du backbone, une tête de décodage entraînée à un learning rate 10x supérieur, un weight decay partout sauf sur LayerNorm et la convolution positionnelle Mix-FFN, ainsi qu'un planning de décroissance linéaire avec warmup. La convergence des grandes tailles, de b3 à b5, n'a pas été validée de bout en bout.
Consultez l'entraînement pour les datasets, l'augmentation, le multi-GPU et les loggers.
Valider
val() renvoie un dictionnaire de clés metrics/\u00a0: mIoU et exactitude par
pixel, mesurées sur tout dataset au format utilisé pour l'entraînement.
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.yamlExporter
| Tâche | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| semantic | semantic to ONNX : pris en charge | semantic to TorchScript : pris en charge | semantic to ExecuTorch : pris en charge | semantic to TensorRT : pris en charge | semantic to OpenVINO : pris en charge | semantic to Paddle : non pris en charge | semantic to MNN : non pris en charge | semantic to RKNN : non pris en charge | semantic to ncnn : non pris en charge | semantic to TFLite : non pris en charge | semantic to CoreML : non pris en charge | semantic to Core AI : non pris en charge |
Un artefact exporté se recharge dans LibreYOLO() grâce au suffixe de son
fichier. Un fichier .onnx ou .engine se comporte donc comme un checkpoint
et renvoie les mêmes Results. La page Export énumère les
arguments acceptés par chaque 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 # La fabrique détermine le chemin selon le suffixe du fichier ; un artefact exporté se charge# donc comme tout checkpoint et renvoie le même objet Results.model = LibreYOLO("LibreSegformerb0-sem.onnx")result = model(SAMPLE_IMAGE) print(result.semantic_mask.data.shape)Checkpoints
Tous les fichiers de poids publiés pour cette famille.
| Fichier | Entrée (px) | Licence des poids |
|---|---|---|
| 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 | |
Tous les fichiers ci-dessus sont actuellement disponibles dans l<link>organisation LibreYOLO</link> et sont téléchargés à la première utilisation.
Licence
Vérifiez la licence dans le dépôt Hugging Face des poids précis que vous téléchargez. Chaque checkpoint de l<link>organisation LibreYOLO</link> en possède une, et elles ne sont pas toujours identiques au sein dune même famille. Ce dépôt fait autorité ; le résumé ci-dessous décrit les conditions applicables lors de la dernière vérification de cette page.
Ceci décrit les licences concernées et ne constitue pas un conseil juridique. Si la réponse a une importance commerciale, lisez vous-même les licences et consultez votre propre avocat.
- Travail d'origine
- SegFormer, NVIDIA
- Licence du projet d'origine
- NVIDIA Source Code License (non-commercial, research or evaluation only)
- Source du projet d'origine
- github.com/NVlabs/SegFormer
- Code de LibreYOLO
- MIT
- Poids
- NVIDIA Source Code License (non-commercial, research or evaluation only), republiés sur huggingface.co/LibreYOLO
- Interprétation
- 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'encodeur et la tête de décodage de LibreSegformer sont un portage PyTorch de l'implémentation SegFormer sous Apache-2.0 de Hugging Face Transformers, et non de NVlabs/SegFormer\u00a0: le dépôt d'origine de NVIDIA n'a jamais été lu ni copié, et n'est cité ici que pour attribuer l'article à ses auteurs. Seuls les checkpoints pré-entraînés ci-dessus sont soumis à la restriction non commerciale de NVIDIA\u00a0; l'architecture et le code propre à LibreYOLO restent entièrement sous licence MIT.
Citation
@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}
}Copié depuis le bloc de citation des auteurs sur github.com/NVlabs/SegFormer#citation.