SegFormer
SegFormer es un transformer de segmentación semántica que combina un encoder jerárquico Mix Transformer (MiT) con una cabeza de decodificación all-MLP ligera, evitando los decoders pesados y las codificaciones posicionales fijas que necesitaban los transformers de segmentación anteriores. LibreYOLO lo soporta para una sola tarea, segmentación semántica, en seis tamaños.
- Tareas
- semantic
- Tamaños
- Instalación
pip install libreyolo- Nivel de compatibilidad
- Compatible, desde v. Modelos entrenables de apoyo: se mantienen operativos en CI y reciben funciones cuando surge la oportunidad.
- Proyecto original
- SegFormer de NVIDIA, NVIDIA Source Code License (non-commercial, research or evaluation only). Artículo, fuente
- Licencias
- Código Apache-2.0, pesos NVIDIA Source Code License (non-commercial, research or evaluation only). Uso comercial
Instalación
SegFormer no necesita ningún extra opcional. Todo lo que importa está en la instalación base.
pip install libreyoloPredicción
Los pesos se descargan de Hugging Face en el primer uso y se guardan en la caché local.
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 lleva el mapa denso de clases: .data es un tensor
(H, W) de ids de clase al tamaño original de la imagen, y .classes enumera
los ids de clase realmente presentes. result.boxes es None, ya que no hay
detecciones por instancia. conf e iou se aceptan por paridad de API pero no
cambian la salida: el modelo devuelve una clase por píxel, no detecciones por
instancia que filtrar o deduplicar. Consulta predicción para
fuentes, streaming y manejo de resultados.
Variantes
Seis tamaños, de b0 a b5, que ensanchan y profundizan el encoder Mix Transformer en cada paso manteniendo el mismo diseño de cabeza de decodificación all-MLP.
| Archivo | Entrada (px) | Licencia de los pesos |
|---|---|---|
| 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 | |
Todos los archivos anteriores existen hoy en la organización de LibreYOLO y se descargan la primera vez que se usan.
Entrenamiento
train() hace fine-tuning de un checkpoint publicado por defecto. Si en su
lugar no le pasas ningún model_path a LibreSegformer(...), el modelo se
construye con el encoder y la cabeza inicializados al azar y entrena desde cero,
la única vía a pesos que no arrastran ninguna restricción no comercial de los
checkpoints preentrenados (consulta Licencia).
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 # Sin model_path: inicialización aleatoria, no se descarga nada. La única# vía a pesos libres del término no comercial de los checkpoints# preentrenados.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=16Si lo dejas como está, el trainer sigue la receta de ADE20K del paper de SegFormer: AdamW con un learning rate base para el backbone y la cabeza de decodificación entrenada a 10x esa tasa, weight decay en todas partes excepto en LayerNorm y en la convolución posicional del Mix-FFN, y un schedule de decaimiento lineal con warmup. La convergencia de los tamaños más grandes, de b3 a b5, no se ha validado de principio a fin.
Consulta entrenamiento para datasets, aumento de datos, multi-GPU y loggers.
Validación
val() devuelve un diccionario de claves metrics/: mIoU y precisión por
píxel, medidos contra cualquier dataset en el formato con el que entrenaste.
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.yamlExportación
| Tarea | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| semantic | semantic to ONNX: compatible | semantic to TorchScript: compatible | semantic to ExecuTorch: compatible | semantic to TensorRT: compatible | semantic to OpenVINO: compatible | semantic to Paddle: no compatible | semantic to MNN: no compatible | semantic to RKNN: no compatible | semantic to ncnn: no compatible | semantic to TFLite: no compatible | semantic to CoreML: no compatible | semantic to Core AI: no compatible |
Un artefacto 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. Exportación enumera
los argumentos que acepta cada 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 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("LibreSegformerb0-sem.onnx")result = model(SAMPLE_IMAGE) print(result.semantic_mask.data.shape)Checkpoints
Todos los archivos de pesos publicados de esta familia.
| Archivo | Entrada (px) | Licencia de los pesos |
|---|---|---|
| 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 | |
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
- SegFormer, NVIDIA
- Licencia del proyecto original
- NVIDIA Source Code License (non-commercial, research or evaluation only)
- Fuente del proyecto original
- github.com/NVlabs/SegFormer
- Código de LibreYOLO
- MIT
- Pesos
- NVIDIA Source Code License (non-commercial, research or evaluation only), republicados en huggingface.co/LibreYOLO
- Interpretación
- 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.
El encoder y la cabeza de decodificación de LibreSegformer son un port a PyTorch de la implementación de SegFormer de Hugging Face Transformers, con licencia Apache-2.0, y no de NVlabs/SegFormer: el repositorio original de NVIDIA nunca se leyó ni se copió, y se cita aquí solo para atribuir el trabajo a los autores del paper. Solo los checkpoints preentrenados de arriba llevan la restricción no comercial de NVIDIA; la arquitectura y el propio código de LibreYOLO siguen siendo MIT en todo momento.
Cita
@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}
}Copiado del bloque de cita de los autores en github.com/NVlabs/SegFormer#citation.