EdgeCrafter
Компактный визуальный трансформер для плотного предсказания на edge-устройствах, опубликованный в апстриме как три родственные модели: ECDet, ECPose и ECSeg. LibreYOLO загружает все три как одно семейство, а задачу несёт чекпойнт.
- Задачи
- detection, pose, instance segmentation
- Размеры
- s, m, l, x at 640 px
- Установка
pip install libreyolo- Уровень поддержки
- Основной, начиная с v1.2.0. Основные обучаемые детекторы: функции появляются вслед за флагманами в той же волне релиза.
- Исходный проект
- EdgeCrafter от Intellindust AI Lab, Apache-2.0. Статья, исходный код
- Лицензии
- Код: Apache-2.0, веса: Apache-2.0. Коммерческое использование
Установка
EdgeCrafter не требует опциональных extra. Всё, что он импортирует, входит в базовую установку.
pip install libreyoloИсключение — дообучение адаптерами с lora=True: ему нужен extra 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 в имени файла выбирает голову ключевых точек,# поэтому аргумент task здесь не нужен.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 внутри deformable attention,
который PyTorch не реализует в Metal.
Про датасеты, аугментацию, multi-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.