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 # Той самий виклик, інша контрольна точка. Наскрізна голова повертає власні# передбачення з найвищими оцінками, тому 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. Наскрізна модель не запускає NMS та ігнорує iou, тому її вивід визначають conf і max_det. Докладніше про джерела, потокове оброблення та роботу з результатами дивіться в розділі передбачення.

Варіанти

Три варіанти мають спільний бекбон. Усі три призначені лише для виявлення об'єктів і приймають однакові аргументи.

Базова модель робить передбачення на трьох масштабах ознак і усуває дублікати рамок за допомогою NMS.

Наскрізна модель зберігає цю голову й додає поряд із нею гілку зіставлення один-до-одного. Під час інференсу зчитується лише гілка один-до-одного, з якої вибираються передбачення з найвищими оцінками, тому 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 для неї визначається як файл, якого не існує, і завантаження завершується помилкою. Натомість укажіть базову контрольну точку виявлення.

Докладніше про датасети, аугментацію, кілька 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 і не містить динамічних осей. Наскрізна модель і модель із кроком 4 не приймають цей прапорець.

Кожен формат установлює окремий додатковий пакет і приймає кілька власних аргументів. Обидва аспекти описано на сторінці цього формату.

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 цього датасету: лише некомерційне використання, поширення похідних матеріалів на тих самих умовах і відсутність дії дозвільної ліцензії, під якою розповсюджується решта цього сімейства. Вона передбачає класи повітряних знімків 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. Таблиці підтримки, контрольні точки й результати бенчмарків на цій сторінці згенеровано з випущеної бібліотеки та опублікованих ваг, а не написано вручну.