Посмотреть как Markdown

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. Всё, что он импортирует, входит в базовую установку.

bash
pip install libreyolo

Исключение — дообучение адаптерами с lora=True: ему нужен extra lora.

bash
pip install "libreyolo[lora]"

Предсказание

Веса скачиваются с Hugging Face при первом запуске и кэшируются локально.

Python
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)
CLI
libreyolo predict model=LibreECs.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
Оценка позы
from 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Параметры (млн)
LibreECl64060.132.97
LibreECm64058.419.43
LibreECs64054.39.88
LibreECx64061.149.94

COCO val2017, 500 images. Измерено системой бенчмарков LibreYOLO и опубликовано на Vision Analysis, где сравниваются задержки на разном оборудовании и в разных средах выполнения и хранятся полные записи запусков.

Апстрим публикует ECDet, ECPose и ECSeg как три отдельные модели, а не одну модель с тремя головами. У них общий бэкбон ECViT и общий гибридный энкодер, а различаются они только головой, поэтому LibreYOLO сводит их в одно семейство и оставляет задачу за именем файла чекпойнта. Поэтому буква размера означает один и тот же бэкбон и энкодер во всех трёх, а предсказание, валидация и экспорт принимают одни и те же аргументы, какую бы из них вы ни загрузили.

Обучение

Все три задачи обучаются через train(): он читает задачу из загруженного чекпойнта и подбирает подходящий тренер.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreECs.pt")model.train(    data="my-dataset.yaml",    epochs=50,    imgsz=640,    batch=8,    lr0=5e-4,)
CLI
libreyolo train model=LibreECs.pt data=my-dataset.yaml epochs=50 imgsz=640 batch=8 lr0=5e-4
Оценка позы
from 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,)
LoRA
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 оставлен включённым.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreECs.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])
CLI
libreyolo val model=LibreECs.pt data=my-dataset.yaml
Оценка позы
from 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).

Экспорт

ЗадачаONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
DetectionDetection 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: поддерживается
PosePose 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 segmentationInstance 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. Экспорт перечисляет аргументы, которые принимает каждый формат, и те дополнительные, что добавляют некоторые из них.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreECs.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)
CLI
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=640
Использование экспортированного файла
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика выбирает загрузчик по расширению файла, поэтому# экспортированный артефакт загружается как любой чекпойнт и# возвращает тот же объект Results.model = LibreYOLO("LibreECs.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)

Чекпойнты

Все опубликованные файлы весов этого семейства.

ФайлВход (пикс.)Лицензия весов
Detection
LibreECs.pt640apache-2.0
LibreECm.pt640apache-2.0
LibreECl.pt640apache-2.0
LibreECx.pt640apache-2.0
Pose
LibreECs-pose.pt640apache-2.0
LibreECm-pose.pt640apache-2.0
LibreECl-pose.pt640apache-2.0
LibreECx-pose.pt640apache-2.0
Instance segmentation
LibreECs-seg.pt640apache-2.0
LibreECm-seg.pt640apache-2.0
LibreECl-seg.pt640apache-2.0
LibreECx-seg.pt640apache-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.

Проверено с LibreYOLO v1.5.0. Таблицы поддержки, чекпойнты и результаты бенчмарков на этой странице сгенерированы из выпущенной библиотеки и опубликованных весов, а не написаны вручную.