YOLOv9
Ein konvolutionaler Single-Stage-Detektor: Ein Durchlauf bewertet ein dichtes Raster von Boxen und NMS entfernt Duplikate. LibreYOLO bietet drei Varianten, von denen eine ohne NMS-Schritt auskommt.
- Aufgaben
- detection
- Größen
- yolo9: t, s, m, c at 640 px; yolo9_p2: t, s at 640 px
- Installation
pip install libreyolo- Supportstufe
- Flaggschiff, seit v1.0.0. Funktionen werden zuerst hier entwickelt und vollständig auf GPUs validiert.
- Upstream
- YOLOv9 von MultimediaTechLab, MIT. Publikation, Quelle
- Lizenzen
- Code MIT, Gewichte MIT. Kommerzielle Nutzung
Installation
YOLOv9 benötigt neben dem Basispaket kein zusätzliches Extra.
pip install libreyoloVorhersage
Die Gewichte werden bei der ersten Verwendung von Hugging Face heruntergeladen und lokal zwischengespeichert.
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 # Derselbe Aufruf mit einem anderen Checkpoint. Der End-to-End-Kopf liefert# seine am höchsten bewerteten Vorhersagen selbst, daher wird kein NMS ausgeführt und iou ignoriert.model = LibreYOLO("LibreYOLO9E2Es.pt")result = model(SAMPLE_IMAGE, conf=0.25, max_det=300) print(len(result.boxes))Das zurückgegebene Results-Objekt entspricht dem jeder anderen Familie, sodass der Wechsel zu einem anderen Detektor nur eine einzige Codezeile erfordert. Bei den Basismodellen und den Stride-4-Modellen legt conf den Konfidenzschwellenwert und iou den NMS-Schwellenwert fest. Das End-to-End-Modell führt kein NMS aus und ignoriert iou, daher bestimmen conf und max_det seine Ausgabe. Unter Vorhersage findest du Informationen zu Quellen, Streaming und Ergebnisverarbeitung.
Varianten
Drei Varianten verwenden denselben Backbone. Alle drei sind ausschließlich für die Objekterkennung vorgesehen und akzeptieren dieselben Argumente.
Das Basismodell sagt auf drei Merkmalsskalen vorher und entfernt doppelte Boxen mit NMS.
Das End-to-End-Modell behält diesen Kopf bei und ergänzt daneben einen Zweig mit One-to-One-Zuordnung. Die Inferenz liest ausschließlich diesen Zweig und übernimmt dessen am höchsten bewertete Vorhersagen, weshalb kein NMS ausgeführt wird. Wähle diese Variante, wenn deine Ziellaufzeitumgebung keinen NMS-Operator besitzt.
Das Stride-4-Modell greift eine Ebene weiter oben im Backbone ab, erweitert den Neck bis zu dieser Ebene und sagt auf vier statt drei Skalen vorher. Die zusätzliche Skala ist für Objekte gedacht, die nur wenige Pixel belegen. Der einzige dafür veröffentlichte Checkpoint wurde auf Luftbildern trainiert. Basischeckpoints zur Objekterkennung lassen sich darauf übertragen. Backbone und Neck werden unverändert geladen, die drei vortrainierten Kopftürme rücken um einen Platz nach oben und der Stride-4-Turm wird zufällig initialisiert.
| Checkpoint | Eingabe (px) | mAP 50-95 | Parameter (M) |
|---|---|---|---|
| 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. Gemessen mit dem LibreYOLO-Benchmarksystem und auf Vision Analysis veröffentlicht. Dort werden Latenzen verschiedener Hardware und Runtimes verglichen und die vollständigen Laufprotokolle bereitgestellt.
Training
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 # Die Stride-4-Variante besitzt keinen eigenen COCO-Checkpoint. Gib daher einen# Basischeckpoint zur Objekterkennung an: Backbone und Neck werden unverändert geladen,# während der Stride-4-Kopfturm zufällig initialisiert wird.model = LibreYOLO9P2(None, size="s")model.train(data="my-dataset.yaml", epochs=100, pretrained="LibreYOLO9s.pt")pretrained bestimmt den Ausgangspunkt des Laufs. Übergib True, um den veröffentlichten Checkpoint für dasselbe Modell und dieselbe Größe zu laden, oder einen Namen beziehungsweise Pfad für andere Gewichte. Tensoren mit unpassender Form werden übersprungen statt abgelehnt. Der Lauf protokolliert die Anzahl der geladenen Tensoren, sodass auch ein mit einer anderen Klassenanzahl trainierter Checkpoint als Ausgangspunkt dienen kann.
Das Stride-4-Modell besitzt keinen eigenen veröffentlichten COCO-Checkpoint. True wird dafür zu einer nicht vorhandenen Datei aufgelöst und der Download schlägt fehl. Gib stattdessen einen Basischeckpoint zur Objekterkennung an.
Unter Training findest du Informationen zu Datensätzen, Augmentation, Multi-GPU und Loggern.
Validierung
val() gibt ein Dictionary mit metrics/-Schlüsseln für Precision, Recall, mAP 50 und mAP 50-95 zurück, gemessen anhand jedes Datensatzes im Format, das du für das Training verwendet hast.
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# Die mitgelieferte COCO-YAML-Datei enthält ein Downloadskript und benötigt# daher eine ausdrückliche Berechtigung, sofern der Datensatz noch nicht lokal vorliegt.libreyolo val model=LibreYOLO9c.pt data=coco.yaml imgsz=640 \ allow_download_scripts=TrueExport
| Aufgabe | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection to ONNX: unterstützt | Detection to TorchScript: unterstützt | Detection to ExecuTorch: unterstützt | Detection to TensorRT: unterstützt | Detection to OpenVINO: unterstützt | Detection to Paddle: unterstützt | Detection to MNN: unterstützt | Detection to RKNN: nicht unterstützt | Detection to ncnn: unterstützt | Detection to TFLite: nicht unterstützt | Detection to CoreML: nicht unterstützt | Detection to Core AI: unterstützt |
Ein Häkchen gilt für alle drei Varianten. Wo sie sich unterscheiden, zeigt die Matrix die schwächste Unterstützung der drei.
Ein exportiertes Artefakt wird über seine Dateiendung wieder durch LibreYOLO() geladen. Eine .onnx- oder .engine-Datei verhält sich daher wie ein Checkpoint und gibt dasselbe Results-Objekt zurück. Du kannst den Graphen auch in einer eigenständigen Laufzeitumgebung ohne installiertes LibreYOLO ausführen. Dann musst du Vor- und Nachverarbeitung selbst implementieren.
Beim Basismodell zur Objekterkennung lässt sich die Nachverarbeitung in den Graphen verschieben. nms=True bei einem ONNX-Export bettet die Unterdrückung in das Modell ein. Die erste Ausgabe wird zu einem festen Tensor der Form (1, max_det, 6), dessen Zeilen x1, y1, x2, y2, score, class enthalten und hinter der Anzahl der Erkennungen mit Nullen aufgefüllt werden. Dieser Graph besitzt Batchgröße 1 und keine dynamischen Achsen. Das End-to-End-Modell und das Stride-4-Modell akzeptieren dieses Flag nicht.
Jedes Format installiert ein anderes Extra und besitzt eigene Argumente. Beides ist auf der Seite des jeweiligen Formats beschrieben.
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 # Die Factory leitet anhand der Dateiendung weiter, daher wird ein exportiertes Artefakt# wie jeder Checkpoint geladen und gibt dasselbe Results-Objekt zurück.model = LibreYOLO("LibreYOLO9s.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Checkpoints
Alle für diese Familie veröffentlichten Gewichtsdateien.
| Datei | Eingabe (px) | Lizenz der Gewichte |
|---|---|---|
| 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 | |
Jede oben aufgeführte Datei ist heute in der LibreYOLO-Organisation verfügbar und wird bei der ersten Verwendung heruntergeladen.
Lizenzierung
Prüfe die Lizenz im Hugging-Face-Repository der konkreten Gewichte, die du herunterlädst. Jeder Checkpoint in der LibreYOLO-Organisation hat eine Lizenz, und sie ist innerhalb einer Familie nicht immer gleich. Dieses Repository ist die maßgebliche Quelle. Die Zusammenfassung unten beschreibt den Stand bei der letzten Verifizierung dieser Seite.
Dies ist eine Beschreibung der beteiligten Lizenzen und keine Rechtsberatung. Wenn die Antwort kommerziell relevant ist, lies die Lizenzen selbst und hole eigenen Rechtsrat ein.
- Originalarbeit
- YOLOv9, MultimediaTechLab
- Upstream-Lizenz
- MIT
- Upstream-Quelle
- github.com/MultimediaTechLab/YOLO
- LibreYOLO-Code
- MIT
- Gewichte
- MIT, erneut unter huggingface.co/LibreYOLO veröffentlicht
- Einordnung
- 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.
Ein Checkpoint steht hier nicht unter MIT. Das auf VisDrone2019-DET trainierte Stride-4-Modell übernimmt die Bedingungen des Datensatzes unter CC BY-NC-SA 3.0. Es darf nur nicht kommerziell verwendet werden, für abgeleitete Werke gilt ShareAlike und es fällt nicht unter die freizügige Lizenz des übrigen Teils dieser Familie. Es sagt die VisDrone-Klassen für Luftbilder statt der COCO-Klassen vorher. Die Bibliothek zeigt all diese Informationen an, bevor sie die Datei herunterlädt.
Zitieren
@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)},
}Aus dem Zitierblock der Autoren unter github.com/MultimediaTechLab/YOLO#citations kopiert.