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
LibreYOLO9t64041.82.04

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 та засоби журналювання дивіться в розділі навчання.

Базова модель може навчати допоміжну гілку 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, виміряні на будь-якому датасеті у форматі, на якому проводилося навчання.

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)

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.

Постобробка

  1. Transpose to [anchors, 4 + nc].
  2. Keep every (anchor, class) pair whose score is above the confidence threshold (0.25 by default). One anchor can yield several classes.
  3. Run NMS per class with IoU 0.45 and keep at most 300 detections.
  4. Map boxes back to the original image: subtract the pad offset, divide by r, clip to the image.
  5. 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.

Постобробка

  1. Drop rows whose score is 0 or below your threshold.
  2. 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.

Постобробка

  1. Transpose to [anchors, 4 + nc].
  2. 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.
  3. Keep the 300 highest-scoring pairs (max_det), highest first. One anchor can yield several classes.
  4. Of those, keep the pairs whose score is above the confidence threshold (0.25 by default).
  5. 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.
  6. Map boxes back to the original image: subtract the pad offset, divide by r, clip to the image.
  7. 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.

Постобробка

  1. Transpose to [anchors, 4 + nc].
  2. Keep every (anchor, class) pair whose score is above the confidence threshold (0.25 by default). One anchor can yield several classes.
  3. Run NMS per class with IoU 0.45 and keep at most 300 detections.
  4. Map boxes back to the original image: subtract the pad offset, divide by r, clip to the image.
  5. Drop boxes whose width or height is 0 after clipping.

Щоб перевірити власну реалізацію, пропустіть той самий файл через LibreYOLO: LibreYOLO("model.onnx").predict("image.jpg") повертає еталонні результати. Перевірено на LibreYOLO 1.7.0.

Контрольні точки

Усі опубліковані файли ваг цього сімейства.

ФайлВхід (пікс.)Ліцензія ваг
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 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.

Перевірено з LibreYOLO v1.6.0. Таблиці підтримки, контрольні точки й результати бенчмарків на цій сторінці згенеровано з випущеної бібліотеки та опублікованих ваг, а не написано вручну.

Архітектура YOLOv9

Виберіть варіант або огляд сімейства, а потім блок для перегляду подробиць. Відкрийте повну схему для масштабування або завантаження SVG і PNG. Схеми англійською мовою.