Устранение неполадок

Отсутствует двоичный путь Python

Сообщение об ошибке:

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

обычно указывает на то, что Bazel не может найти локальный двоичный файл Python. Чтобы решить эту проблему, сначала найдите, где находится двоичный файл Python, а затем добавьте --action_env PYTHON_BIN_PATH=<path to python binary> к команде Bazel. Например, вы можете переключиться на использование системного двоичного файла python3 по умолчанию с помощью следующей команды:

bazel build -c opt \
  --define MEDIAPIPE_DISABLE_GPU=1 \
  --action_env PYTHON_BIN_PATH=$(which python3) \
  mediapipe/examples/desktop/hello_world

Отсутствуют необходимые пакеты Python

Сообщение об ошибке:

ImportError: No module named numpy
Is numpy installed?

обычно указывает на то, что определенные пакеты Python не установлены. Пожалуйста, запустите pip install или pip3 install в зависимости от вашей двоичной версии Python, чтобы установить эти пакеты.

Не удалось получить удаленные репозитории зависимостей.

Сообщение об ошибке:

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)

обычно указывает на то, что Bazel не удается загрузить необходимые репозитории зависимостей, необходимые MediaPipe. MedaiPipe имеет несколько репозиториев зависимостей, размещенных на сайтах Google. В некоторых регионах вам может потребоваться настроить сетевой прокси-сервер или использовать VPN для доступа к этим ресурсам. Вам также может потребоваться добавить --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>" к команде Bazel. Дополнительную информацию см. в этом выпуске GitHub .

Если вы считаете, что проблема не в сети, возможно, некоторые ресурсы могут быть временно недоступны, запустите bazel clean --expunge и повторите попытку позже. Если он по-прежнему не работает, отправьте сообщение о проблеме на GitHub с подробным сообщением об ошибке.

Неправильная конфигурация MediaPipe OpenCV

Сообщение об ошибке:

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)'

обычно указывает на то, что OpenCV неправильно настроен для MediaPipe. Пожалуйста, ознакомьтесь с разделами «Установка OpenCV и FFmpeg» в разделе « Установка» , чтобы узнать, как изменить файлы WORKSPACE и linux_opencv/macos_opencv/windows_opencv.BUILD MediaPipe для ваших локальных библиотек opencv. Эта проблема с GitHub также может помочь.

Ошибка установки Python pip

Сообщение об ошибке:

ERROR: Could not find a version that satisfies the requirement mediapipe
ERROR: No matching distribution found for mediapipe

после запуска pip install mediapipe обычно указывает на отсутствие подходящего MediaPipe Python для вашей системы. Обратите внимание, что MediaPipe Python PyPI официально поддерживает 64-разрядную версию Python 3.7–3.10 в следующих ОС:

  • x86_64 Linux
  • x86_64 macOS 10.15+
  • amd64 Windows

Если операционная система в настоящее время поддерживается, но вы по-прежнему видите эту ошибку, убедитесь, что двоичный файл Python и pip предназначены для версий Python 3.7–3.10. В противном случае рассмотрите возможность локальной сборки пакета MediaPipe Python, следуя инструкциям здесь .

Ошибка загрузки Python DLL в Windows

Сообщение об ошибке:

ImportError: DLL load failed: The specified module could not be found

обычно указывает на то, что в локальной системе Windows отсутствуют распространяемые пакеты Visual C++ и/или библиотеки DLL среды выполнения Visual C++. Эту проблему можно решить, установив официальный файл vc_redist.x64.exe или установив пакет Python «msvc-runtime», запустив

$ python -m pip install msvc-runtime

Обратите внимание, что пакет Python «msvc-runtime» не выпускается и не поддерживается Microsoft.

Собственный метод не найден

Сообщение об ошибке:

java.lang.UnsatisfiedLinkError: No implementation found for void com.google.wick.Wick.nativeWick

обычно указывает на то, что необходимая собственная библиотека, например /libwickjni.so не загружена, не включена в зависимости приложения или не может быть найдена по какой-либо причине. Обратите внимание, что Java требует, чтобы каждая собственная библиотека была явно загружена с помощью функции System.loadLibrary .

Зарегистрированный калькулятор не найден

Сообщение об ошибке:

No registered object with name: OurNewCalculator; Unable to find Calculator "OurNewCalculator"

обычно указывает, что на OurNewCalculator имеется ссылка по имени в CalculatorGraphConfig , но что целевая библиотека для OurNewCalculator не связана с двоичным файлом приложения. Когда в граф калькулятора добавляется новый калькулятор, этот калькулятор также необходимо добавить в качестве зависимости сборки приложений, использующих граф калькулятора.

