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.
pip install libreyoloPredykcja
Przy pierwszym użyciu wagi są pobierane z Hugging Face i zapisywane w lokalnej pamięci podręcznej.
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 # 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 modelu | Wejście (px) | mAP 50-95 | Parametry (mln) |
|---|---|---|---|
| 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. 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
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 # 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.
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# 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=TrueEksport
| Zadanie | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection to ONNX: obsługiwane | Detection to TorchScript: obsługiwane | Detection to ExecuTorch: obsługiwane | Detection to TensorRT: obsługiwane | Detection to OpenVINO: obsługiwane | Detection to Paddle: obsługiwane | Detection to MNN: obsługiwane | Detection to RKNN: brak obsługi | Detection to ncnn: obsługiwane | Detection to TFLite: brak obsługi | Detection to CoreML: brak obsługi | Detection 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.
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 # 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.
| Plik | Wejście (px) | Licencja wag |
|---|---|---|
| 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 | |
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.