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 не требует ничего сверх базового пакета.

bash
pip install libreyolo

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

Имя чекпойнта, которого ещё нет на диске, скачивается с публичного CDN компании Deci, а не из организации LibreYOLO: она не хранит эти веса. Перед началом передачи библиотека один раз за процесс печатает условия лицензии Deci, а перед открытием скачанного файла его SHA-256 сверяется с зафиксированным значением. Что именно разрешают эти условия, описано в разделе лицензирование.

Python
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)
CLI
libreyolo predict model=LibreYOLONASs.pt save=True \  source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg
Оценка позы
from 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Параметры (млн)
LibreYOLONASl64056.366.98
LibreYOLONASm64055.451.18
LibreYOLONASs64051.819.05

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

Обучение

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLONASs.pt")model.train(data="my-dataset.yaml", epochs=100, imgsz=640, batch=16)
CLI
libreyolo train model=LibreYOLONASs.pt data=my-dataset.yaml \  epochs=100 imgsz=640 batch=16
Обучение с нуля
from 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, измеренные на любом датасете в том же формате, в котором вы обучали модель.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLONASs.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])
CLI
libreyolo val model=LibreYOLONASs.pt data=my-dataset.yaml
Валидация на COCO
# В поставляемом YAML для COCO есть встроенный скрипт скачивания, поэтому# нужно явное разрешение, если датасет ещё не лежит локально.libreyolo val model=LibreYOLONASl.pt data=coco.yaml imgsz=640 \  allow_download_scripts=True

Экспорт

Задача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: не поддерживается

Экспортированный артефакт загружается обратно через LibreYOLO() по расширению файла, поэтому файл .onnx или .engine ведёт себя как чекпойнт и возвращает тот же Results. Запуск графа в голой среде выполнения, без установленной библиотеки LibreYOLO, тоже поддерживается, но тогда предобработку и постобработку вам придётся писать самостоятельно. Каждый формат ставится через свой extra и принимает несколько собственных аргументов. И то и другое описано на странице этого формата.

Экспорт — это ещё одна копия тех же весов в другом контейнере. Экспорт чекпойнта Deci не меняет ни того, откуда взялись веса, ни лицензии, которая на них распространяется.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLONASs.pt")model.export(format="onnx", imgsz=640)
CLI
libreyolo export model=LibreYOLONASs.pt format=onnx imgsz=640
Использование экспортированного файла
from 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.

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