Rozwiązywanie problemów

Brak ścieżki pliku binarnego 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

zazwyczaj oznacza, że Bazel nie może znaleźć lokalnego pliku binarnego Pythona. Aby rozwiązać ten problem, znajdź najpierw miejsce w pliku binarnym Pythona, a potem dodaj --action_env PYTHON_BIN_PATH=<path to python binary> do polecenia Bazel. Możesz np. przełączyć się na domyślny plik binarny python3 systemu za pomocą tego polecenia:

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 pewne pakiety Pythona nie są zainstalowane. Aby zainstalować te pakiety, uruchom polecenie pip install lub pip3 install, w zależności od wersji binarnej Pythona.

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 może pobrać niezbędnych repozytoriów zależności, których potrzebuje MediaPipe. MedaiPipe ma kilka repozytoriów zależności hostowanych przez witryny Google. W niektórych regionach może być konieczne skonfigurowanie sieciowego serwera proxy lub użycie sieci VPN, aby uzyskać dostęp do tych zasobów. Może być też konieczne dołączenie --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>" do polecenia Bazel. Więcej informacji znajdziesz w tym problemie na GitHubie.

Jeśli uważasz, że nie jest to problem z siecią, być może niektóre zasoby mogą być tymczasowo niedostępne. Uruchom bazel clean --expunge i spróbuj ponownie później. Jeśli to nie pomoże, zgłoś problem w GitHubie ze szczegółowym komunikatem 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 skonfigurowane dla MediaPipe. Zapoznaj się z sekcjami „Zainstaluj OpenCV i FFmpeg” w artykule Instalacja, aby dowiedzieć się, jak zmodyfikować pliki WORKSPACE MediaPipe i linux_opencv/macos_opencv/windows_opencv.BUILD do lokalnych bibliotek openCv. Ten problem z GitHub może też 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 Twoim systemie nie ma zakwalifikowanego języka MediaPipe w Pythonie. MediaPipe Python PyPI oficjalnie obsługuje 64-bitową wersję Pythona od 3.7 do 3.10 w tym systemie operacyjnym:

  • x86_64 Linux
  • x86_64 macOS 10.15 lub nowszy
  • Amd64 Windows

Jeśli system operacyjny jest obecnie obsługiwany, ale błąd nadal występuje, sprawdź, czy plik binarny Pythona i pip dotyczy Pythona od 3.7 do 3.10. W przeciwnym razie pakiet MediaPipe Python możesz utworzyć lokalnie, postępując zgodnie z instrukcjami opisanymi tutaj.

Błąd ładowania biblioteki DLL Python 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 pakietów z możliwością redystrybucji kodu C++ lub plików DLL środowiska wykonawczego Visual C++. Aby rozwiązać ten problem, zainstaluj oficjalny plik vc_redist.x64.exe lub pakiet Pythona „msvc-runtime”, uruchamiając

$ python -m pip install msvc-runtime

Pamiętaj, że pakiet Pythona „msvc-runtime” nie został udostępniony ani zarządzany przez firmę 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, taka jak /libwickjni.so, nie została wczytana, nie została uwzględniona w zależnościach aplikacji lub z jakiegoś powodu nie można jej znaleźć. Pamiętaj, że Java wymaga, by każda biblioteka natywna była jawnie ładowana 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 funkcja OurNewCalculator odwołuje się do elementu CalculatorGraphConfig za pomocą nazwy, ale cel biblioteki OurNewCalculator nie jest połączony z plikiem binarnym aplikacji. Po dodaniu nowego kalkulatora do wykresu kalkulatora trzeba go dodać również jako zależność kompilacji aplikacji z wykorzystaniem wykresu kalkulatora.

Ten błąd jest wychwytywany w czasie działania, ponieważ wykresy kalkulatorów odwołują się do ich nazw w polu CalculatorGraphConfig::Node:calculator. Gdy biblioteka kalkulatora jest połączona z plikiem binarnym aplikacji, kalkulator jest automatycznie rejestrowany ze swoją nazwą za pomocą makra REGISTER_CALCULATOR z wykorzystaniem biblioteki registration.h. Pamiętaj, że REGISTER_CALCULATOR może zarejestrować kalkulator z prefiksem przestrzeni nazw, taki sam jak jego przestrzeń nazw C++. W tym przypadku wykres w kalkulatorze musi też używać takiego samego prefiksu przestrzeni nazw.

Błąd „Brak pamięci”

Wyczerpanie pamięci może być objawem zbyt dużej liczby pakietów nagromadzonych w uruchomionym wykresie MediaPipe. Taka sytuacja może mieć wiele przyczyn, na przykład:

  1. Niektóre kalkulatory na wykresie po prostu nie nadążają za nadejściem pakietów ze strumienia wejściowego przesyłanego w czasie rzeczywistym, np. z kamery wideo.
  2. Niektóre kalkulatory czekają na pakiety, które nigdy nie nadejdą.

W przypadku problemu (1) konieczne może być usunięcie starszych pakietów w celu przetworzenia nowych. Więcej wskazówek znajdziesz tutaj: How to process realtime input streams.

