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