Эта ошибка обнаруживается во время выполнения, поскольку графики калькуляторов ссылаются на свои калькуляторы по имени через поле CalculatorGraphConfig::Node:calculator . Когда библиотека для калькулятора связана с двоичным файлом приложения, калькулятор автоматически регистрируется по имени с помощью макроса REGISTER_CALCULATOR с использованием библиотеки registration.h . Обратите внимание, что REGISTER_CALCULATOR может зарегистрировать калькулятор с префиксом пространства имен, идентичным его пространству имен C++. В этом случае граф калькулятора также должен использовать тот же префикс пространства имен.

Ошибка «Недостаточно памяти»

Нехватка памяти может быть признаком того, что внутри работающего графа MediaPipe накапливается слишком много пакетов. Это может произойти по ряду причин, таких как:

  1. Некоторые калькуляторы на графике просто не успевают за поступлением пакетов из входного потока реального времени, такого как видеокамера.
  2. Некоторые калькуляторы ждут пакеты, которые никогда не прибудут.

Для решения проблемы (1) может потребоваться удалить некоторые старые пакеты из старых, чтобы обработать более свежие пакеты. Некоторые подсказки см. в How to process realtime input streams .

В случае проблемы (2) возможно, что в одном входном потоке по какой-то причине отсутствуют пакеты. Устройство или калькулятор могут быть неправильно настроены или генерировать пакеты лишь время от времени. Это может привести к тому, что нижестоящие калькуляторы будут ждать большого количества пакетов, которые так и не поступят, что, в свою очередь, приведет к накоплению пакетов в некоторых из их входных потоков. MediaPipe решает эту проблему, используя «границы временных меток». Некоторые подсказки см. в How to process realtime input streams .

Параметр MediaPipe CalculatorGraphConfig::max_queue_size ограничивает количество пакетов, поставленных в очередь в любом входном потоке, путем регулирования входных данных в графе. Для входных потоков реального времени количество пакетов, поставленных в очередь во входном потоке, почти всегда должно быть равно нулю или единице. Если это не так, вы можете увидеть следующее предупреждающее сообщение:

Resolved a deadlock by increasing max_queue_size of input stream

Кроме того, можно установить параметр CalculatorGraphConfig::report_deadlock чтобы вызвать сбой выполнения графа и отображать взаимоблокировку как ошибку, например, max_queue_size действует как ограничение использования памяти.

График зависает

Многие приложения будут вызывать CalculatorGraph::CloseAllPacketSources и CalculatorGraph::WaitUntilDone , чтобы завершить или приостановить выполнение графа MediaPipe. Цель здесь — позволить любым ожидающим калькуляторам или пакетам завершить обработку, а затем отключить граф. Если все пойдет хорошо, каждый поток в графе достигнет Timestamp::Done , а каждый калькулятор достигнет CalculatorBase::Close , а затем CalculatorGraph::WaitUntilDone завершится успешно.

Если некоторые калькуляторы или потоки не могут достичь состояния Timestamp::Done или CalculatorBase::Close , то можно вызвать метод CalculatorGraph::Cancel чтобы завершить выполнение графа, не дожидаясь завершения всех ожидающих калькуляторов и пакетов.

Синхронизация вывода неравномерна

Некоторые графики MediaPipe в реальном времени создают серию видеокадров для просмотра в качестве видеоэффекта или видеодиагностики. Иногда граф MediaPipe создает эти кадры в кластерах, например, когда несколько выходных кадров экстраполируются из одного и того же кластера входных кадров. Если выходные данные представлены в том виде, в каком они были созданы, некоторые выходные кадры немедленно заменяются более поздними кадрами в том же кластере, что затрудняет визуальное представление и оценку результатов. В подобных случаях визуализацию результатов можно улучшить, представляя кадры через равные промежутки времени в реальном времени.

MediaPipe решает этот вариант использования, сопоставляя временные метки с точками в реальном времени. Каждая временная метка указывает время в микросекундах, а калькулятор, такой как LiveClockSyncCalculator может задерживать вывод пакетов в соответствии с их временными метками. Калькулятор такого типа регулирует время вывода таким образом, что:

  1. Время между выходами максимально точно соответствует времени между временными метками.
  2. Выходные данные производятся с минимально возможной задержкой.

CalculatorGraph отстает от входных данных

Для многих графиков MediaPipe в реальном времени целью является низкая задержка. MediaPipe поддерживает параллельную обработку в «конвейерном» стиле, чтобы начать обработку каждого пакета как можно раньше. Обычно минимально возможная задержка — это общее время, необходимое каждому калькулятору на «критическом пути» последовательных калькуляторов. Задержка графика MediaPipe может быть хуже идеальной из-за задержек, возникающих при отображении кадров через равные интервалы, как описано в разделе «Сроки вывода неравномерны» .

Если некоторые из калькуляторов на графике не успевают за входными потоками в реальном времени, то задержка будет продолжать увеличиваться, и возникнет необходимость отбрасывать некоторые входные пакеты. Рекомендуемый метод — использовать калькуляторы MediaPipe, разработанные специально для этой цели, такие как FlowLimiterCalculator , как описано в разделе How to process realtime input streams .