YOLOv9

Jednoetapowy detektor konwolucyjny: jeden przebieg ocenia gęstą siatkę ramek, a NMS usuwa duplikaty. LibreYOLO zawiera trzy jego warianty, z których jeden nie korzysta z NMS.

Zadania
detection
Rozmiary
yolo9: t, s, m, c at 640 px; yolo9_p2: t, s at 640 px
Instalacja
pip install libreyolo
Poziom obsługi
Flagowy, od wersji v1.0.0. Tutaj funkcje są najpierw projektowane i w pełni walidowane na GPU.
Projekt źródłowy
YOLOv9, autorzy: MultimediaTechLab, licencja: MIT. Publikacja, kod źródłowy
Licencje
Kod: MIT, wagi: MIT. Użycie komercyjne

Instalacja

YOLOv9 nie wymaga niczego poza pakietem podstawowym.

bash
pip install libreyolo

Predykcja

Przy pierwszym użyciu wagi są pobierane z Hugging Face i zapisywane w lokalnej pamięci podręcznej.

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
Bez NMS
from libreyolo import LibreYOLO, SAMPLE_IMAGE # To samo wywołanie, inny punkt kontrolny. Głowica end-to-end zwraca własne# predykcje z najwyższymi wynikami, więc NMS nie jest wykonywane, a iou jest ignorowane.model = LibreYOLO("LibreYOLO9E2Es.pt")result = model(SAMPLE_IMAGE, conf=0.25, max_det=300) print(len(result.boxes))

Zwracany obiekt Results jest taki sam dla każdej rodziny, więc zamiana na inny detektor wymaga zmiany jednego wiersza. W modelach bazowym i z krokiem 4 parametr conf ustawia próg pewności, a iou próg NMS. Model end-to-end nie wykonuje NMS i ignoruje iou, dlatego jego wynik kształtują conf i max_det. Informacje o źródłach, strumieniowaniu i obsłudze wyników znajdziesz w sekcji predykcja.

Warianty

Trzy warianty korzystają ze wspólnego backbone. Wszystkie trzy służą wyłącznie do detekcji i przyjmują te same argumenty.

Model bazowy wykonuje predykcję na trzech skalach cech i usuwa zduplikowane ramki za pomocą NMS.

Model end-to-end zachowuje tę głowicę i dodaje obok niej gałąź dopasowania jeden do jednego. Wnioskowanie odczytuje wyłącznie gałąź jeden do jednego i wybiera jej predykcje z najwyższymi wynikami, dlatego NMS nie jest wykonywane. Wybierz ten model, gdy docelowe środowisko uruchomieniowe nie ma operatora NMS.

Model z krokiem 4 udostępnia jeden poziom wcześniej w backbone, rozszerza do niego moduł neck i wykonuje predykcję na czterech skalach zamiast trzech. Dodatkowa skala jest przeznaczona dla obiektów obejmujących niewiele pikseli. Jedyny opublikowany dla niej punkt kontrolny wytrenowano na obrazach lotniczych. Bazowe punkty kontrolne detekcji można do niego przenieść: backbone i neck są ładowane bez zmian, trzy wstępnie wytrenowane wieże głowicy przesuwają się o jedną pozycję, a wieża z krokiem 4 zaczyna od losowej inicjalizacji.

Checkpoint modeluWejście (px)mAP 50-95Parametry (mln)
LibreYOLO9c64056.425.5
LibreYOLO9m64055.320.12
LibreYOLO9s64055.97.2
LibreYOLO9t64054.02.02

COCO val2017, 500 images. Wyniki zmierzono za pomocą zestawu benchmarkowego LibreYOLO i opublikowano w Vision Analysis, gdzie porównywane są opóźnienia na różnych urządzeniach i w różnych środowiskach uruchomieniowych oraz znajdują się pełne zapisy przebiegów.

Trenowanie

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
Małe obiekty
from libreyolo import LibreYOLO9P2 # Wariant z krokiem 4 nie ma własnego punktu kontrolnego COCO, dlatego należy# wskazać bazowy punkt kontrolny detekcji: backbone i neck zostaną załadowane# bez zmian, a wieża głowicy z krokiem 4 rozpocznie od losowej inicjalizacji.model = LibreYOLO9P2(None, size="s")model.train(data="my-dataset.yaml", epochs=100, pretrained="LibreYOLO9s.pt")

Parametr pretrained określa punkt początkowy przebiegu. Przekaż True, aby załadować opublikowany punkt kontrolny tego samego modelu i rozmiaru, albo nazwę lub ścieżkę do dowolnego innego. Tensory o niedopasowanym kształcie są pomijane, a nie odrzucane, a przebieg zapisuje liczbę załadowanych tensorów. Dzięki temu punkt kontrolny wytrenowany z inną liczbą klas nadal nadaje się na punkt początkowy.

Model z krokiem 4 nie ma własnego opublikowanego punktu kontrolnego COCO, dlatego True wskazuje w tym przypadku nieistniejący plik, a pobieranie kończy się niepowodzeniem. Zamiast tego wskaż bazowy punkt kontrolny detekcji.

