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 | 41.8 | 2.04 |
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 та засоби журналювання дивіться в розділі навчання.
Базова модель може навчати допоміжну гілку PGI поряд зі своєю основною
головою. Гілка використовується лише під час навчання: передбачення й експорт
працюють з основною головою. Запуск під'єднує її, коли початкові ваги містять
тензори PGI або коли навчання йде з нуля. Опубліковані базові контрольні точки
їх не містять, тому донавчання з них навчає лише основну голову й повідомляє про
це в лозі. aux_weight=0.25 усе одно під'єднує нову гілку з цією вагою втрат, а
aux_weight=0 тримає її вимкненою. Відновлений запуск зберігає налаштування PGI
своєї контрольної точки. На розмірах m і c гілка така сама, як в upstream:
другий бекбон на вхідному зображенні, етапи якого CBFuse підсумовує з
відгалуженнями CBLinear основного бекбона, і власна голова, 12.8M та 25.7M
параметрів лише для навчання за 80 класів. Наскрізна модель і модель із кроком 4
гілки PGI не мають.
Усі три варіанти обрізають L2-норму градієнта до 10 перед кожним кроком
оптимізатора; clip_max_norm=0 вимикає обрізання. Призначення міток оцінює
якорі в fp32, також і під автоматичним приведенням типів float16.
max_labels=300 обмежує кількість рамок, що зберігаються для одного навчального
зображення, а рамки понад ліміт відкидаються з одноразовим попередженням; пам'ять
для призначення залежить від справжніх рамок кожного зображення, а не від ліміту.
Імпульс SGD зростає від 0.8 до 0.937 протягом трьох епох. letterbox_pad=None
успадковує позначку контрольної точки: ваги без позначки використовують
topleft, а нові офіційні конверсії записують center.
Mosaic у YOLO9 і YOLOX надає перевагу зображенням із розміткою, виконуючи до 20 спроб вибору; MixUp у YOLO9 використовує те саме правило. MixUp типово вимкнено (mixup_prob=0). Коли його ввімкнено, коефіцієнт змішування береться з Beta(1, 1), рівномірно на [0, 1], як у MultimediaTechLab/YOLO. Профілі вхідних даних, відмінні від RGB, описано в розділі гістограм подій.
Валідація
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)TFLite INT8 використовує int8=True з калібрувальними даними.
Входи та виходи ONNX
LibreYOLO9
| Тензор | images float32 [batch, 3, height, width] |
|---|---|
| Колір | RGB |
| Масштабування | піксель / 255 |
| Нормалізація | немає |
| Зміна розміру | letterbox, bilinear, значення заповнення 114, положення заповнення береться з ключа метаданих letterbox_pad |
Scale by r = min(height / h, width / w), resize to (int(w * r), int(h * r)) and paste onto a canvas filled with 114.
Paste position comes from the letterbox_pad metadata key: topleft puts the image in the top-left corner, center splits the padding on both sides. A missing key means topleft.
Detection, експорт за замовчуванням
| Вихід | Форма | Значення |
|---|---|---|
output | [batch, 4 + nc, anchors] | Rows 0 to 3 are x1, y1, x2, y2 in input-canvas pixels. Rows 4 onward are per-class scores, sigmoid already applied. anchors is the cell count over strides 8, 16 and 32, 8400 at 640 x 640. |
Постобробка
- Transpose to [anchors, 4 + nc].
- Keep every (anchor, class) pair whose score is above the confidence threshold (0.25 by default). One anchor can yield several classes.
- Run NMS per class with IoU 0.45 and keep at most 300 detections.
- Map boxes back to the original image: subtract the pad offset, divide by r, clip to the image.
- Drop boxes whose width or height is 0 after clipping.
Detection, nms=True
| Вихід | Форма | Значення |
|---|---|---|
output | [1, max_det, 6] | Rows are x1, y1, x2, y2, score, class in input-canvas pixels, zero-padded past the detection count. Confidence, IoU and max_det are baked in and recorded as nms_conf, nms_iou and max_det metadata. |
raw | [1, 4 + nc, anchors] | The same tensor as the default export's output, before suppression. |
Постобробка
- Drop rows whose score is 0 or below your threshold.
- Map boxes back to the original image: subtract the pad offset, divide by r, clip to the image.
LibreYOLO9E2E
| Тензор | images float32 [batch, 3, height, width] |
|---|---|
| Колір | RGB |
| Масштабування | піксель / 255 |
| Нормалізація | немає |
| Зміна розміру | letterbox, bilinear, значення заповнення 114, положення заповнення береться з ключа метаданих letterbox_pad |
Scale by r = min(height / h, width / w), resize to (int(w * r), int(h * r)) and paste onto a canvas filled with 114.
Paste position comes from the letterbox_pad metadata key: topleft puts the image in the top-left corner, center splits the padding on both sides. A missing key means topleft.
This model has no nms=True export. The exporter raises NotImplementedError, so only the default export below exists.
Detection, експорт за замовчуванням
| Вихід | Форма | Значення |
|---|---|---|
output | [batch, 4 + nc, anchors] | Predictions of the one-to-one head only. Rows 0 to 3 are x1, y1, x2, y2 in input-canvas pixels. Rows 4 onward are per-class scores, sigmoid already applied. anchors is the cell count over strides 8, 16 and 32, 8400 at 640 x 640. |
Постобробка
- Transpose to [anchors, 4 + nc].
- Flatten the [anchors, nc] scores into one list of anchors x nc (anchor, class) pairs. Pair i belongs to anchor i / nc (integer division) and class i % nc.
- Keep the 300 highest-scoring pairs (max_det), highest first. One anchor can yield several classes.
- Of those, keep the pairs whose score is above the confidence threshold (0.25 by default).
- Do not run NMS. The one-to-one head is trained to fire once per object, and LibreYOLO ignores the iou setting for this model.
- Map boxes back to the original image: subtract the pad offset, divide by r, clip to the image.
- Drop boxes whose width or height is 0 after clipping.
LibreYOLO9P2
| Тензор | images float32 [batch, 3, height, width] |
|---|---|
| Колір | RGB |
| Масштабування | піксель / 255 |
| Нормалізація | немає |
| Зміна розміру | letterbox, bilinear, значення заповнення 114, положення заповнення береться з ключа метаданих letterbox_pad |
Scale by r = min(height / h, width / w), resize to (int(w * r), int(h * r)) and paste onto a canvas filled with 114.
Paste position comes from the letterbox_pad metadata key: topleft puts the image in the top-left corner, center splits the padding on both sides. A missing key means topleft.
This model has no nms=True export. The exporter raises NotImplementedError, so only the default export below exists.
Detection, експорт за замовчуванням
| Вихід | Форма | Значення |
|---|---|---|
output | [batch, 4 + nc, anchors] | Rows 0 to 3 are x1, y1, x2, y2 in input-canvas pixels. Rows 4 onward are per-class scores, sigmoid already applied. anchors is the cell count over strides 4, 8, 16 and 32, 34000 at 640 x 640. nc is 10 for LibreYOLO9P2s-visdrone. |
Постобробка
- Transpose to [anchors, 4 + nc].
- Keep every (anchor, class) pair whose score is above the confidence threshold (0.25 by default). One anchor can yield several classes.
- Run NMS per class with IoU 0.45 and keep at most 300 detections.
- Map boxes back to the original image: subtract the pad offset, divide by r, clip to the image.
- Drop boxes whose width or height is 0 after clipping.
Щоб перевірити власну реалізацію, пропустіть той самий файл через LibreYOLO: LibreYOLO("model.onnx").predict("image.jpg") повертає еталонні результати. Перевірено на LibreYOLO 1.7.0.
Контрольні точки
Усі опубліковані файли ваг цього сімейства.
| Файл | Вхід (пікс.) | Ліцензія ваг |
|---|---|---|
| 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 code is ported from the authors' MIT re-release of YOLOv9, MultimediaTechLab/YOLO at commit c4cb5f6f, 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 weight repository of the stride-4 VisDrone model, LibreYOLO9P2s-visdrone.pt, declares CC BY-NC-SA 3.0, which rules out commercial use and requires share-alike on derivatives.
Код усіх трьох варіантів портовано з
MultimediaTechLab/YOLO на коміті
c4cb5f6f (MIT). Однокроковий предиктор наскрізної моделі відповідає задуму
DATE авторства Yiqun Chen (Apache-2.0),
реалізованому для LibreYOLO без копіювання коду DATE. Рівень із кроком 4 є кодом
LibreYOLO.
Контрольна точка для повітряних знімків із кроком 4 передбачає класи VisDrone. Керуйтеся ліцензією, яку видавець указав у репозиторії ваг.
Цитування
@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.