YOLOv9

Одностадийный свёрточный детектор: за один проход оценивается плотная сетка рамок, а NMS отбрасывает дубликаты. В LibreYOLO есть три его варианта, и у одного из них шага NMS нет.

Задачи
detection
Размеры
yolo9: t, s, m, c at 640 px; yolo9_p2: t, s at 640 px
Установка
pip install libreyolo
Уровень поддержки
Флагманский, начиная с v1.0.0. Здесь функции проектируются и первыми проходят полную проверку на GPU.
Исходный проект
YOLOv9 от MultimediaTechLab, MIT. Статья, исходный код
Лицензии
Код: MIT, веса: MIT. Коммерческое использование

Установка

YOLOv9 не требует ничего сверх базового пакета.

bash
pip install libreyolo

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

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

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreYOLO9s.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes:    print(box.cls, box.conf, box.xyxy)
CLI
libreyolo predict model=LibreYOLO9s.pt save=True \  source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg
Без NMS
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Тот же вызов, другой чекпойнт. End-to-end голова сама возвращает# предсказания с наибольшими оценками, поэтому NMS не запускается, а iou игнорируется.model = LibreYOLO("LibreYOLO9E2Es.pt")result = model(SAMPLE_IMAGE, conf=0.25, max_det=300) print(len(result.boxes))

Возвращаемый объект Results — тот же, что возвращает любое семейство, поэтому замена на другой детектор — правка в одну строку. У базовой модели и у модели с шагом 4 conf задаёт порог уверенности, а iou — порог NMS. End-to-end модель NMS не запускает и iou игнорирует, поэтому её вывод определяется conf и max_det. Про источники, стриминг и обработку результатов см. предсказание.

Варианты

Три варианта используют общий бэкбон. Все три решают только задачу детекции и принимают одни и те же аргументы.

Базовая модель предсказывает на трёх масштабах признаков и убирает дублирующиеся рамки с помощью NMS.

End-to-end модель сохраняет эту голову и добавляет рядом ветку с сопоставлением один к одному. Инференс читает только эту ветку и берёт из неё предсказания с наибольшими оценками, поэтому NMS не запускается. Выбирайте её, когда в среде выполнения, куда вы разворачиваете модель, нет оператора NMS.

Модель с шагом 4 выводит наружу ещё один уровень бэкбона, протягивает до него neck и предсказывает на четырёх масштабах вместо трёх. Дополнительный масштаб нужен для объектов, занимающих мало пикселей; единственный опубликованный для неё чекпойнт обучен на аэрофотоснимках. Базовые детекционные чекпойнты в неё переносятся: бэкбон и neck загружаются без изменений, три предобученные башни головы сдвигаются на одну позицию вверх, а башня с шагом 4 стартует со случайной инициализации.

ЧекпойнтВход (пикс.)mAP 50-95Параметры (млн)
LibreYOLO9c64056.425.5
LibreYOLO9m64055.320.12
LibreYOLO9s64055.97.2
LibreYOLO9t64054.02.02

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

Обучение

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.train(data="my-dataset.yaml", epochs=100, imgsz=640, batch=16)
CLI
libreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml \  epochs=100 imgsz=640 batch=16
Мелкие объекты
from libreyolo import LibreYOLO9P2 # У варианта с шагом 4 нет собственного чекпойнта на COCO, поэтому# укажите базовый детекционный: его бэкбон и neck загрузятся без# изменений, а башня головы с шагом 4 стартует со случайной инициализации.model = LibreYOLO9P2(None, size="s")model.train(data="my-dataset.yaml", epochs=100, pretrained="LibreYOLO9s.pt")

pretrained определяет, с чего начинается запуск. Передайте True, чтобы загрузить опубликованный чекпойнт для той же модели и того же размера, или имя либо путь — для всего остального. Тензоры с несовпадающей формой пропускаются, а не приводят к ошибке, и в лог пишется, сколько их загрузилось, поэтому чекпойнт, обученный на другом числе классов, всё равно годится как стартовая точка.

У модели с шагом 4 нет собственного опубликованного чекпойнта на COCO, поэтому в этом случае True указывает на несуществующий файл, и скачивание падает. Вместо этого укажите базовый детекционный чекпойнт.

Про датасеты, аугментацию, multi-GPU и логгеры см. обучение.

Валидация

