Lekka instalacja

Ścieżka inferencji ONNX w LibreYOLO korzysta od początku do końca z numpy, łącznie z dekodowaniem i NMS. W czasie działania nie wymaga PyTorch, dlatego instalacja pomijająca rozwiązywanie zależności może wykonywać detekcję bez torch na komputerze.

Dotyczy
Detekcja ONNX, siedem rodzin modeli
Punkt wejścia
libreyolo.backends.onnx.OnnxBackend
Poziom wsparcia
Wsparcie w miarę możliwości, nie jest to osobna dystrybucja

Dlaczego to działa

Polecenie pip install --no-deps libreyolo instaluje pakiet i całkowicie pomija jego listę zależności. Żadne zależności nie są rozwiązywane automatycznie, więc trzeba samodzielnie zainstalować te, które będą rzeczywiście używane.

Ma to sens tylko wtedy, gdy wybrana ścieżka kodu naprawdę nie potrzebuje pominiętych zależności. Ścieżka detekcji ONNX ich nie potrzebuje. Dekodowanie, w tym non-maximum suppression, odbywa się w numpy. Procedury przetwarzania wstępnego także korzystają z numpy. PyTorch jest zależnością wymaganą do trenowania i inferencji w trybie eager, a na tej ścieżce nie jest wywoływany.

Przed tym wydaniem import mimo wszystko kończył się niepowodzeniem. Import czegokolwiek z libreyolo.models budował każdą klasę modelu, aby wypełnić rejestr automatycznego wykrywania checkpointów, a klasy te są podklasami torch.nn.Module. Procedury przetwarzania wstępnego znajdują się teraz we własnym pakiecie libreyolo.preprocess, a import torch jest odraczany do chwili użycia atrybutu torch. Dzięki temu ścieżkę ONNX można zaimportować bez torch na komputerze. Pakiet zawiera natywny dla numpy moduł przetwarzania wstępnego dla każdej z rodzin: yolo9, yolonas, yolox, ec, rtdetr, rfdetr, dfine, deim i deimv2, czyli o dwie więcej niż siedem rodzin zweryfikowanych poniżej od początku do końca. Każdy plik libreyolo/models/<family>/utils.py ponownie eksportuje elementy z tego pakietu, dzięki czemu istniejące ścieżki importu nadal działają.

Najpierw wypróbuj pakiet wheel tylko dla CPU

Większość osób zainteresowanych tym rozwiązaniem chce uniknąć instalacji zajmującej kilka gigabajtów, a rozmiar skupia się w jednym miejscu: domyślny pakiet wheel torch zawiera CUDA. Kompilacja tylko dla CPU zajmuje ułamek tego miejsca i nie wymaga specjalnej ścieżki instalacji.

Lekka instalacja
# Zainstaluj pakiet bez jego listy zależności, a następnie dodaj cztery# pakiety faktycznie importowane przez ścieżkę detekcji ONNX.pip install --no-deps libreyolopip install numpy pillow opencv-python-headless onnxruntime
torch tylko dla CPU
# Najpierw wypróbuj tę opcję. Zachowuje wszystkie funkcje i pozwala uniknąć# pakietu wheel CUDA, który zajmuje najwięcej miejsca na dysku.pip install libreyolo --index-url https://download.pytorch.org/whl/cpu

Opcja tylko dla CPU zachowuje wszystkie funkcje LibreYOLO: trenowanie, walidację, każde zadanie, każdą rodzinę i CLI. Z lekkiej ścieżki warto korzystać, gdy na komputerze nie ma być w ogóle torch, a nie tylko jego mniejsza wersja.

Zakres lekkiej instalacji

ZadanieDetekcja
FormatONNX
Punkt wejściaOnnxBackend
InterfejsBiblioteka Pythona

Na tej ścieżce zweryfikowano siedem rodzin: YOLOv9, YOLO-NAS, EdgeCrafter, RT-DETR, RF-DETR, D-FINE oraz DEIM, wliczając w to warianty każdej rodziny.

Jest to zweryfikowany zakres, a nie ograniczenie wymuszane przez bibliotekę. Inne zadania i rodziny znajdują się po prostu poza zakresem testów. Niektóre zaimportują torch po wywołaniu, a kilka może przypadkiem działać. Wszystko spoza tej listy należy traktować jako nieprzetestowane, a nie jako obsługiwane lub zepsute.

