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.

bash
pip install libreyolo

O fine-tuning com adaptadores via lora=True é a exceção, e precisa do extra lora.

bash
pip install "libreyolo[lora]"

Predição

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

Python
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)
CLI
libreyolo predict model=LibreECs.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
Pose
from 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)
Segmentação de instâncias
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.

CheckpointEntrada (px)mAP 50-95Parâmetros (M)
LibreECl64060.132.97
LibreECm64058.419.43
LibreECs64054.39.88
LibreECx64061.149.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.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreECs.pt")model.train(    data="my-dataset.yaml",    epochs=50,    imgsz=640,    batch=8,    lr0=5e-4,)
CLI
libreyolo train model=LibreECs.pt data=my-dataset.yaml epochs=50 imgsz=640 batch=8 lr0=5e-4
Pose
from 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,)
Segmentação de instâncias
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,)
LoRA
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.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreECs.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])
CLI
libreyolo val model=LibreECs.pt data=my-dataset.yaml
Pose
from 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"])
Segmentação de instâncias
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)"])   # caixas

A 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

TarefaONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
DetectionDetection to ONNX: compatívelDetection to TorchScript: compatívelDetection to ExecuTorch: compatívelDetection to TensorRT: compatívelDetection to OpenVINO: compatívelDetection to Paddle: compatívelDetection to MNN: compatívelDetection to RKNN: incompatívelDetection to ncnn: incompatívelDetection to TFLite: incompatívelDetection to CoreML: incompatívelDetection to Core AI: compatível
PosePose to ONNX: compatívelPose to TorchScript: compatívelPose to ExecuTorch: compatívelPose to TensorRT: compatívelPose to OpenVINO: compatívelPose to Paddle: compatívelPose to MNN: incompatívelPose to RKNN: incompatívelPose to ncnn: incompatívelPose to TFLite: incompatívelPose to CoreML: incompatívelPose to Core AI: incompatível
Instance segmentationInstance segmentation to ONNX: compatívelInstance segmentation to TorchScript: compatívelInstance segmentation to ExecuTorch: compatívelInstance segmentation to TensorRT: compatívelInstance segmentation to OpenVINO: compatívelInstance segmentation to Paddle: compatívelInstance segmentation to MNN: incompatívelInstance segmentation to RKNN: incompatívelInstance segmentation to ncnn: incompatívelInstance segmentation to TFLite: incompatívelInstance segmentation to CoreML: incompatívelInstance 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.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreECs.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)
CLI
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=640
Usar o arquivo exportado
from 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.

ArquivoEntrada (px)Licença dos pesos
Detection
LibreECs.pt640apache-2.0
LibreECm.pt640apache-2.0
LibreECl.pt640apache-2.0
LibreECx.pt640apache-2.0
Pose
LibreECs-pose.pt640apache-2.0
LibreECm-pose.pt640apache-2.0
LibreECl-pose.pt640apache-2.0
LibreECx-pose.pt640apache-2.0
Instance segmentation
LibreECs-seg.pt640apache-2.0
LibreECm-seg.pt640apache-2.0
LibreECl-seg.pt640apache-2.0
LibreECx-seg.pt640apache-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 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.

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.