val() возвращает словарь с ключами metrics/ для точности, полноты, mAP 50 и mAP 50-95, измеренных на любом датасете в том формате, на котором вы обучались.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])
CLI
libreyolo val model=LibreYOLO9s.pt data=my-dataset.yaml
Проверка на COCO
# Во встроенном COCO yaml есть скрипт скачивания, поэтому нужно явное# разрешение, если датасет ещё не лежит локально.libreyolo val model=LibreYOLO9c.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: поддерживается

Галочка действует для всех трёх вариантов: там, где они расходятся, в таблице стоит самый слабый из трёх.

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

Для базовой детекционной модели половину с постпроцессингом можно перенести в граф. nms=True при экспорте в ONNX помещает подавление внутрь модели, и первый выход становится тензором фиксированной формы (1, max_det, 6), строки которого — x1, y1, x2, y2, score, class, дополненные нулями после числа детекций. Такой граф рассчитан на батч 1 и не содержит динамических осей. End-to-end модель и модель с шагом 4 этот флаг не принимают.

Каждый формат устанавливает свой extra и принимает несколько собственных аргументов. И то и другое описано на странице этого формата.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.export(format="onnx", imgsz=640)
CLI
libreyolo export model=LibreYOLO9s.pt format=onnx imgsz=640
С NMS в графе
libreyolo export model=LibreYOLO9s.pt format=onnx nms=True \  conf=0.25 iou=0.45 max_det=300
Использование экспортированного файла
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика выбирает путь по суффиксу файла, поэтому экспортированный# артефакт загружается как любой чекпойнт и возвращает тот же объект Results.model = LibreYOLO("LibreYOLO9s.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)

Чекпойнты

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

ФайлВход (пикс.)Лицензия весов
Detection
LibreYOLO9t.pt640mit
LibreYOLO9s.pt640mit
LibreYOLO9m.pt640mit
LibreYOLO9c.pt640mit
LibreYOLO9E2Et.pt640mit
LibreYOLO9E2Es.pt640mit
LibreYOLO9E2Em.pt640mit
LibreYOLO9E2Ec.pt640mit
LibreYOLO9P2s-visdrone.ptcc-by-nc-sa-3.0

Все перечисленные выше файлы уже доступны в организации LibreYOLO и скачиваются при первом использовании.

Лицензирование

Проверяйте лицензию в репозитории конкретных весов на Hugging Face. Она указана для каждого чекпойнта в организации LibreYOLO и может различаться даже внутри одного семейства. Этот репозиторий считается авторитетным источником, а сводка ниже описывает условия на момент последней проверки страницы.

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

Оригинальная работа
YOLOv9, MultimediaTechLab
Лицензия исходного проекта
MIT
Исходный код проекта
github.com/MultimediaTechLab/YOLO
Код LibreYOLO
MIT
Веса
MIT, повторно опубликованы на huggingface.co/LibreYOLO
Толкование
MIT is a permissive license, so these weights can be used in commercial and closed-source products. The one standing obligation is to keep the license text and the copyright notice, Kin-Yiu Wong and Hao-Tang Tsui, with any copy you redistribute. It places no condition on your own application code, and a model you train yourself on your own data is yours. Two things are worth knowing beyond that. The port follows the authors' MIT re-release of YOLOv9, not the GPL-3.0 repository that carries the same model, so the permissive terms come from the source LibreYOLO actually derives from. And one checkpoint in this family is not MIT: the stride-4 model trained on VisDrone2019-DET inherits that dataset's CC BY-NC-SA 3.0 terms, which rule out commercial use and require share-alike on anything derived from it.

Один чекпойнт здесь не под MIT. Модель с шагом 4, обученная на VisDrone2019-DET, наследует условия CC BY-NC-SA 3.0 этого датасета: только некоммерческое использование, share-alike для всего производного от неё — и всё это за пределами разрешительной лицензии, под которой поставляется остальное семейство. Она предсказывает классы VisDrone для аэросъёмки, а не классы COCO. Библиотека выводит всё это перед тем, как скачать файл.

Цитирование

@inproceedings{wang2024yolov9,
      title={{YOLOv9}: Learning What You Want to Learn Using Programmable Gradient Information},
      author={Wang, Chien-Yao and Yeh, I-Hau and Liao, Hong-Yuan Mark},
      year={2024},
      booktitle={Proceedings of the European Conference on Computer Vision (ECCV)},
}

Скопировано из блока цитирования авторов на странице github.com/MultimediaTechLab/YOLO#citations.

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