W ramach tego zakresu wyniki są identyczne z normalną instalacją, a nie tylko zbliżone. Każdą rodzinę wyeksportowano do ONNX i uruchomiono dwukrotnie, raz normalnie i raz z zablokowanym torch. Ramki, wskaźniki i klasy były dokładnie zgodne. Test zgodności w zestawie testów chroni ten kontrakt przed zmianami.

Pięć częstych pułapek

Użyj OnnxBackend, a nie klas modeli. Wywołanie LibreYOLO9("model.onnx") nadal wymaga torch, ponieważ LibreYOLO9 jest podklasą nn.Module. To najbardziej prawdopodobna pomyłka, gdyż na każdej innej stronie tej dokumentacji model wczytuje się przez jego klasę lub przez LibreYOLO().

Eksport wykonaj gdzie indziej. Utworzenie pliku .onnx wymaga torch, więc lekki komputer nie może go wygenerować. Eksport należy wykonać na komputerze deweloperskim lub w CI, a artefakt dostarczyć do odchudzonego środowiska docelowego.

Wyniki zawierają tablice numpy. W tym przypadku result.boxes.xyxy jest obiektem ndarray. Kontenery przyjmują oba typy, dlatego nazwy atrybutów się nie zmieniają, ale kod wywołujący .cpu() lub .numpy() na wyniku zakończy się błędem.

Jeden obraz zwraca pojedynczy obiekt Results. Funkcja predict() zwraca jeden obiekt Results dla jednego obrazu i listę dla kilku obrazów. Indeksowanie pojedynczego wyniku przez [0] wybiera pierwszą detekcję, a nie pierwszy obraz. Zamiast zgłosić wyjątek, zwraca po cichu wynik z jedną ramką.

CLI nie będzie działać. Cztery podane pakiety nie obejmują typer ani click, więc polecenie libreyolo jest niedostępne. Jest to instalacja biblioteki.

Predykcja

Python
from libreyolo.backends.onnx import OnnxBackend model = OnnxBackend("libreyolo9t.onnx")result = model.predict("https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg") # W tym miejscu xyxy jest tablicą ndarray z numpy, a nie tensorem torch.print(result.boxes.xyxy)print(result.boxes.conf)print(result.boxes.cls)

Aby użyć CUDA, zamień onnxruntime na onnxruntime-gpu. Cztery wymienione pakiety są tymi, które faktycznie importuje pełne wywołanie predict() bez torch. Zarejestrowano je podczas wywołania, zamiast wyznaczać na podstawie analizy. Pakiet opencv-python-headless zastępuje zadeklarowany opencv-python: udostępnia ten sam moduł bez bibliotek GUI i zajmuje mniej miejsca na dysku.

Spośród pozostałych zadeklarowanych zależności requests jest potrzebny tylko do wczytywania obrazu z adresu URL, pycocotools i scipy służą do walidacji i oceny, a typer i click są wymagane przez CLI.

Ta lista z założenia będzie się zmieniać

Powyższa lista pakietów jest poprawna dla wydania podanego u góry tej strony. Opcja --no-deps wyłącza rozwiązywanie zależności, więc nic nie sprawdza ich automatycznie, a późniejsze wydanie może importować pakiet, którego tutaj nie wymieniono.

Jeśli pojawi się ModuleNotFoundError, rozwiązanie wynika bezpośrednio z tej techniki: należy zainstalować brakujący pakiet. Jest to zamierzony model utrzymania, a nie błąd do zgłoszenia. Ta ścieżka jest wspierana w miarę możliwości i nie stanowi osobnej obsługiwanej dystrybucji. Z tego powodu nie ma drugiego lekkiego pakietu na PyPI ani planów jego utworzenia.

Aby upewnić się, że środowisko naprawdę nie zawiera torch i nie korzysta po cichu z zainstalowanej kopii, użyj asercji:

python
import importlib.util

assert importlib.util.find_spec("torch") is None, "torch is installed"

Warto zachować to sprawdzenie w CI dla odchudzonego obrazu. Bez niego środowisko, które przypadkiem ma torch, przejdzie każdy test i nie dostarczy żadnej użytecznej informacji.

Zweryfikowano z LibreYOLO v1.5.0.