Problem (2) może wynikać z tego, że w jednym strumieniu wejściowym z jakiegoś powodu brakuje pakietów. Urządzenie lub kalkulator może być nieprawidłowo skonfigurowane lub może produkować pakiety rzadko. Może to powodować, że kalkulatory pobierania będą czekały na wiele pakietów, które nigdy nie nadejdą, co z kolei spowoduje gromadzenie się pakietów w strumieniach wejściowych. MediaPipe rozwiązuje tego typu problem za pomocą „granic sygnatury czasowej”. Wskazówki: How to process realtime input streams.

Ustawienie MediaPipe CalculatorGraphConfig::max_queue_size ogranicza liczbę pakietów dodanych w kolejce do dowolnego strumienia wejściowego przez ograniczanie danych wejściowych do wykresu. W przypadku strumieni danych wejściowych w czasie rzeczywistym liczba pakietów w kolejce w strumieniu wejściowym prawie zawsze powinna wynosić 0 lub 1. W przeciwnym razie może pojawić się komunikat ostrzegawczy:

Resolved a deadlock by increasing max_queue_size of input stream

Możesz też skonfigurować ustawienie CalculatorGraphConfig::report_deadlock w taki sposób, aby uruchamianie wykresu kończyło się niepowodzeniem i wyświetlanie zakleszczenia jako błąd, na przykład max_queue_size działa jak limit wykorzystania pamięci.

Wykres się zawiesza

Wiele aplikacji wywołuje metody CalculatorGraph::CloseAllPacketSources i CalculatorGraph::WaitUntilDone, aby zakończyć lub zawiesić wykonanie wykresu MediaPipe. Celem jest umożliwienie wszystkim oczekującym kalkulatorom i pakietom ukończenia przetwarzania, a następnie wyłączenie wykresu. Jeśli wszystko pójdzie dobrze, każdy strumień na wykresie osiągnie wartość Timestamp::Done, a każdy kalkulator osiągnie wartość CalculatorBase::Close, a następnie CalculatorGraph::WaitUntilDone zakończy się powodzeniem.

Jeśli niektóre kalkulatory lub strumienie nie mogą osiągnąć stanu Timestamp::Done lub CalculatorBase::Close, można wywołać metodę CalculatorGraph::Cancel, aby zakończyć uruchomienie wykresu bez oczekiwania na zakończenie wszystkich oczekujących kalkulatorów i pakietów.

Czas wyjściowy jest nierównomierny

Niektóre wykresy MediaPipe w czasie rzeczywistym generują serię klatek wideo, które można oglądać jako efekt wideo lub w ramach diagnostyki wideo. Czasami wykres MediaPipe generuje takie klatki w klastrach, na przykład wtedy, gdy z tego samego zbioru klatek wyjściowych zostało ekstrapolowanych kilka klatek wyjściowych. Jeśli dane wyjściowe są prezentowane w postaci, w jakiej zostały wygenerowane, niektóre ramki wyjściowe są natychmiast zastępowane późniejszymi ramkami w tym samym klastrze, co utrudnia przeglądanie i ocenianie wyników. W takich przypadkach wizualizację wyjściową można ulepszyć, prezentując klatki w równych odstępach czasu w czasie rzeczywistym.

MediaPipe uwzględnia ten przypadek użycia, mapując sygnatury czasowe na punkty w czasie rzeczywistym. Każda sygnatura czasowa wskazuje czas w mikrosekundach, a kalkulator, np. LiveClockSyncCalculator, może opóźniać dane wyjściowe pakietów zgodnie z ich sygnaturami czasowymi. Kalkulator ten dostosowuje czas wyników w taki sposób, że:

  1. Czas między danymi wyjściowymi jest jak najbardziej zbliżony do czasu między sygnaturami czasowymi.
  2. Dane wyjściowe są generowane z najmniejszym możliwym opóźnieniem.

Wykres kalkulatora opóźnia się w stosunku do danych wejściowych

W przypadku wielu wykresów MediaPipe w czasie rzeczywistym celem jest małe opóźnienie. MediaPipe obsługuje przetwarzanie równoległe w stylu „potokowym”, aby umożliwić jak najwcześniejsze rozpoczęcie przetwarzania każdego pakietu. Normalnie najniższy możliwy czas oczekiwania to łączny czas wymagany przez każdy kalkulator na „ścieżce krytycznej” kolejnych kalkulatorów. Opóźnienie wykresu MediaPipe może być mniejsze niż idealne z powodu opóźnień wprowadzonych w wyświetlaniu klatek w równomiernych odstępach zgodnie z opisem w sekcji Czas wyjściowy jest nierównomierny.

Jeśli niektóre kalkulatory na wykresie nie odpowiadają strumieniom danych wejściowych w czasie rzeczywistym, opóźnienie będzie coraz większe i konieczne będzie porzucenie niektórych pakietów wejściowych. Zalecana metoda to użycie kalkulatorów MediaPipe przeznaczonych do tego celu, np. FlowLimiterCalculator, jak opisano w artykule How to process realtime input streams.