EdgeCrafter
Un transformer de vision compact pour la prédiction dense sur matériel edge, publié en amont sous la forme de trois modèles frères : ECDet, ECPose et ECSeg. LibreYOLO charge les trois comme une seule famille, la tâche étant portée par le checkpoint.
- Tâches
- detection, pose, instance segmentation
- Tailles
- s, m, l, x at 640 px
- Installer
pip install libreyolo- Niveau de support
- Cœur, depuis v1.2.0. Détecteurs entraînables du cœur : les fonctionnalités suivent les fers de lance dans la même vague de publication.
- Licences
- Code Apache-2.0, poids Apache-2.0. Usage commercial
Installation
EdgeCrafter ne demande aucun extra optionnel. Tout ce qu'il importe fait partie de l'installation de base.
pip install libreyoloLe fine-tuning par adaptateurs avec lora=True fait exception, et demande
l'extra lora.
pip install "libreyolo[lora]"Prédire
Les poids sont téléchargés depuis Hugging Face au premier usage, puis mis en cache localement.
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 # Le suffixe -pose du nom de fichier sélectionne la tête de points# clés, aucun argument task n'est donc nécessaire ici.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)La tâche vient du nom de fichier, si bien qu'un checkpoint -pose ou -seg
sélectionne sa propre tête et ne prend aucun argument task. Les trois renvoient
l'objet Results que renvoie chaque famille, avec result.keypoints en plus
pour la pose et result.masks pour la segmentation. La pose couvre une seule
classe, la personne, avec les 17 points clés COCO, et ce nombre est fixé à la
construction du modèle. Elle n'a pas de tête de boîtes, si bien que chaque boîte
de pose est l'étendue englobante de ses propres points clés, et le troisième
canal de point clé est une constante plutôt qu'un score par point.
conf et max_det filtrent la sélection des queries ; iou est accepté par
parité d'API mais n'a aucun effet, car les trois têtes décodent un ensemble de
queries sans étape de NMS. Voir la prédiction pour les sources,
le streaming et le traitement des résultats.
Variantes
Quatre tailles. Elles tournent toutes à la même résolution d'entrée, la table les sépare donc par nombre de paramètres et par exactitude.
| Checkpoint | Entrée (px) | mAP 50-95 | Paramètres (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. Mesuré par le banc de benchmark de LibreYOLO et publié sur Vision Analysis, où sont comparées la latence selon le matériel et les runtimes et où sont conservés les enregistrements complets des exécutions.
En amont, ECDet, ECPose et ECSeg sont publiés comme trois modèles distincts plutôt que comme un seul modèle à trois têtes. Ils partagent le backbone ECViT et l'encodeur hybride et ne diffèrent que par la tête, si bien que LibreYOLO les réunit en une seule famille et laisse le nom de fichier du checkpoint porter la tâche. Une lettre de taille désigne donc le même backbone et le même encodeur pour les trois, et la prédiction, la validation et l'export prennent les mêmes arguments quel que soit celui que vous chargez.
Entraîner
Les trois tâches s'entraînent via train(), qui lit la tâche depuis le
checkpoint chargé et choisit l'entraîneur correspondant.
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 # Demande un dataset de points clés à une seule classe dont le data.yaml# déclare kpt_shape, et imgsz à la taille native du checkpoint.model = LibreYOLO("LibreECs-pose.pt")model.train( data="my-pose-dataset.yaml", epochs=50, imgsz=640,)from libreyolo import LibreYOLO # Demande des étiquettes polygonales, et imgsz à la taille native du modèle.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,)Ce qui a été vérifié pour la détection et la segmentation : la parité
d'inférence avec l'amont à 1e-5, couche par couche et par taille, et le fait que
la loss et un unique pas d'entraînement s'exécutent sur une entrée synthétique.
Ce qui ne l'a pas été, d'après la docstring de train() elle-même : la
convergence d'un fine-tuning complet, l'entraînement multi-GPU, l'étape d'arrêt
de l'augmentation avec rechargement du meilleur modèle, et le remap des classes
d'Objects365 vers COCO. La voie pose suit la recette publiée de DETRPose, un
matcher hongrois sur des coûts de classe, de L1 sur les points clés et d'OKS,
avec débruitage contrastif des points clés, et sa convergence n'a pas non plus
été vérifiée de bout en bout.
Laissé à ses réglages par défaut, l'entraîneur fait 74 époques à lr0=5e-4 avec
la précision mixte activée, en suivant la recette amont : AdamW, un schedule
cosinus plat, une EMA à 0.9999 et des entrées normalisées ImageNet. La pose et
la segmentation exigent toutes deux imgsz à la taille native du checkpoint,
car leur grille d'ancres d'évaluation est construite à la construction du
modèle ; une autre valeur lève une erreur avant le démarrage du run. La pose
demande en plus un dataset à une seule classe dont le data.yaml déclare
kpt_shape, avec un nombre de points clés correspondant à la tête.
lora=True ne s'applique qu'à la détection ; la pose et la segmentation lèvent
une ValueError dessus. Sur Apple silicon, l'entraîneur garde le run sur le GPU
et envoie une seule opération sur CPU, la passe arrière du grid-sample à
l'intérieur de l'attention déformable, que PyTorch n'implémente pas en Metal.
Voir l'entraînement pour les datasets, l'augmentation, le multi-GPU et les loggers.
Valider
val() renvoie un dictionnaire indexé par nom de métrique, et affiche les
résultats par classe tant que verbose reste actif.
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)"]) # masquesprint(metrics["metrics/mAP50-95(B)"]) # boîtesLa pose reporte les métriques OKS des points clés sous metrics/keypoints_*. La
segmentation reporte les masques sous la clé metrics/mAP50-95 sans suffixe et
reprend les deux vues en une seule passe, les boîtes sous (B) et les masques
sous (M).
Exporter
| Tâche | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection to ONNX : pris en charge | Detection to TorchScript : pris en charge | Detection to ExecuTorch : pris en charge | Detection to TensorRT : pris en charge | Detection to OpenVINO : pris en charge | Detection to Paddle : pris en charge | Detection to MNN : pris en charge | Detection to RKNN : non pris en charge | Detection to ncnn : non pris en charge | Detection to TFLite : non pris en charge | Detection to CoreML : non pris en charge | Detection to Core AI : pris en charge |
| Pose | Pose to ONNX : pris en charge | Pose to TorchScript : pris en charge | Pose to ExecuTorch : pris en charge | Pose to TensorRT : pris en charge | Pose to OpenVINO : pris en charge | Pose to Paddle : pris en charge | Pose to MNN : non pris en charge | Pose to RKNN : non pris en charge | Pose to ncnn : non pris en charge | Pose to TFLite : non pris en charge | Pose to CoreML : non pris en charge | Pose to Core AI : non pris en charge |
| Instance segmentation | Instance segmentation to ONNX : pris en charge | Instance segmentation to TorchScript : pris en charge | Instance segmentation to ExecuTorch : pris en charge | Instance segmentation to TensorRT : pris en charge | Instance segmentation to OpenVINO : pris en charge | Instance segmentation to Paddle : pris en charge | Instance segmentation to MNN : non pris en charge | Instance segmentation to RKNN : non pris en charge | Instance segmentation to ncnn : non pris en charge | Instance segmentation to TFLite : non pris en charge | Instance segmentation to CoreML : non pris en charge | Instance segmentation to Core AI : non pris en charge |
Un artefact exporté se recharge via LibreYOLO() selon son extension de
fichier, si bien qu'un fichier .onnx ou .engine se comporte comme un
checkpoint et renvoie le même Results. La pose et la segmentation exportent
avec une entrée fixe de 640 par 640 plutôt qu'en formes dynamiques, et plusieurs
cibles de détection sont elles aussi à canevas fixe, dont OpenVINO, Paddle, MNN,
ExecuTorch et Core AI. L'export liste les arguments que chaque
format accepte, ainsi que les extras que quelques-uns ajoutent.
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 # La factory route selon l'extension du fichier, donc un artefact exporté# se charge comme tout checkpoint et renvoie le même objet Results.model = LibreYOLO("LibreECs.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Checkpoints
Tous les fichiers de poids publiés de cette famille.
| Fichier | Entrée (px) | Licence des poids |
|---|---|---|
| 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 |
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
- EdgeCrafter, Intellindust AI Lab
- Licence du projet d'origine
- Apache-2.0
- Source du projet d'origine
- github.com/Intellindust-AI-Lab/EdgeCrafter
- Code de LibreYOLO
- MIT
- Poids
- Apache-2.0, republiés sur huggingface.co/LibreYOLO
- Interprétation
- 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.
Citation
@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}
}Copié depuis le bloc de citation des auteurs sur github.com/Intellindust-AI-Lab/EdgeCrafter#-citation.