Informacje o zbiorach danych, augmentacji, wielu GPU i loggerach znajdziesz w sekcji trenowanie.

Walidacja

Metoda val() zwraca słownik kluczy metrics/ obejmujących precyzję, czułość, mAP 50 i mAP 50-95, mierzone na dowolnym zbiorze danych w formacie użytym do trenowania.

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
Walidacja na COCO
# Dołączony plik yaml COCO zawiera osadzony skrypt pobierania, dlatego wymaga# jawnego zezwolenia, chyba że zbiór danych jest już dostępny lokalnie.libreyolo val model=LibreYOLO9c.pt data=coco.yaml imgsz=640 \  allow_download_scripts=True

Eksport

ZadanieONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
DetectionDetection to ONNX: obsługiwaneDetection to TorchScript: obsługiwaneDetection to ExecuTorch: obsługiwaneDetection to TensorRT: obsługiwaneDetection to OpenVINO: obsługiwaneDetection to Paddle: obsługiwaneDetection to MNN: obsługiwaneDetection to RKNN: brak obsługiDetection to ncnn: obsługiwaneDetection to TFLite: brak obsługiDetection to CoreML: brak obsługiDetection to Core AI: obsługiwane

Znacznik wyboru dotyczy wszystkich trzech wariantów. Jeśli ich obsługa formatu się różni, macierz podaje najsłabszy poziom spośród trzech.

Wyeksportowany artefakt jest ponownie ładowany przez LibreYOLO() na podstawie rozszerzenia pliku, więc plik .onnx lub .engine zachowuje się jak punkt kontrolny i zwraca ten sam obiekt Results. Obsługiwane jest także uruchamianie grafu w samym środowisku uruchomieniowym bez zainstalowanego LibreYOLO, ale wówczas samodzielnie trzeba zaimplementować przetwarzanie wstępne i końcowe.

Dla bazowego modelu detekcji część przetwarzania końcowego można przenieść do grafu. Ustawienie nms=True podczas eksportu ONNX umieszcza tłumienie wewnątrz modelu, a pierwszy wynik staje się stałym tensorem (1, max_det, 6), którego wiersze mają postać x1, y1, x2, y2, score, class i są dopełniane zerami po liczbie detekcji. Taki graf ma partię 1 i nie zawiera osi dynamicznych. Modele end-to-end i z krokiem 4 nie przyjmują tej flagi.

Każdy format instaluje inny dodatek i przyjmuje kilka własnych argumentów. Obie informacje znajdują się na stronie danego formatu.

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
Z NMS w grafie
libreyolo export model=LibreYOLO9s.pt format=onnx nms=True \  conf=0.25 iou=0.45 max_det=300
Użycie wyeksportowanego pliku
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Fabryka wybiera ścieżkę na podstawie rozszerzenia pliku, dlatego# artefakt ładuje się jak punkt kontrolny i zwraca ten sam obiekt Results.model = LibreYOLO("LibreYOLO9s.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)

Punkty kontrolne

Wszystkie opublikowane pliki wag dla tej rodziny.

PlikWejście (px)Licencja wag
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

Każdy z powyższych plików jest obecnie dostępny w organizacji LibreYOLO i pobierany przy pierwszym użyciu.

Licencjonowanie

Sprawdź licencję w repozytorium konkretnych pobieranych wag na Hugging Face. Każdy checkpoint w organizacji LibreYOLO ma licencję, która nie zawsze jest taka sama w całej rodzinie. To repozytorium jest źródłem rozstrzygającym, a poniższe podsumowanie opisuje stan z chwili ostatniej weryfikacji tej strony.

To opis obowiązujących licencji, a nie porada prawna. Jeśli odpowiedź ma znaczenie komercyjne, przeczytaj licencje i zasięgnij własnej porady prawnej.

Oryginalna praca
YOLOv9, MultimediaTechLab
Licencja projektu źródłowego
MIT
Kod źródłowy projektu
github.com/MultimediaTechLab/YOLO
Kod LibreYOLO
MIT
Wagi
MIT, ponownie opublikowane w huggingface.co/LibreYOLO
Interpretacja
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.

Jeden punkt kontrolny nie podlega tutaj licencji MIT. Model z krokiem 4 wytrenowany na VisDrone2019-DET dziedziczy warunki CC BY-NC-SA 3.0 tego zbioru danych: wyłącznie użytek niekomercyjny, udostępnianie utworów pochodnych na tych samych zasadach i wyłączenie z liberalnej licencji obejmującej resztę tej rodziny. Przewiduje klasy lotnicze VisDrone zamiast klas COCO. Biblioteka wyświetla wszystkie te informacje przed pobraniem pliku.

Cytowanie

@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)},
}

Skopiowano z bloku cytowania autorów w github.com/MultimediaTechLab/YOLO#citations.

Zweryfikowano z LibreYOLO v1.5.0. Tabele obsługi, checkpointy i wyniki benchmarków na tej stronie są generowane na podstawie wydanej biblioteki i opublikowanych wag, a nie wpisywane ręcznie.