Rozwiązywanie problemów

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:

  1. Niektóre kalkulatory na wykresie po prostu nie nadążają za pojawieniem się ze strumienia wejściowego w czasie rzeczywistym, np. z kamery wideo.
  2. 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:

  1. Czas między wynikami to czas między sygnaturami czasowymi jak najbardziej.
  2. 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