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 original COCO weights; restricted obj2coco weights. Статья, исходный код
- Лицензии
- Код: Apache-2.0, веса: Apache-2.0 original COCO weights; restricted obj2coco weights. Коммерческое использование
Установка
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. Про источники, стриминг и обработку результатов
см. предсказание.
Предсказание для детекции принимает прямоугольный imgsz=(height, width); обучение и экспорт сохраняют собственные ограничения формы.
Варианты
Четыре размера. Все они работают на одном и том же входном разрешении, поэтому таблица разделяет их по числу параметров и точности.
| Чекпойнт | Вход (пикс.) | 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 |
| LibreECl-obj2coco.pt | other | |
| LibreECm-obj2coco.pt | other | |
| LibreECs-obj2coco.pt | other | |
| LibreECx-obj2coco.pt | other | |
| 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 |
| LibreECl-pose-obj2coco.pt | other | |
| LibreECm-pose-obj2coco.pt | other | |
| LibreECs-pose-obj2coco.pt | other | |
| LibreECx-pose-obj2coco.pt | other | |
| 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 |
| LibreECm-seg-obj2coco.pt | other | |
| LibreECs-seg-obj2coco.pt | other | |
| LibreECl-seg-obj2coco.pt | other | |
| LibreECx-seg-obj2coco.pt | other | |
Все перечисленные выше файлы уже доступны в организации LibreYOLO и скачиваются при первом использовании.
Варианты obj2coco охватывают детекцию, сегментацию и оценку позы. Их скачивание требует явного согласия, а условия исходного проекта ограничивают коммерческое использование. Исходные чекпойнты COCO сохраняют записанное разрешение Apache-2.0.
Лицензирование
Проверяйте лицензию в репозитории конкретных весов на Hugging Face. Она указана для каждого чекпойнта в организации LibreYOLO и может различаться даже внутри одного семейства. Этот репозиторий считается авторитетным источником, а сводка ниже описывает условия на момент последней проверки страницы.
Это описание соответствующих лицензий, а не юридическая консультация. Если ответ важен для коммерческого использования, прочитайте лицензии самостоятельно и проконсультируйтесь с юристом.
- Оригинальная работа
- EdgeCrafter, Intellindust AI Lab
- Лицензия исходного проекта
- Apache-2.0 original COCO weights; restricted obj2coco weights
- Исходный код проекта
- github.com/Intellindust-AI-Lab/EdgeCrafter
- Код LibreYOLO
- MIT
- Веса
- Apache-2.0 original COCO weights; restricted obj2coco weights, повторно опубликованы на huggingface.co/LibreYOLO
- Толкование
- Original COCO checkpoints retain their recorded Apache-2.0 grant. The obj2coco detection, segmentation and pose variants require explicit opt-in and retain non-commercial upstream terms. The library code license does not replace those weight terms.
Цитирование
@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.