RTMDet
RTMDet to jednoetapowy detektor, który wykonuje predykcję na podstawie jednego punktowego wzorca na położenie siatki, bez kotwic, przez głowicę ze współdzielonymi konwolucjami między poziomami cech. LibreYOLO obsługuje go do detekcji oraz segmentacji instancji RTMDet-Ins.
- Zadania
- detection, instance segmentation
- Rozmiary
- t, s, m, l, x at 640 px
- Instalacja
pip install libreyolo- Poziom obsługi
- Obsługiwany, od wersji v. Dodatkowe trenowalne modele: testy CI pozostają zielone, a funkcje są dodawane w miarę możliwości.
- Projekt źródłowy
- RTMDet, autorzy: OpenMMLab, licencja: Apache-2.0. Publikacja, kod źródłowy
- Licencje
- Kod: Apache-2.0, wagi: Apache-2.0. Użycie komercyjne
Instalacja
RTMDet 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("LibreRTMDets.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes: print(box.cls, box.conf, box.xyxy)libreyolo predict model=LibreRTMDets.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # Przyrostek -seg w nazwie pliku wybiera głowicę masek RTMDet-Ins,# dlatego argument task nie jest tutaj potrzebny.model = LibreYOLO("LibreRTMDets-seg.pt")result = model(SAMPLE_IMAGE, save=True) print(result.masks.data.shape)Zwracany obiekt Results jest taki sam dla każdej rodziny, więc zamiana na
inny detektor wymaga zmiany jednego wiersza. Nazwa pliku z przyrostkiem -seg
samoczynnie wybiera zadanie RTMDet-Ins, a result.masks zawiera wtedy maski
instancji obok ramek. Parametr conf ustawia próg pewności, a iou próg NMS.
Informacje o źródłach, strumieniowaniu i obsłudze wyników znajdziesz w sekcji
predykcja.
Warianty
Pięć rozmiarów, od t do x, korzysta z jednej architektury i wspólnej
rozdzielczości wejściowej. Dla tej rodziny nie ma tutaj tabeli benchmarków.
Rozmiary można porównać według wielkości pliku punktu kontrolnego w tabeli poniżej.
Trenowanie
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")model.train( data="my-dataset.yaml", epochs=300, imgsz=640, batch=16, lr0=0.004,)libreyolo train model=LibreRTMDets.pt data=my-dataset.yaml imgsz=640 epochs=300 batch=16 lr0=0.004Detekcja jest trenowana za pomocą train(). Komponenty QualityFocalLoss, GIoU
i DynamicSoftLabelAssigner przeniesiono z projektu źródłowego mmdetection.
Przebieg w przód oraz eksport ONNX są z nim bitowo równoważne, a przetwarzanie
końcowe odpowiada wynikom mmdet z dokładnością do 0,001 mAP na podzbiorach val2017.
Zgodnie z docstringiem samej metody train() nie sprawdzono zbieżności dostrajania
na małym zbiorze danych, zgodności trenowania od podstaw z publikacją, działania
z wieloma GPU, przepustowości buforowanych augmentacji Mosaic i MixUp, ścisłego
przełączenia dwuetapowego potoku źródłowego ani nadpisań zaniku wag według
parametrów, które zerują zanik dla parametrów normalizacji i bias.
RTMDet-Ins nie ma ścieżki trenowania. Wywołanie train() na punkcie kontrolnym
-seg albo z task="segment" zgłasza NotImplementedError. Segmentacja instancji
obsługuje wyłącznie wnioskowanie i walidację.
Metoda train() przyjmuje także argument pretrained, ale jego wartość nie jest
nigdzie odczytywana wewnątrz metody: trenowanie zawsze jest kontynuowane z wag,
z którymi utworzono model, więc pretrained=False nie inicjalizuje sieci ponownie.
Przy pozostałych ustawieniach domyślnych trener wykonuje 300 epok z optymalizatorem
AdamW, lr0=0.004 i weight_decay=0.05, jedną epoką rozgrzewki w harmonogramie
cosinusowym oraz augmentacjami Mosaic i MixUp wyłączonymi na ostatnie 20 epok.
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("LibreRTMDets.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreRTMDets.pt data=my-dataset.yamlfrom libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets-seg.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95(M)"]) # maskiprint(metrics["metrics/mAP50-95(B)"]) # ramkiW przypadku punktu kontrolnego -seg zwykły klucz metrics/mAP50-95 zawiera
wynik masek, a ten sam przebieg raportuje także ramki pod (B) i maski pod (M),
dzięki czemu oba wyniki są dostępne po jednym przebiegu.
Eksport
| 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: brak obsługi | Detection to MNN: brak obsługi | Detection to RKNN: brak obsługi | Detection to ncnn: brak obsługi | Detection to TFLite: brak obsługi | Detection to CoreML: brak obsługi | Detection to Core AI: obsługiwane |
| Instance segmentation | Instance segmentation to ONNX: brak obsługi | Instance segmentation to TorchScript: brak obsługi | Instance segmentation to ExecuTorch: brak obsługi | Instance segmentation to TensorRT: brak obsługi | Instance segmentation to OpenVINO: brak obsługi | Instance segmentation to Paddle: brak obsługi | Instance segmentation to MNN: brak obsługi | Instance segmentation to RKNN: brak obsługi | Instance segmentation to ncnn: brak obsługi | Instance segmentation to TFLite: brak obsługi | Instance segmentation to CoreML: brak obsługi | Instance segmentation to Core AI: brak obsługi |
Detekcję można wyeksportować do większości formatów. Segmentacji instancji nie
można obecnie wyeksportować do żadnego z nich, co odzwierciedla powyższa macierz.
Wyeksportowany artefakt detekcji 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.
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)libreyolo export model=LibreRTMDets.pt format=onnx imgsz=640libreyolo export model=LibreRTMDets.pt format=tensorrt imgsz=640 half=Truefrom 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("LibreRTMDets.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 | ||
| LibreRTMDett.pt | 640 | apache-2.0 |
| LibreRTMDets.pt | 640 | apache-2.0 |
| LibreRTMDetm.pt | 640 | apache-2.0 |
| LibreRTMDetl.pt | 640 | apache-2.0 |
| LibreRTMDetx.pt | 640 | apache-2.0 |
| Instance segmentation | ||
| LibreRTMDett-seg.pt | 640 | apache-2.0 |
| LibreRTMDets-seg.pt | 640 | apache-2.0 |
| LibreRTMDetm-seg.pt | 640 | apache-2.0 |
| LibreRTMDetl-seg.pt | 640 | apache-2.0 |
| LibreRTMDetx-seg.pt | 640 | apache-2.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
- RTMDet, OpenMMLab
- Licencja projektu źródłowego
- Apache-2.0
- Kod źródłowy projektu
- github.com/open-mmlab/mmdetection
- Kod LibreYOLO
- MIT
- Wagi
- Apache-2.0, ponownie opublikowane w huggingface.co/LibreYOLO
- Interpretacja
- Apache-2.0 is a permissive license, so these weights can be used in commercial and closed-source products. It asks you to keep its license text and attribution notices with any copy of the weights you redistribute, and it grants a patent license. It places no obligation on your own application code, and weights you train yourself on your own data are yours. The published RTMDet and RTMDet-Ins checkpoints are converted from mmdetection's own COCO weights, trained by OpenMMLab under the same license.
Cytowanie
@misc{lyu2022rtmdet,
title={RTMDet: An Empirical Study of Designing Real-Time Object Detectors},
author={Chengqi Lyu and Wenwei Zhang and Haian Huang and Yue Zhou and Yudong Wang and Yanyi Liu and Shilong Zhang and Kai Chen},
year={2022},
eprint={2212.07784},
archivePrefix={arXiv},
primaryClass={cs.CV}
}Skopiowano z bloku cytowania autorów w github.com/open-mmlab/mmdetection/tree/main/configs/rtmdet#citation.