EdgeCrafter
Компактний візуальний трансформер для щільного передбачення на edge-обладнанні, опублікований у першоджерелі як три споріднені моделі: ECDet, ECPose та ECSeg. LibreYOLO завантажує всі три як одне сімейство, а завдання визначається контрольною точкою.
- Задачі
- detection, pose, instance segmentation
- Розміри
- s, m, l, x at 640 px
- Встановлення
pip install libreyolo- Рівень підтримки
- Основний, починаючи з v1.2.0. Основні придатні до навчання детектори: функції з'являються після флагманських моделей у тій самій хвилі випуску.
- Ліцензії
- Код: Apache-2.0, ваги: Apache-2.0. Комерційне використання
Встановлення
EdgeCrafter не потребує додаткових пакетів. Усі його імпорти входять до базового встановлення.
pip install libreyoloВинятком є донавчання адаптерів із lora=True, для якого потрібен додатковий
пакет lora.
pip install "libreyolo[lora]"Передбачення
Під час першого використання ваги завантажуються з Hugging Face та кешуються локально.
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 # Суфікс -pose у назві файлу вибирає голову ключових точок, тому# аргумент завдання тут не потрібен.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)Завдання визначається за назвою файлу, тому контрольна точка -pose або -seg
вибирає власну голову й не приймає аргументу завдання. Усі три повертають об'єкт
Results, який повертає кожне сімейство, із доданим result.keypoints для пози
та result.masks для сегментації. Поза охоплює один клас, людину, із 17 ключовими
точками COCO, а кількість фіксується під час побудови моделі. Вона не має голови
рамок, тому кожна рамка пози охоплює її власні ключові точки, а третій канал
ключової точки є сталою, а не оцінкою окремої точки.
Параметри conf і max_det фільтрують вибір запитів; iou приймається для
сумісності API, але не впливає на результат, оскільки всі три голови декодують
набір запитів без етапу NMS. Джерела, потокове оброблення та роботу з результатами
описано на сторінці передбачення.
Варіанти
Доступні чотири розміри. Усі вони працюють з однаковою роздільною здатністю вхідних даних, тому таблиця розрізняє їх за кількістю параметрів і правильністю.
| Контрольна точка | Вхід (пікс.) | mAP 50-95 | Параметри (млн) |
|---|---|---|---|
| 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. Виміряно засобами бенчмарку LibreYOLO й опубліковано на сторінці Vision Analysis, де порівнюють затримку на різному обладнанні та в різних середовищах виконання, а також зберігають повні записи запусків.
Першоджерело публікує ECDet, ECPose та ECSeg як три окремі моделі, а не одну модель із трьома головами. Вони мають спільні бекбон ECViT і гібридний кодер та відрізняються лише головою, тому LibreYOLO об'єднує їх в одне сімейство, а завдання визначається назвою файлу контрольної точки. Отже, літера розміру означає однакові бекбон і кодер для всіх трьох, а передбачення, валідація та експорт приймають однакові аргументи незалежно від завантаженої моделі.
Навчання
Усі три завдання навчаються через train(), який читає завдання із завантаженої
контрольної точки та вибирає відповідний тренер.
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 # Потрібен однокласовий датасет ключових точок, у data.yaml якого оголошено# kpt_shape, та imgsz із нативним розміром контрольної точки.model = LibreYOLO("LibreECs-pose.pt")model.train( data="my-pose-dataset.yaml", epochs=50, imgsz=640,)from libreyolo import LibreYOLO # Потрібні полігональні мітки та imgsz із нативним розміром контрольної точки.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,)Для виявлення та сегментації перевірено еквівалентність інференсу з першоджерелом
до 1e-5, шар за шаром і для кожного розміру, а також виконання функції втрат і
одного кроку навчання на синтетичних вхідних даних. Згідно з документацією самого
train(), не перевірено збіжність повного донавчання, навчання на кількох GPU,
етап повторного завантаження найкращої моделі після припинення аугментації та
перенесення класів Objects365 у COCO. Шлях пози наслідує опублікований рецепт
DETRPose, тобто угорський алгоритм зіставлення за вартістю класу, L1 ключових
точок і OKS із контрастним знешумленням ключових точок; його збіжність також не
перевірено від початку до кінця.
Без додаткових параметрів тренер виконує 74 епохи з lr0=5e-4 та ввімкненою
змішаною точністю за рецептом першоджерела: AdamW, плаский косинусний розклад,
EMA зі значенням 0.9999 і вхідні дані, нормалізовані за ImageNet. Поза й
сегментація потребують imgsz із нативним розміром контрольної точки, оскільки
їхня якірна сітка оцінювання будується під час створення моделі; інше значення
спричиняє помилку до початку запуску. Для пози також потрібен однокласовий датасет,
у data.yaml якого оголошено kpt_shape, а кількість ключових точок відповідає
голові.
Параметр lora=True застосовується лише до виявлення; для пози та сегментації
він спричиняє ValueError. На Apple silicon тренер залишає запуск на GPU та
надсилає на CPU одну операцію, зворотний прохід grid-sample у деформованій увазі,
яку PyTorch не реалізує в Metal.
Датасети, аугментацію, кілька GPU та системи журналювання описано на сторінці навчання.
Валідація
Метод val() повертає словник із ключами за назвами метрик і виводить результати
для кожного класу, якщо verbose залишається ввімкненим.
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)"]) # маскиprint(metrics["metrics/mAP50-95(B)"]) # рамкиПоза повідомляє метрики OKS ключових точок під metrics/keypoints_*. Сегментація
повідомляє маски під звичайним ключем metrics/mAP50-95 і повторює обидва подання
за один прохід, рамки під (B) та маски під (M).
Експорт
| Задача | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection to ONNX: підтримується | Detection to TorchScript: підтримується | Detection to ExecuTorch: підтримується | Detection to TensorRT: підтримується | Detection to OpenVINO: підтримується | Detection to Paddle: підтримується | Detection to MNN: підтримується | Detection to RKNN: не підтримується | Detection to ncnn: не підтримується | Detection to TFLite: не підтримується | Detection to CoreML: не підтримується | Detection to Core AI: підтримується |
| Pose | Pose to ONNX: підтримується | Pose to TorchScript: підтримується | Pose to ExecuTorch: підтримується | Pose to TensorRT: підтримується | Pose to OpenVINO: підтримується | Pose to Paddle: підтримується | Pose to MNN: не підтримується | Pose to RKNN: не підтримується | Pose to ncnn: не підтримується | Pose to TFLite: не підтримується | Pose to CoreML: не підтримується | Pose to Core AI: не підтримується |
| Instance segmentation | Instance segmentation to ONNX: підтримується | Instance segmentation to TorchScript: підтримується | Instance segmentation to ExecuTorch: підтримується | Instance segmentation to TensorRT: підтримується | Instance segmentation to OpenVINO: підтримується | Instance segmentation to Paddle: підтримується | Instance segmentation to MNN: не підтримується | Instance segmentation to RKNN: не підтримується | Instance segmentation to ncnn: не підтримується | Instance segmentation to TFLite: не підтримується | Instance segmentation to CoreML: не підтримується | Instance segmentation to Core AI: не підтримується |
Експортований артефакт повторно завантажується через LibreYOLO() за суфіксом
файлу, тому файл .onnx або .engine поводиться як контрольна точка й повертає
той самий Results. Поза й сегментація експортуються з фіксованими вхідними
даними 640 на 640, а не динамічними формами; кілька цілей виявлення також мають
фіксоване полотно, зокрема OpenVINO, Paddle, MNN, ExecuTorch та Core AI. На
сторінці Експорт наведено аргументи, які приймає кожен формат,
і додаткові пакети, потрібні деяким із них.
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 # Фабрика виконує маршрутизацію за суфіксом файлу, тому експортований артефакт# завантажується як будь-яка контрольна точка й повертає той самий об'єкт Results.model = LibreYOLO("LibreECs.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Контрольні точки
Усі опубліковані файли ваг для цього сімейства.
| Файл | Вхід (пікс.) | Ліцензія ваг |
|---|---|---|
| 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 |
Кожен наведений вище файл уже доступний у організації LibreYOLO і завантажується під час першого використання.
Ліцензування
Перевіряйте ліцензію в репозиторії Hugging Face конкретних ваг, які завантажуєте. Кожна контрольна точка в організації LibreYOLO має ліцензію, і вона не завжди однакова для всього сімейства. Цей репозиторій є авторитетним джерелом, а наведене нижче резюме описує умови на момент останньої перевірки сторінки.
Це опис відповідних ліцензій, а не юридична консультація. Якщо відповідь має комерційне значення, самостійно прочитайте ліцензії та зверніться по юридичну консультацію.
- Оригінальна робота
- EdgeCrafter, Intellindust AI Lab
- Ліцензія першоджерела
- Apache-2.0
- Джерело першоджерела
- github.com/Intellindust-AI-Lab/EdgeCrafter
- Код LibreYOLO
- MIT
- Ваги
- Apache-2.0, повторно опубліковано на huggingface.co/LibreYOLO
- Тлумачення
- 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.
Цитування
@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}
}Скопійовано з блоку цитування авторів на сторінці github.com/Intellindust-AI-Lab/EdgeCrafter#-citation.