문제 해결

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 명령어로 변경합니다. 대상 예를 들어, 다음 명령어를 실행합니다.

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 패키지가 설치되지 않았음을 나타냅니다. 실행하시기 바랍니다. Python 바이너리 버전에 따라 pip install 또는 pip3 install를 지정할 수 있습니다. 설치해야 합니다

원격 종속 항목 저장소를 가져올 수 없습니다.

오류 메시지는 다음과 같습니다.

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이 필요한 종속 항목 저장소를 다운로드하지 못한다는 것을 나타냅니다. 구현해 보겠습니다. 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 설치'를 섹션: 설치: MediaPipe의 WORKSPACE 및 로컬 opencv용 linux_opencv/macos_opencv/windows_opencv.BUILD 파일 제공합니다 이 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 이상
  • Windows용 AMD64

현재 지원되는 OS인데도 오류가 계속 표시되면 Python과 pip 바이너리 모두 Python 3.7~3.10용입니다. 그렇지 않으면 다음 방법에 따라 MediaPipe Python 패키지를 로컬에서 빌드하는 것이 좋습니다. 여기에서 안내를 따르세요.

Windows에서 Python DLL 로드 실패

오류 메시지는 다음과 같습니다.

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

일반적으로 로컬 Windows 시스템에 Visual C++가 없음을 나타냅니다. 재배포 가능 패키지 및/또는 Visual C++ 런타임 DLL입니다. 이 문제는 공식 설치 또는 vc_redist.x64.exe 또는 'msvc-runtime' Python 패키지

$ python -m pip install msvc-runtime

'msvc-runtime' Python 패키지는 출시 또는 유지보수되지 않습니다. 개발되었습니다.

네이티브 메서드를 찾을 수 없음

오류 메시지는 다음과 같습니다.

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"

일반적으로 OurNewCalculatorCalculatorGraphConfig이지만 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은 입력 스트림에서 큐에 추가된 패킷의 수를 그래프로 확인할 수 있습니다. 실시간 입력 스트림의 경우 입력에서 큐에 추가된 패킷 수입니다. 스트림은 거의 항상 0 또는 1이어야 합니다. 그렇지 않을 경우 다음과 같은 경고 메시지가 표시됩니다.

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 'pipelined'를 지원합니다. 병렬 처리 스타일을 지정하여 가능한 한 조기에 배포해야 합니다 일반적으로 가능한 가장 짧은 지연 시간은 '중요 경로'를 따라 각 계산기에 소요된 총 시간 (연속) 계산기. MediaPipe 그래프의 지연 시간이 이상적일 수 있음 프레임 표시에 도입된 지연으로 인해 출력 타이밍이 고르지 않습니다.

그래프의 일부 계산기가 실시간 입력과 보조를 맞추지 못하는 경우 지연 시간이 계속 증가하기 때문에 일부 입력 패킷을 삭제합니다. 권장되는 기법은 이 목적을 위해 특별히 설계된 계산기와 같이 FlowLimiterCalculator: How to process realtime input streams