Brak ścieżki binarnej Pythona
Komunikat o błędzie:
ERROR: An error occurred during the fetch of repository 'local_execution_config_python':
Traceback (most recent call last):
File "/sandbox_path/external/org_tensorflow/third_party/py/python_configure.bzl", line 208
get_python_bin(repository_ctx)
...
Repository command failed
zwykle oznacza, że Bazel nie znajduje lokalnego pliku binarnego Pythona. Do rozwiązania
: najpierw odszukaj plik binarny Pythona, a następnie dodaj
--action_env PYTHON_BIN_PATH=<path to python binary>
do polecenia Bazel. Dla:
możesz na przykład przełączyć się na domyślny plik binarny języka Python3 w systemie
to polecenie:
bazel build -c opt \
--define MEDIAPIPE_DISABLE_GPU=1 \
--action_env PYTHON_BIN_PATH=$(which python3) \
mediapipe/examples/desktop/hello_world
Brak niezbędnych pakietów Pythona
Komunikat o błędzie:
ImportError: No module named numpy
Is numpy installed?
zwykle oznacza, że określone pakiety Pythona nie są zainstalowane. Uruchom
pip install
lub pip3 install
w zależności od wersji binarnej Pythona na
i instalować te pakiety.
Nie udało się pobrać repozytoriów zależności zdalnych
Komunikat o błędzie:
ERROR: An error occurred during the fetch of repository 'org_tensorflow':
java.io.IOException: Error downloading [https://mirror.bazel.build/github.com/tensorflow/tensorflow/archive/77e9ffb9b2bfb1a4f7056e62d84039626923e328.tar.gz, https://github.com/tensorflow/tensorflow/archive/77e9ffb9b2bfb1a4f7056e62d84039626923e328.tar.gz] to /sandbox_path/external/org_tensorflow/77e9ffb9b2bfb1a4f7056e62d84039626923e328.tar.gz: Tried to reconnect at offset 9,944,151 but server didn't support it
or
WARNING: Download from https://storage.googleapis.com/mirror.tensorflow.org/github.com/bazelbuild/rules_swift/releases/download/0.12.1/rules_swift.0.12.1.tar.gz failed: class java.net.ConnectException Connection timed out (Connection timed out)
zwykle wskazuje, że Bazel nie pobiera niezbędnych repozytoriów zależności
których potrzebuje MediaPipe. MedaiPipe ma kilka repozytoriów zależności, które są
w witrynach Google. W niektórych regionach może być konieczne skonfigurowanie sieciowego serwera proxy
lub skorzystaj z sieci VPN,
aby uzyskać dostęp do tych zasobów. Konieczne może być też dołączenie
--host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>"
na polecenie Bazel. Zobacz
tego problemu z GitHubem
.
Jeśli uważasz, że problem nie dotyczy sieci,
zasoby mogą być chwilowo niedostępne, uruchom bazel clean --expunge
i spróbuj ponownie później. Jeśli nadal nie działa, zgłoś problem w GitHubie na stronie
szczegółowy komunikat o błędzie.
Nieprawidłowa konfiguracja OpenCV MediaPipe
Komunikat o błędzie:
error: undefined reference to 'cv::String::deallocate()'
error: undefined reference to 'cv::String::allocate(unsigned long)'
error: undefined reference to 'cv::VideoCapture::VideoCapture(cv::String const&)'
...
error: undefined reference to 'cv::putText(cv::InputOutputArray const&, cv::String const&, cv::Point, int, double, cv::Scalar, int, int, bool)'
zwykle oznacza, że OpenCV nie jest prawidłowo skonfigurowany pod kątem MediaPipe. Proszę zajrzyj do sekcji „Zainstaluj OpenCV i FFmpeg”. sekcji w Instalacja, aby zobaczyć, jak modyfikować ustawienia WORKSPACE i WORKSPACE MediaPipe Pliki linux_opencv/macos_opencv/windows_opencv.BUILD dla lokalnego Opencv biblioteki. Ten problem z GitHubem też może pomóc.
Błąd instalacji pip w Pythonie
Komunikat o błędzie:
ERROR: Could not find a version that satisfies the requirement mediapipe
ERROR: No matching distribution found for mediapipe
po uruchomieniu pip install mediapipe
zwykle oznacza, że w systemie nie ma odpowiedniego kodu MediaPipe Python.
Pamiętaj, że MediaPipe Python PyPI oficjalnie obsługuje 64-bitowy
Pythona w wersji od 3.7 do 3.10 w następujących systemach operacyjnych:
- Linux x86_64
- x86_64, macOS 10.15 lub nowszy
- Windows amd64
Jeśli dany system operacyjny jest obecnie obsługiwany i nadal pojawia się ten błąd, sprawdź, że zarówno pliki binarne Pythona, jak i pip są przeznaczone dla języka Python w wersjach od 3.7 do 3.10. W przeciwnym razie spróbuj utworzyć lokalnie pakiet MediaPipe w Pythonie, postępując zgodnie z instrukcje znajdziesz tutaj.
Błąd wczytania biblioteki DLL Pythona w systemie Windows
Komunikat o błędzie:
ImportError: DLL load failed: The specified module could not be found
zwykle oznacza, że w lokalnym systemie Windows brakuje wizualnego C++ pakiety podlegające redystrybucji i/lub pliki DLL środowiska wykonawczego języka C++; Można to rozwiązać przez: instalując oficjalny vc_redist.x64.exe lub instalując środowisko wykonawcze „msvc-runtime” Uruchom pakiet Pythona
$ python -m pip install msvc-runtime
Pamiętaj, że środowisko wykonawcze „msvc-runtime” Pakiet Pythona nie został wydany ani utrzymywany firmy Microsoft.
Nie znaleziono metody natywnej
Komunikat o błędzie:
java.lang.UnsatisfiedLinkError: No implementation found for void com.google.wick.Wick.nativeWick
zwykle oznacza, że potrzebna biblioteka natywna, np. /libwickjni.so
, nie
została wczytana, nie została uwzględniona w zależnościach aplikacji lub nie można
z jakiegoś powodu. Pamiętaj, że Java wymaga, by każda biblioteka natywna
jawnie ładowane za pomocą funkcji System.loadLibrary
.
Nie znaleziono zarejestrowanego kalkulatora
Komunikat o błędzie:
No registered object with name: OurNewCalculator; Unable to find Calculator "OurNewCalculator"
zwykle wskazuje, że do pola OurNewCalculator
odwołuje się nazwa w
CalculatorGraphConfig
, ale cel biblioteki dla OurNewCalculator ma
nie zostały połączone z plikiem binarnym aplikacji. Po dodaniu nowego kalkulatora do
kalkulatora, należy go dodać jako zależność kompilacji
za pomocą kalkulatora.
Ten błąd jest wykrywany w czasie działania, ponieważ wykresy kalkulatora odwołują się
kalkulatory według nazwy, korzystając z pola CalculatorGraphConfig::Node:calculator
.
Jeśli biblioteka kalkulatora jest połączona z plikiem binarnym aplikacji, funkcja
kalkulator jest automatycznie zarejestrowany przez nazwę
REGISTER_CALCULATOR
za pomocą biblioteki registration.h
. Pamiętaj, że
REGISTER_CALCULATOR
może zarejestrować kalkulator z prefiksem przestrzeni nazw,
jest taka sama jak jej przestrzeń nazw w C++. W tym przypadku kalkulator musi również użyć funkcji
ten sam prefiks przestrzeni nazw.
Błąd braku pamięci
Wyczerpanie pamięci może być objawem zbyt wielu pakietów zgromadzonych w pamięci uruchamianie wykresu MediaPipe. Przyczyny mogą być różne, na przykład:
- Niektóre kalkulatory na wykresie po prostu nie nadążają za pojawieniem się ze strumienia wejściowego w czasie rzeczywistym, np. z kamery wideo.
- Niektóre kalkulatory czekają na pakiety, które nigdy nie zostaną dostarczone.
W przypadku problemu (1) może być konieczne usunięcie starych pakietów starszych pakietów
i przetwarza najnowsze pakiety. Niektóre wskazówki znajdziesz tutaj:
How to process realtime input streams
W przypadku problemu (2) może to być spowodowane tym, że w jednym strumieniu wejściowym brakuje pakietów dla niektórych
. Urządzenie lub kalkulator mogą być nieprawidłowo skonfigurowane albo mogą generować pakiety
tylko sporadycznie. Może to spowodować
które nigdy nie dotrą do odbiorcy, co z kolei powoduje akumulację pakietów po stronie serwera
niektóre strumienie danych wejściowych. MediaPipe rozwiązuje tego typu problemy przy użyciu
„granice sygnatury czasowej”. Niektóre wskazówki znajdziesz tutaj:
How to process realtime input streams
Ustawienie MediaPipe CalculatorGraphConfig::max_queue_size
ogranicza
liczby pakietów w kolejce na dowolnym strumieniu wejściowym przez ograniczenie danych wejściowych
wykres. W przypadku strumieni wejściowych w czasie rzeczywistym jest to liczba pakietów oczekujących na wejście
strumień powinien prawie zawsze wynosić zero lub jeden. W przeciwnym razie możesz zobaczyć
następujący komunikat ostrzegawczy:
Resolved a deadlock by increasing max_queue_size of input stream
Dodatkowo ustawienie CalculatorGraphConfig::report_deadlock
może powodować,
uruchomienia wykresu w celu niepowodzenia i wyświetlenia blokady zakleszonej jako błędu, np. wartości max_queue_size
pełni rolę limitu wykorzystania pamięci.
Wykres się zawiesza
Wiele aplikacji będzie wywoływać metodę CalculatorGraph::CloseAllPacketSources
CalculatorGraph::WaitUntilDone
, aby zakończyć lub zawiesić wykonanie MediaPipe
wykres. Pozwala to wszystkim oczekującym kalkulatorom lub pakietom
zakończenie przetwarzania, a następnie wyłączenie wykresu. Jeśli wszystko pójdzie dobrze, każdy
strumień dotrze do Timestamp::Done
, a każdy kalkulator
zasięg: CalculatorBase::Close
, a następnie CalculatorGraph::WaitUntilDone
zostanie zakończone.
Jeśli niektóre kalkulatory lub strumienie nie osiągają stanu Timestamp::Done
lub
CalculatorBase::Close
, można użyć metody CalculatorGraph::Cancel
wywołana w celu zakończenia uruchomienia wykresu bez oczekiwania na wszystkie oczekujące kalkulatory
i pakiety do ukończenia.
Czas wyjściowy jest nierówny
Niektóre wykresy MediaPipe w czasie rzeczywistym tworzą serię klatek filmu, które można wyświetlić jako jako efekt wideo lub do diagnostyki wideo. Czasami graf MediaPipe generuje w klastrach, gdy na przykład kilka klatek wyjściowych jest ekstrapolacji z tego samego klastra ramek wejściowych. Jeśli wyniki są przedstawione podczas ich tworzenia niektóre klatki wyjściowe są natychmiast zastępowane ramki w tym samym klastrze, co utrudnia przeglądanie i ocenę wyników. wizualnie. W takich przypadkach wizualizację danych wyjściowych można poprawić, wyświetlanie klatek w równych odstępach czasu w czasie rzeczywistym.
MediaPipe odnosi się do tego przypadku użycia, mapując sygnatury czasowe na punkty w czasie rzeczywistym.
Każda sygnatura czasowa wskazuje czas w mikrosekundach. Na przykład kalkulator, na przykład
LiveClockSyncCalculator
może opóźniać wyjście pakietów, aby były zgodne
sygnatury czasowe. Tego rodzaju kalkulator dostosowuje czas odpowiedzi w taki sposób, aby:
- Czas między wynikami to czas między sygnaturami czasowymi jak najbardziej.
- Dane wyjściowe są generowane z najkrótszym możliwym opóźnieniem.
Kalkulator Graph jest opóźniony w stosunku do danych wejściowych
Dla wielu wykresów MediaPipe w czasie rzeczywistym celem jest małe opóźnienie. MediaPipe obsługuje „potok” style przetwarzania równoległego, aby rozpocząć przetwarzanie jak najwcześniej. Najkrótszy czas oczekiwania to zwykle łączny czas wymagany przez każdy kalkulator na „ścieżce krytycznej” następujących po sobie przy użyciu kalkulatorów. Czas oczekiwania grafu MediaPipe może być mniejszy od idealnego z powodu opóźnień związanych z wyświetlaniem klatek z równą częstotliwością, jak opisano w Czas wyjściowy jest nierówny.
Jeśli niektóre kalkulatory na wykresie nie dotrzymują kroku danym wpisywanym w czasie rzeczywistym
wtedy opóźnienie będzie się zwiększać i trzeba będzie
i upuść pakiety wejściowe. Zalecamy używanie interfejsu MediaPipe
kalkulatory przeznaczone do tego celu, takie jak
FlowLimiterCalculator
, jak opisano w
How to process realtime input streams