YOLO-NAS
Свёрточный детектор, бэкбон и neck которого получены поиском архитектуры в Deci.AI и собраны из блоков RepVGG, рассчитанных на квантизацию. Веса принадлежат Deci.AI, лицензированы только для некоммерческого использования, и LibreYOLO их не публикует.
- Задачи
- detection, pose
- Размеры
- s, m, l at 640 px
- Установка
pip install libreyolo- Уровень поддержки
- Основной, начиная с v1.1.0. Основные обучаемые детекторы: функции появляются вслед за флагманами в той же волне релиза.
- Исходный проект
- YOLO-NAS от Deci.AI, Deci.AI proprietary, non-commercial. Статья, исходный код
- Лицензии
- Код: Apache-2.0, веса: Deci.AI proprietary, non-commercial. Коммерческое использование
Установка
YOLO-NAS не требует ничего сверх базового пакета.
pip install libreyoloПредсказание
Имя чекпойнта, которого ещё нет на диске, скачивается с публичного CDN компании Deci, а не из организации LibreYOLO: она не хранит эти веса. Перед началом передачи библиотека один раз за процесс печатает условия лицензии Deci, а перед открытием скачанного файла его SHA-256 сверяется с зафиксированным значением. Что именно разрешают эти условия, описано в разделе лицензирование.
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Имя, которого ещё нет на диске, скачивается с CDN компании Deci.# Перед скачиванием печатаются условия лицензии Deci; забирая файл, вы их принимаете.model = LibreYOLO("LibreYOLONASs.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes: print(box.cls, box.conf, box.xyxy)libreyolo predict model=LibreYOLONASs.pt save=True \ source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpgfrom libreyolo import LibreYOLO, SAMPLE_IMAGE # Суффикс -pose выбирает голову позы и её собственный набор весов.model = LibreYOLO("LibreYOLONASs-pose.pt")result = model(SAMPLE_IMAGE) print(result.keypoints.xy)Возвращаемый объект Results — тот же, что возвращает любое семейство, поэтому
замена на другой детектор занимает одну строку. conf задаёт порог
уверенности, а iou — порог NMS. Про источники, стриминг и обработку
результатов см. предсказание.
Варианты
Детекция и оценка позы — одна и та же архитектура под разными головами, и они принимают одни и те же аргументы. Размеры в таблице ниже относятся к детекции; для оценки позы опубликованы они же и ещё один, меньший. Голова позы предсказывает набор ключевых точек COCO.
| Чекпойнт | Вход (пикс.) | mAP 50-95 | Параметры (млн) |
|---|---|---|---|
| LibreYOLONASl | 640 | 56.3 | 66.98 |
| LibreYOLONASm | 640 | 55.4 | 51.18 |
| LibreYOLONASs | 640 | 51.8 | 19.05 |
COCO val2017, 500 images. Измерено системой бенчмарков LibreYOLO и опубликовано на Vision Analysis, где сравниваются задержки на разном оборудовании и в разных средах выполнения и хранятся полные записи запусков.
Обучение
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLONASs.pt")model.train(data="my-dataset.yaml", epochs=100, imgsz=640, batch=16)libreyolo train model=LibreYOLONASs.pt data=my-dataset.yaml \ epochs=100 imgsz=640 batch=16from libreyolo import LibreYOLONAS # Ни один чекпойнт Deci не задействован: модель стартует со случайных весов,# поэтому результат запуска получен только из ваших данных.model = LibreYOLONAS(None, size="s")model.train(data="my-dataset.yaml", imgsz=640, batch=16)epochs, lr0 и amp определяются под задачу, если вы их не задали, поэтому
запуск для оценки позы стартует с других значений по умолчанию, чем запуск для
детекции. Оптимизатор по умолчанию — AdamW. Число классов берётся из YAML
датасета, и перед первой эпохой голова пересобирается под него; на голове позы
число ключевых точек обрабатывается так же, поэтому чекпойнт позы COCO можно
дообучить под скелет другого размера.
Дообучение стартует с весов Deci — именно это и покрывает лицензия Deci. Обучение модели со случайной инициализацией вообще не задействует чекпойнт Deci, и это третий пример кода выше.
Про датасеты, аугментацию, multi-GPU и логгеры см. обучение.
Валидация
val() возвращает словарь с ключами metrics/, покрывающими точность,
полноту, mAP 50 и mAP 50-95, измеренные на любом датасете в том же формате, в
котором вы обучали модель.
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLONASs.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreYOLONASs.pt data=my-dataset.yaml# В поставляемом YAML для COCO есть встроенный скрипт скачивания, поэтому# нужно явное разрешение, если датасет ещё не лежит локально.libreyolo val model=LibreYOLONASl.pt data=coco.yaml imgsz=640 \ allow_download_scripts=TrueЭкспорт
| Задача | 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: не поддерживается |
Экспортированный артефакт загружается обратно через LibreYOLO() по расширению
файла, поэтому файл .onnx или .engine ведёт себя как чекпойнт и возвращает
тот же Results. Запуск графа в голой среде выполнения, без установленной
библиотеки LibreYOLO, тоже поддерживается, но тогда предобработку и
постобработку вам придётся писать самостоятельно. Каждый формат ставится через
свой extra и принимает несколько собственных аргументов. И то и другое описано
на странице этого формата.
Экспорт — это ещё одна копия тех же весов в другом контейнере. Экспорт чекпойнта Deci не меняет ни того, откуда взялись веса, ни лицензии, которая на них распространяется.
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLONASs.pt")model.export(format="onnx", imgsz=640)libreyolo export model=LibreYOLONASs.pt format=onnx imgsz=640from libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика выбирает путь по расширению файла, поэтому экспортированный артефакт# загружается как любой чекпойнт и возвращает тот же объект Results.model = LibreYOLO("LibreYOLONASs.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Чекпойнты
Перечислять нечего. Лицензия Deci запрещает распространение, поэтому
организация LibreYOLO не публикует веса YOLO-NAS и скачивание уходит в другое
место: имя вида LibreYOLONAS<size>.pt или LibreYOLONAS<size>-pose.pt для
оценки позы отображается на соответствующий объект на публичном CDN компании
Deci.
Так скачиваются только те чекпойнты, чей SHA-256 зафиксирован в библиотеке. Всё
остальное завершается отказом, а не открытием непроверенного стороннего
pickle-файла, и такой файл придётся скачать вручную и указать путь к нему.
Файл, уже лежащий на диске, загружается по своему пути, без скачивания и без
проверки контрольной суммы. Это касается и файла .pth от Deci под его исходным именем:
загрузчик его распознаёт.
Лицензирование
Проверяйте лицензию в репозитории конкретных весов на Hugging Face. Она указана для каждого чекпойнта в организации LibreYOLO и может различаться даже внутри одного семейства. Этот репозиторий считается авторитетным источником, а сводка ниже описывает условия на момент последней проверки страницы.
Это описание соответствующих лицензий, а не юридическая консультация. Если ответ важен для коммерческого использования, прочитайте лицензии самостоятельно и проконсультируйтесь с юристом.
- Оригинальная работа
- YOLO-NAS, Deci.AI
- Лицензия исходного проекта
- Deci.AI proprietary, non-commercial
- Исходный код проекта
- github.com/Deci-AI/super-gradients
- Код LibreYOLO
- MIT
- Веса
- Deci.AI proprietary, non-commercial, распространяются авторами. LibreYOLO не размещает и не зеркалирует их.
- Толкование
- Two licenses apply here and they are not the same. The SuperGradients source this port follows is Apache-2.0 and LibreYOLO's own implementation is MIT, so nothing restricts the architecture or the training code. Deci's published checkpoints are a different matter: the YOLO-NAS license grants a revocable, non-transferable right to use them and nothing more. It forbids redistribution and sublicensing, forbids offering them as a managed or remote service, restricts modification and reverse engineering, and rules out commercial use, including any model running in a production environment, unless you hold a separate agreement with Deci. LibreYOLO therefore does not mirror them, and prints those terms once before the download starts. Weights trained from a randomly initialized model on your own data derive from no Deci checkpoint.
LibreYOLO не размещает эти веса у себя и не делает их зеркал: в организации LibreYOLO на Hugging Face для этого семейства нет ничего. Каждое автоматическое скачивание вместо этого идёт на публичный CDN компании Deci, один раз за процесс печатает условия Deci перед началом и сверяется с зафиксированным SHA-256 до открытия файла.
Альтернатива — обучение модели со случайной инициализацией. Архитектура в апстриме под Apache-2.0, а здесь под MIT, поэтому модель, обученная так на ваших данных, не происходит ни от одного чекпойнта Deci.
Цитирование
YOLO-NAS вышел без статьи. Запись ниже — та, о которой просят его авторы; она относится к SuperGradients, библиотеке, в составе которой он вышел.
@misc{supergradients,
doi = {10.5281/ZENODO.7789328},
url = {https://zenodo.org/record/7789328},
author = {Aharon, Shay and {Louis-Dupont} and {Ofri Masad} and Yurkova, Kate and {Lotem Fridman} and {Lkdci} and Khvedchenya, Eugene and Rubin, Ran and Bagrov, Natan and Tymchenko, Borys and Keren, Tomer and Zhilko, Alexander and {Eran-Deci}},
title = {Super-Gradients},
publisher = {GitHub},
journal = {GitHub repository},
year = {2021},
}Скопировано из блока цитирования авторов на странице github.com/Deci-AI/super-gradients#citing.