EdgeCrafter
Ein kompakter Vision Transformer für dichte Vorhersagen auf Edge-Hardware, der upstream als drei verwandte Modelle veröffentlicht wurde: ECDet, ECPose und ECSeg. LibreYOLO lädt alle drei als eine Familie, wobei der Checkpoint die Aufgabe festlegt.
- Aufgaben
- detection, pose, instance segmentation
- Größen
- s, m, l, x at 640 px
- Installation
pip install libreyolo- Supportstufe
- Kern, seit v1.2.0. Trainierbare Kerndetektoren: Funktionen folgen den Flaggschiffen in derselben Release-Welle.
- Upstream
- EdgeCrafter von Intellindust AI Lab, Apache-2.0. Publikation, Quelle
- Lizenzen
- Code Apache-2.0, Gewichte Apache-2.0. Kommerzielle Nutzung
Installation
EdgeCrafter benötigt kein optionales Zusatzpaket. Alle Importe sind in der Basisinstallation enthalten.
pip install libreyoloEine Ausnahme ist das Adapter-Fine-Tuning mit lora=True. Dafür ist das
Zusatzpaket lora erforderlich.
pip install "libreyolo[lora]"Vorhersage
Die Gewichte werden bei der ersten Verwendung von Hugging Face heruntergeladen und lokal zwischengespeichert.
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 # Das Suffix -pose im Dateinamen wählt den Keypoint-Head aus,# daher ist hier kein task-Argument erforderlich.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)Die Aufgabe stammt aus dem Dateinamen. Ein -pose- oder -seg-Checkpoint
wählt somit seinen eigenen Head aus und benötigt kein Aufgabenargument. Alle
drei geben das Results-Objekt aller Familien zurück, ergänzt um
result.keypoints für Pose und result.masks für Segmentierung. Die
Pose-Schätzung umfasst eine Klasse, Person, mit den 17 COCO-Keypoints. Ihre
Anzahl wird beim Erstellen des Modells festgelegt. Das Modell besitzt keinen
Box-Head. Jede Pose-Box entspricht daher der Bounding Box ihrer eigenen
Keypoints, und der dritte Keypoint-Kanal ist eine Konstante statt eines
punktbezogenen Scores.
conf und max_det filtern die Auswahl der Queries. iou wird aus Gründen
der API-Parität akzeptiert, hat aber keine Wirkung, weil alle drei Heads eine
Menge von Queries ohne NMS-Schritt dekodieren. Unter
Vorhersage findest du Quellen, Streaming und die Verarbeitung
von Ergebnissen.
Varianten
Es gibt vier Größen. Alle laufen mit derselben Eingabeauflösung, daher unterscheidet die Tabelle sie anhand der Parameteranzahl und Accuracy.
| Checkpoint | Eingabe (px) | mAP 50-95 | Parameter (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. Gemessen mit dem LibreYOLO-Benchmarksystem und auf Vision Analysis veröffentlicht. Dort werden Latenzen verschiedener Hardware und Runtimes verglichen und die vollständigen Laufprotokolle bereitgestellt.
Upstream veröffentlicht ECDet, ECPose und ECSeg als drei separate Modelle und nicht als ein Modell mit drei Heads. Sie verwenden dasselbe ECViT-Backbone und denselben hybriden Encoder und unterscheiden sich nur im Head. LibreYOLO fasst sie deshalb in einer Familie zusammen und lässt den Checkpoint-Dateinamen die Aufgabe tragen. Ein Größenbuchstabe bezeichnet somit bei allen drei Modellen dasselbe Backbone und denselben Encoder. Vorhersage, Validierung und Export akzeptieren unabhängig vom geladenen Modell dieselben Argumente.
Training
Alle drei Aufgaben werden über train() trainiert. Die Methode liest die
Aufgabe aus dem geladenen Checkpoint und wählt den passenden Trainer.
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 # Benötigt einen einklassigen Keypoint-Datensatz, dessen data.yaml# kpt_shape deklariert, und imgsz in der nativen Größe des Checkpoints.model = LibreYOLO("LibreECs-pose.pt")model.train( data="my-pose-dataset.yaml", epochs=50, imgsz=640,)from libreyolo import LibreYOLO # Benötigt Polygon-Labels und imgsz in der nativen Größe des Checkpoints.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,)Für Erkennung und Segmentierung wurde Folgendes geprüft: Inferenzparität mit
dem Upstream auf 1e-5, Schicht für Schicht und für jede Größe, sowie die
Ausführung des Losses und eines einzelnen Trainingsschritts auf synthetischer
Eingabe. Laut dem eigenen Docstring von train() wurde Folgendes nicht geprüft:
die Konvergenz eines vollständigen Fine-Tunings, Multi-GPU-Training, der Schritt
zum Neuladen des besten Modells nach dem Stopp der Augmentierung und die
Klassenumordnung von Objects365 zu COCO. Der Pose-Pfad folgt dem veröffentlichten
Rezept von DETRPose: einem ungarischen Matcher über Klassen-, Keypoint-L1- und
OKS-Kosten mit kontrastivem Keypoint-Denoising. Auch seine Konvergenz wurde
nicht vollständig geprüft.
Ohne Änderungen läuft der Trainer 74 Epochen mit lr0=5e-4 und aktivierter
Mixed Precision gemäß dem Upstream-Rezept: AdamW, ein Flat-Cosine-Zeitplan,
EMA mit 0.9999 und nach ImageNet normalisierte Eingaben. Pose und Segmentierung
benötigen beide imgsz in der nativen Größe des Checkpoints, weil ihr
Auswertungs-Anchor-Raster beim Erstellen des Modells aufgebaut wird. Ein anderer
Wert löst vor Beginn des Laufs einen Fehler aus. Pose benötigt außerdem einen
einklassigen Datensatz, dessen data.yaml den Wert kpt_shape deklariert. Die
Keypoint-Anzahl muss zum Head passen.
lora=True gilt nur für die Objekterkennung. Pose und Segmentierung lösen dafür
einen ValueError aus. Auf Apple-Silicon verbleibt der Lauf auf der GPU, der
Trainer verlagert aber eine Operation auf die CPU: den Grid-Sample-Backward-Pass
innerhalb der Deformable Attention, den PyTorch nicht in Metal implementiert.
Unter Training findest du Datensätze, Datenaugmentierung, Multi-GPU und Logger.
Validierung
val() gibt ein Dictionary mit den Metriknamen als Schlüsseln zurück und
druckt klassenspezifische Ergebnisse, solange verbose aktiviert bleibt.
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)"]) # Maskenprint(metrics["metrics/mAP50-95(B)"]) # BoxenPose meldet Keypoint-OKS-Metriken unter metrics/keypoints_*. Die Segmentierung
meldet Masken unter dem einfachen Schlüssel metrics/mAP50-95 und wiederholt
beide Ansichten in einem Durchlauf: Boxen unter (B) und Masken unter (M).
Export
| Aufgabe | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection to ONNX: unterstützt | Detection to TorchScript: unterstützt | Detection to ExecuTorch: unterstützt | Detection to TensorRT: unterstützt | Detection to OpenVINO: unterstützt | Detection to Paddle: unterstützt | Detection to MNN: unterstützt | Detection to RKNN: nicht unterstützt | Detection to ncnn: nicht unterstützt | Detection to TFLite: nicht unterstützt | Detection to CoreML: nicht unterstützt | Detection to Core AI: unterstützt |
| Pose | Pose to ONNX: unterstützt | Pose to TorchScript: unterstützt | Pose to ExecuTorch: unterstützt | Pose to TensorRT: unterstützt | Pose to OpenVINO: unterstützt | Pose to Paddle: unterstützt | Pose to MNN: nicht unterstützt | Pose to RKNN: nicht unterstützt | Pose to ncnn: nicht unterstützt | Pose to TFLite: nicht unterstützt | Pose to CoreML: nicht unterstützt | Pose to Core AI: nicht unterstützt |
| Instance segmentation | Instance segmentation to ONNX: unterstützt | Instance segmentation to TorchScript: unterstützt | Instance segmentation to ExecuTorch: unterstützt | Instance segmentation to TensorRT: unterstützt | Instance segmentation to OpenVINO: unterstützt | Instance segmentation to Paddle: unterstützt | Instance segmentation to MNN: nicht unterstützt | Instance segmentation to RKNN: nicht unterstützt | Instance segmentation to ncnn: nicht unterstützt | Instance segmentation to TFLite: nicht unterstützt | Instance segmentation to CoreML: nicht unterstützt | Instance segmentation to Core AI: nicht unterstützt |
Ein exportiertes Artefakt wird anhand seiner Dateiendung wieder über LibreYOLO()
geladen. Eine .onnx- oder .engine-Datei verhält sich daher wie ein Checkpoint
und gibt dasselbe Results-Objekt zurück. Pose und Segmentierung werden mit
einer festen Eingabe von 640 mal 640 statt mit dynamischen Formen exportiert.
Auch mehrere Erkennungsziele verwenden eine feste Arbeitsfläche, darunter
OpenVINO, Paddle, MNN, ExecuTorch und Core AI. Export führt die
Argumente auf, die jedes Format akzeptiert, sowie die Zusatzpakete, die einige
davon benötigen.
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 # Die Factory entscheidet anhand der Dateiendung, daher wird ein Exportartefakt# wie jeder Checkpoint geladen und gibt dasselbe Results-Objekt zurück.model = LibreYOLO("LibreECs.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Checkpoints
Alle veröffentlichten Gewichtsdateien dieser Familie.
| Datei | Eingabe (px) | Lizenz der Gewichte |
|---|---|---|
| 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 |
Jede oben aufgeführte Datei ist heute in der LibreYOLO-Organisation verfügbar und wird bei der ersten Verwendung heruntergeladen.
Lizenzierung
Prüfe die Lizenz im Hugging-Face-Repository der konkreten Gewichte, die du herunterlädst. Jeder Checkpoint in der LibreYOLO-Organisation hat eine Lizenz, und sie ist innerhalb einer Familie nicht immer gleich. Dieses Repository ist die maßgebliche Quelle. Die Zusammenfassung unten beschreibt den Stand bei der letzten Verifizierung dieser Seite.
Dies ist eine Beschreibung der beteiligten Lizenzen und keine Rechtsberatung. Wenn die Antwort kommerziell relevant ist, lies die Lizenzen selbst und hole eigenen Rechtsrat ein.
- Originalarbeit
- EdgeCrafter, Intellindust AI Lab
- Upstream-Lizenz
- Apache-2.0
- Upstream-Quelle
- github.com/Intellindust-AI-Lab/EdgeCrafter
- LibreYOLO-Code
- MIT
- Gewichte
- Apache-2.0, erneut unter huggingface.co/LibreYOLO veröffentlicht
- Einordnung
- 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.
Zitieren
@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}
}Aus dem Zitierblock der Autoren unter github.com/Intellindust-AI-Lab/EdgeCrafter#-citation kopiert.