EdgeCrafter
Um vision transformer compacto para predição densa em hardware de borda, publicado no upstream como três modelos irmãos: ECDet, ECPose e ECSeg. O LibreYOLO carrega os três como uma única família, com a tarefa carregada pelo checkpoint.
- Tarefas
- detection, pose, instance segmentation
- Tamanhos
- s, m, l, x at 640 px
- Instalação
pip install libreyolo- Nível de suporte
- Núcleo, desde a v1.2.0. Detectores treináveis do núcleo: os recursos chegam depois dos carros-chefe na mesma leva de versões.
- Origem
- EdgeCrafter por Intellindust AI Lab, Apache-2.0. Artigo, código-fonte
- Licenças
- Código Apache-2.0, pesos Apache-2.0. Uso comercial
Instalação
O EdgeCrafter não precisa de nenhum extra opcional. Tudo que ele importa já está na instalação base.
pip install libreyoloO fine-tuning com adaptadores via lora=True é a exceção, e precisa do extra
lora.
pip install "libreyolo[lora]"Predição
Os pesos são baixados do Hugging Face no primeiro uso e ficam em cache localmente.
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreECs.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes: print(box.cls, box.conf, box.xyxy)libreyolo predict model=LibreECs.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # O sufixo -pose no nome do arquivo seleciona a cabeça de keypoints,# então nenhum argumento de tarefa é necessário aqui.model = LibreYOLO("LibreECs-pose.pt")result = model(SAMPLE_IMAGE, save=True) print(result.keypoints.xy)print(result.boxes.conf)from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreECs-seg.pt")result = model(SAMPLE_IMAGE, save=True) print(result.masks.data.shape)A tarefa vem do nome do arquivo, então um checkpoint -pose ou -seg seleciona
a própria cabeça e não recebe argumento de tarefa. Os três retornam o objeto
Results que todas as famílias retornam, com result.keypoints a mais para
pose e result.masks para segmentação. A pose cobre uma classe, pessoa, com os
17 keypoints do COCO, e a contagem é fixada quando o modelo é construído. Ela
não tem cabeça de caixas, então cada caixa de pose é a extensão que envolve os
próprios keypoints, e o terceiro canal do keypoint é uma constante em vez de uma
pontuação por ponto.
conf e max_det filtram a seleção de queries; iou é aceito por paridade de
API mas não tem efeito, porque as três cabeças decodificam um conjunto de
queries sem etapa de NMS. Veja predição para fontes, streaming
e tratamento de resultados.
Variantes
Quatro tamanhos. Todos rodam na mesma resolução de entrada, então a tabela os separa por número de parâmetros e acurácia.
| Checkpoint | Entrada (px) | mAP 50-95 | Parâmetros (M) |
|---|---|---|---|
| LibreECl | 640 | 60.1 | 32.97 |
| LibreECm | 640 | 58.4 | 19.43 |
| LibreECs | 640 | 54.3 | 9.88 |
| LibreECx | 640 | 61.1 | 49.94 |
COCO val2017, 500 images. Medido pelo conjunto de testes de benchmark do LibreYOLO e publicado no Vision Analysis, onde a latência entre hardwares e runtimes é comparada e os registros completos das execuções ficam disponíveis.
O upstream publica ECDet, ECPose e ECSeg como três modelos separados, em vez de um modelo com três cabeças. Eles compartilham o backbone ECViT e o encoder híbrido e diferem apenas na cabeça, então o LibreYOLO os agrupa em uma única família e deixa o nome do arquivo do checkpoint carregar a tarefa. Uma letra de tamanho significa, portanto, o mesmo backbone e o mesmo encoder nos três, e predição, validação e exportação recebem os mesmos argumentos, seja qual for o que você carregar.
Treinamento
As três tarefas treinam pelo train(), que lê a tarefa do checkpoint carregado
e escolhe o trainer correspondente.
from libreyolo import LibreYOLO model = LibreYOLO("LibreECs.pt")model.train( data="my-dataset.yaml", epochs=50, imgsz=640, batch=8, lr0=5e-4,)libreyolo train model=LibreECs.pt data=my-dataset.yaml epochs=50 imgsz=640 batch=8 lr0=5e-4from libreyolo import LibreYOLO # Precisa de um dataset de keypoints de classe única cujo data.yaml# declare kpt_shape, e imgsz no tamanho nativo do checkpoint.model = LibreYOLO("LibreECs-pose.pt")model.train( data="my-pose-dataset.yaml", epochs=50, imgsz=640,)from libreyolo import LibreYOLO # Precisa de labels em polígono, e imgsz no tamanho nativo do checkpoint.model = LibreYOLO("LibreECs-seg.pt")model.train( data="my-dataset.yaml", epochs=50, imgsz=640,)from libreyolo import LibreYOLO model = LibreYOLO("LibreECs.pt")model.train( data="my-dataset.yaml", epochs=50, lora=True,)O que foi conferido para detecção e segmentação: paridade de inferência com o
upstream em 1e-5, camada por camada e por tamanho, e que a loss e um único passo
de treinamento rodam com entrada sintética. O que não foi, conforme a própria
docstring de train(): a convergência de um fine-tuning completo, o treinamento
multi-GPU, a etapa de recarregar o melhor checkpoint ao parar o data
augmentation, e o remapeamento de classes de Objects365 para COCO. O caminho de
pose segue a receita publicada do DETRPose, um matcher húngaro sobre custos de
classe, L1 de keypoints e OKS com remoção contrastiva de ruído nos keypoints, e
a convergência dele também não foi conferida de ponta a ponta.
Sem mexer em nada, o trainer roda 74 épocas com lr0=5e-4 e precisão mista
ligada, seguindo a receita do upstream: AdamW, um cronograma cosseno achatado,
EMA em 0.9999 e entradas normalizadas para o ImageNet. Pose e segmentação exigem
imgsz no tamanho nativo do checkpoint, porque a grade de âncoras de avaliação
delas é construída quando o modelo é criado; um valor diferente levanta erro
antes de a execução começar. A pose também exige um dataset de classe única cujo
data.yaml declare kpt_shape, com uma contagem de keypoints que bata com a
cabeça.
lora=True vale só para detecção; pose e segmentação levantam ValueError com
ele. No Apple silicon o trainer mantém a execução na GPU e manda uma operação
para a CPU, o backward do grid-sample dentro da atenção deformável, que o
PyTorch não implementa no Metal.
Veja treinamento para datasets, augmentation, multi-GPU e loggers.
Validação
val() retorna um dicionário indexado pelo nome da métrica, e imprime os
resultados por classe quando verbose fica ligado.
from libreyolo import LibreYOLO model = LibreYOLO("LibreECs.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreECs.pt data=my-dataset.yamlfrom libreyolo import LibreYOLO model = LibreYOLO("LibreECs-pose.pt")metrics = model.val(data="my-pose-dataset.yaml") print(metrics["metrics/keypoints_mAP50-95"])print(metrics["metrics/keypoints_mAP50"])from libreyolo import LibreYOLO model = LibreYOLO("LibreECs-seg.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95(M)"]) # máscarasprint(metrics["metrics/mAP50-95(B)"]) # caixasA pose reporta as métricas OKS de keypoints em metrics/keypoints_*. A
segmentação reporta as máscaras na chave metrics/mAP50-95 pura e repete as
duas visões em uma única passada, caixas em (B) e máscaras em (M).
Exportação
| Tarefa | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection to ONNX: compatível | Detection to TorchScript: compatível | Detection to ExecuTorch: compatível | Detection to TensorRT: compatível | Detection to OpenVINO: compatível | Detection to Paddle: compatível | Detection to MNN: compatível | Detection to RKNN: incompatível | Detection to ncnn: incompatível | Detection to TFLite: incompatível | Detection to CoreML: incompatível | Detection to Core AI: compatível |
| Pose | Pose to ONNX: compatível | Pose to TorchScript: compatível | Pose to ExecuTorch: compatível | Pose to TensorRT: compatível | Pose to OpenVINO: compatível | Pose to Paddle: compatível | Pose to MNN: incompatível | Pose to RKNN: incompatível | Pose to ncnn: incompatível | Pose to TFLite: incompatível | Pose to CoreML: incompatível | Pose to Core AI: incompatível |
| Instance segmentation | Instance segmentation to ONNX: compatível | Instance segmentation to TorchScript: compatível | Instance segmentation to ExecuTorch: compatível | Instance segmentation to TensorRT: compatível | Instance segmentation to OpenVINO: compatível | Instance segmentation to Paddle: compatível | Instance segmentation to MNN: incompatível | Instance segmentation to RKNN: incompatível | Instance segmentation to ncnn: incompatível | Instance segmentation to TFLite: incompatível | Instance segmentation to CoreML: incompatível | Instance segmentation to Core AI: incompatível |
Um artefato exportado é recarregado pelo LibreYOLO() a partir do sufixo do
arquivo, então um arquivo .onnx ou .engine se comporta como um checkpoint e
devolve o mesmo Results. Pose e segmentação exportam com entrada fixa de 640
por 640 em vez de formas dinâmicas, e vários alvos de detecção também são de
canvas fixo, incluindo OpenVINO, Paddle, MNN, ExecuTorch e Core AI.
Exportação lista os argumentos que todo formato aceita e os
extras que alguns deles acrescentam.
from libreyolo import LibreYOLO model = LibreYOLO("LibreECs.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)libreyolo export model=LibreECs.pt format=onnx imgsz=640libreyolo export model=LibreECs-pose.pt format=onnx imgsz=640libreyolo export model=LibreECs-seg.pt format=onnx imgsz=640from libreyolo import LibreYOLO, SAMPLE_IMAGE # A factory roteia pelo sufixo do arquivo, então um artefato exportado# é carregado como qualquer checkpoint e devolve o mesmo objeto Results.model = LibreYOLO("LibreECs.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Checkpoints
Todos os arquivos de pesos publicados desta família.
| Arquivo | Entrada (px) | Licença dos pesos |
|---|---|---|
| Detection | ||
| LibreECs.pt | 640 | apache-2.0 |
| LibreECm.pt | 640 | apache-2.0 |
| LibreECl.pt | 640 | apache-2.0 |
| LibreECx.pt | 640 | apache-2.0 |
| Pose | ||
| LibreECs-pose.pt | 640 | apache-2.0 |
| LibreECm-pose.pt | 640 | apache-2.0 |
| LibreECl-pose.pt | 640 | apache-2.0 |
| LibreECx-pose.pt | 640 | apache-2.0 |
| Instance segmentation | ||
| LibreECs-seg.pt | 640 | apache-2.0 |
| LibreECm-seg.pt | 640 | apache-2.0 |
| LibreECl-seg.pt | 640 | apache-2.0 |
| LibreECx-seg.pt | 640 | apache-2.0 |
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
- EdgeCrafter, Intellindust AI Lab
- Licença original
- Apache-2.0
- Código-fonte original
- github.com/Intellindust-AI-Lab/EdgeCrafter
- Código do LibreYOLO
- MIT
- Pesos
- Apache-2.0, republicado em huggingface.co/LibreYOLO
- Interpretação
- Apache-2.0 is a permissive license, so these weights can be used in commercial and closed-source products. It asks you to keep its license text and attribution notices with any copy of the weights you redistribute, and it grants a patent license. One license covers all three upstream models, so the detection, pose and segmentation weights carry identical terms, and weights you train yourself on your own data are yours.
Citação
@article{liu2026edgecrafter,
title={EdgeCrafter: Compact ViTs for Edge Dense Prediction via Task-Specialized Distillation},
author={Liu, Longfei and Hou, Yongjie and Li, Yang and Wang, Qirui and Sha, Youyang and Yu, Yongjun and Wang, Yinzhi and Ru, Peizhe and Yu, Xuanlong and Shen, Xi},
journal={arXiv},
year={2026}
}Copiado do bloco de citação dos autores em github.com/Intellindust-AI-Lab/EdgeCrafter#-citation.