SegFormer

O SegFormer é um transformer de segmentação semântica que junta um encoder hierárquico Mix Transformer (MiT) a uma cabeça de decode leve, toda em MLP, dispensando os decoders pesados e as codificações posicionais fixas de que os transformers de segmentação anteriores precisavam. O LibreYOLO o suporta para uma tarefa, segmentação semântica, em seis tamanhos.

Tarefas
semantic
Tamanhos
Instalação
pip install libreyolo
Nível de suporte
Compatível, desde a v. Modelos treináveis complementares: mantidos verdes na CI, com recursos incorporados quando há oportunidade.
Origem
SegFormer por NVIDIA, NVIDIA Source Code License (non-commercial, research or evaluation only). Artigo, código-fonte
Licenças
Código Apache-2.0, pesos NVIDIA Source Code License (non-commercial, research or evaluation only). Uso comercial

Instalação

O SegFormer não precisa de nenhum extra opcional. Tudo o que ele importa está na instalação base.

bash
pip install libreyolo

Predição

Os pesos são baixados do Hugging Face no primeiro uso e ficam em cache local.

Python
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)
CLI
libreyolo predict model=LibreSegformerb0-sem.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True

result.semantic_mask traz o mapa denso de classes: .data é um tensor (H, W) de ids de classe no tamanho original da imagem, e .classes lista os ids de classe realmente presentes. result.boxes é None, já que não há detecções por instância. conf e iou são aceitos por paridade de API, mas não mudam a saída: o modelo devolve uma classe por pixel, não detecções por instância para filtrar ou desduplicar. Veja predição para fontes, streaming e tratamento de resultados.

Variantes

Seis tamanhos, de b0 a b5, alargando e aprofundando o encoder Mix Transformer a cada passo, mantendo o mesmo design de cabeça de decode toda em MLP.

Todos os arquivos acima existem hoje na organização LibreYOLO e são baixados no primeiro uso.

Treinamento

train() faz fine-tuning de um checkpoint publicado por padrão. Em vez disso, não passe nenhum model_path para LibreSegformer(...) e ele constrói o modelo com encoder e cabeça inicializados aleatoriamente, treinando do zero — a única rota para pesos que não carregam nenhuma das restrições não comerciais dos checkpoints pré-treinados (veja Licenciamento).

Python (fine-tuning)
from libreyolo import LibreYOLO model = LibreYOLO("LibreSegformerb0-sem.pt")model.train(data="my-dataset.yaml", epochs=160, imgsz=512, batch=8)
CLI
libreyolo train model=LibreSegformerb0-sem.pt data=my-dataset.yaml \  epochs=160 imgsz=512 batch=8
Do zero
from libreyolo.models.segformer.model import LibreSegformer # Sem model_path: init aleatório, nada é baixado. A única rota para# pesos livres do termo não comercial dos checkpoints pré-treinados.model = LibreSegformer(size="b0", nb_classes=150)model.train(data="my-dataset.yaml", epochs=160, imgsz=512, batch=8)
Multi-GPU
libreyolo train model=LibreSegformerb0-sem.pt data=my-dataset.yaml \  epochs=160 device=0,1 batch=16

Sem mexer em nada, o trainer segue a receita do artigo do SegFormer para o ADE20K: AdamW com um learning rate base no backbone e a cabeça de decode treinada a 10x essa taxa, weight decay em tudo menos no LayerNorm e na convolução posicional do Mix-FFN, e um schedule de decaimento linear com warmup. A convergência dos tamanhos maiores, de b3 a b5, não foi validada de ponta a ponta.

Veja treinamento para datasets, data augmentation, multi-GPU e loggers.

Validação

val() devolve um dicionário de chaves metrics/: mIoU e pixel accuracy, medidos sobre qualquer dataset no formato em que você treinou.

Python
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"])
CLI
libreyolo val model=LibreSegformerb0-sem.pt data=my-dataset.yaml

Exportação

TarefaONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
semanticsemantic to ONNX: compatívelsemantic to TorchScript: compatívelsemantic to ExecuTorch: compatívelsemantic to TensorRT: compatívelsemantic to OpenVINO: compatívelsemantic to Paddle: incompatívelsemantic to MNN: incompatívelsemantic to RKNN: incompatívelsemantic to ncnn: incompatívelsemantic to TFLite: incompatívelsemantic to CoreML: incompatívelsemantic to Core AI: incompatível

Um artefato exportado é carregado de volta por LibreYOLO() pelo sufixo do arquivo, então um arquivo .onnx ou .engine se comporta como um checkpoint e devolve o mesmo Results. Exportação lista os argumentos que todo formato aceita.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreSegformerb0-sem.pt")model.export(format="onnx", imgsz=512)model.export(format="tensorrt", imgsz=512, half=True)
CLI
libreyolo export model=LibreSegformerb0-sem.pt format=onnx imgsz=512libreyolo export model=LibreSegformerb0-sem.pt format=tensorrt imgsz=512 half=True
Usar o arquivo exportado
from libreyolo import LibreYOLO, SAMPLE_IMAGE # A factory roteia pelo sufixo do arquivo, então um artefato exportado# carrega como qualquer checkpoint e devolve o mesmo objeto Results.model = LibreYOLO("LibreSegformerb0-sem.onnx")result = model(SAMPLE_IMAGE) print(result.semantic_mask.data.shape)

Checkpoints

Todos os arquivos de pesos publicados desta família.

Todos os arquivos acima existem hoje na organização LibreYOLO e são baixados no primeiro uso.

Licenciamento

Confira a licença no repositório do Hugging Face correspondente aos pesos que você baixar. Cada checkpoint na organização LibreYOLO tem uma licença, e ela nem sempre é a mesma em toda a família. Esse repositório é a fonte oficial. O resumo abaixo descreve o que se aplicava na última verificação desta página.

Esta é uma descrição das licenças envolvidas, não uma orientação jurídica. Se a resposta tiver importância comercial, leia as licenças e procure sua própria assessoria.

Trabalho original
SegFormer, NVIDIA
Licença original
NVIDIA Source Code License (non-commercial, research or evaluation only)
Código-fonte original
github.com/NVlabs/SegFormer
Código do LibreYOLO
MIT
Pesos
NVIDIA Source Code License (non-commercial, research or evaluation only), republicado em huggingface.co/LibreYOLO
Interpretação
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.

O encoder e a cabeça de decode do LibreSegformer são um port para PyTorch da implementação do SegFormer do Hugging Face Transformers, sob Apache-2.0, e não do NVlabs/SegFormer: o repositório original da NVIDIA nunca foi lido nem copiado, e é creditado aqui apenas para atribuição aos autores do artigo. Só os checkpoints pré-treinados acima carregam a restrição não comercial da NVIDIA; a arquitetura e o código do próprio LibreYOLO seguem MIT do começo ao fim.

Citação

@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 do bloco de citação dos autores em github.com/NVlabs/SegFormer#citation.

Verificado com o LibreYOLO v1.5.0. As tabelas de suporte, os checkpoints e os números de benchmark desta página são gerados a partir da biblioteca lançada e dos pesos publicados, não escritos à mão.