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.

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("LibreRTMDets.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes:    print(box.cls, box.conf, box.xyxy)
CLI
libreyolo predict model=LibreRTMDets.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
Segmentacja instancji
from 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

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")model.train(    data="my-dataset.yaml",    epochs=300, imgsz=640, batch=16, lr0=0.004,)
CLI
libreyolo train model=LibreRTMDets.pt data=my-dataset.yaml imgsz=640 epochs=300 batch=16 lr0=0.004

Detekcja 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.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])
CLI
libreyolo val model=LibreRTMDets.pt data=my-dataset.yaml
Segmentacja instancji
from 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)"])   # ramki

W 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

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: brak obsługiDetection to MNN: brak obsługiDetection to RKNN: brak obsługiDetection to ncnn: brak obsługiDetection to TFLite: brak obsługiDetection to CoreML: brak obsługiDetection to Core AI: obsługiwane
Instance segmentationInstance segmentation to ONNX: brak obsługiInstance segmentation to TorchScript: brak obsługiInstance segmentation to ExecuTorch: brak obsługiInstance segmentation to TensorRT: brak obsługiInstance segmentation to OpenVINO: brak obsługiInstance segmentation to Paddle: brak obsługiInstance segmentation to MNN: brak obsługiInstance segmentation to RKNN: brak obsługiInstance segmentation to ncnn: brak obsługiInstance segmentation to TFLite: brak obsługiInstance segmentation to CoreML: brak obsługiInstance 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.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)
CLI
libreyolo export model=LibreRTMDets.pt format=onnx imgsz=640libreyolo export model=LibreRTMDets.pt format=tensorrt imgsz=640 half=True
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("LibreRTMDets.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)

Punkty kontrolne

Wszystkie opublikowane pliki wag dla tej rodziny.

PlikWejście (px)Licencja wag
Detection
LibreRTMDett.pt640apache-2.0
LibreRTMDets.pt640apache-2.0
LibreRTMDetm.pt640apache-2.0
LibreRTMDetl.pt640apache-2.0
LibreRTMDetx.pt640apache-2.0
Instance segmentation
LibreRTMDett-seg.pt640apache-2.0
LibreRTMDets-seg.pt640apache-2.0
LibreRTMDetm-seg.pt640apache-2.0
LibreRTMDetl-seg.pt640apache-2.0
LibreRTMDetx-seg.pt640apache-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.

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.