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 не требует ничего сверх базового пакета.
pip install libreyoloПредсказание
Веса скачиваются с Hugging Face при первом запуске и кэшируются локально.
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)libreyolo predict model=LibreYOLO9s.pt save=True \ source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpgfrom 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 | Параметры (млн) |
|---|---|---|---|
| LibreYOLO9c | 640 | 56.4 | 25.5 |
| LibreYOLO9m | 640 | 55.3 | 20.12 |
| LibreYOLO9s | 640 | 55.9 | 7.2 |
| LibreYOLO9t | 640 | 54.0 | 2.02 |
COCO val2017, 500 images. Измерено системой бенчмарков LibreYOLO и опубликовано на Vision Analysis, где сравниваются задержки на разном оборудовании и в разных средах выполнения и хранятся полные записи запусков.
Обучение
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.train(data="my-dataset.yaml", epochs=100, imgsz=640, batch=16)libreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml \ epochs=100 imgsz=640 batch=16from 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, измеренных на любом датасете в том формате, на котором вы обучались.
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreYOLO9s.pt data=my-dataset.yaml# Во встроенном COCO yaml есть скрипт скачивания, поэтому нужно явное# разрешение, если датасет ещё не лежит локально.libreyolo val model=LibreYOLO9c.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: поддерживается |
Галочка действует для всех трёх вариантов: там, где они расходятся, в таблице стоит самый слабый из трёх.
Экспортированный артефакт загружается обратно через LibreYOLO() по суффиксу
файла, поэтому файл .onnx или .engine ведёт себя как чекпойнт и возвращает
тот же Results. Запуск графа в чистой среде выполнения, без установленной
библиотеки LibreYOLO, тоже поддерживается, но тогда препроцессинг и
постпроцессинг придётся писать самостоятельно.
Для базовой детекционной модели половину с постпроцессингом можно перенести в
граф. nms=True при экспорте в ONNX помещает подавление внутрь модели, и
первый выход становится тензором фиксированной формы (1, max_det, 6), строки
которого — x1, y1, x2, y2, score, class, дополненные нулями после числа
детекций. Такой граф рассчитан на батч 1 и не содержит динамических осей.
End-to-end модель и модель с шагом 4 этот флаг не принимают.
Каждый формат устанавливает свой extra и принимает несколько собственных аргументов. И то и другое описано на странице этого формата.
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.export(format="onnx", imgsz=640)libreyolo export model=LibreYOLO9s.pt format=onnx imgsz=640libreyolo export model=LibreYOLO9s.pt format=onnx nms=True \ conf=0.25 iou=0.45 max_det=300from libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика выбирает путь по суффиксу файла, поэтому экспортированный# артефакт загружается как любой чекпойнт и возвращает тот же объект Results.model = LibreYOLO("LibreYOLO9s.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Чекпойнты
Все опубликованные файлы весов этого семейства.
| Файл | Вход (пикс.) | Лицензия весов |
|---|---|---|
| Detection | ||
| LibreYOLO9t.pt | 640 | mit |
| LibreYOLO9s.pt | 640 | mit |
| LibreYOLO9m.pt | 640 | mit |
| LibreYOLO9c.pt | 640 | mit |
| LibreYOLO9E2Et.pt | 640 | mit |
| LibreYOLO9E2Es.pt | 640 | mit |
| LibreYOLO9E2Em.pt | 640 | mit |
| LibreYOLO9E2Ec.pt | 640 | mit |
| LibreYOLO9P2s-visdrone.pt | cc-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.