문제 해결

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 바이너리가 있는 위치를 찾은 다음 Bazel 명령어에 --action_env PYTHON_BIN_PATH=<path to python binary>를 추가하세요. 예를 들어 다음 명령어를 사용하여 시스템 기본 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 패키지가 설치되지 않았음을 나타냅니다. 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이 MediaPipe에 필요한 필수 종속 항목 저장소를 다운로드하지 못함을 나타냅니다. MedaiPipe에는 Google 사이트에서 호스팅되는 여러 종속 항목 저장소가 있습니다. 일부 리전에서는 네트워크 프록시를 설정하거나 VPN을 사용하여 이러한 리소스에 액세스해야 할 수 있습니다. Bazel 명령어에 --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>"를 추가해야 할 수도 있습니다. 자세한 내용은 이 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 라이브러리에 대한 MediaPipe의 WORKSPACE 및 linux_opencv/macos_opencv/windows_opencv.BUILD 파일을 수정하는 방법을 알아보려면 설치의 'OpenCV 및 FFmpeg 설치' 섹션을 살펴보세요. 이 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는 다음 OS에서 Python 3.7~3.10의 64비트 버전을 공식적으로 지원합니다.

  • x86_64 Linux
  • x86_64 macOS 10.15 이상
  • AMD64 Windows

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 패키지는 Microsoft에서 출시되거나 유지보수되지 않습니다.

네이티브 메서드를 찾을 수 없습니다.

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

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

일반적으로 /libwickjni.so와 같은 필요한 네이티브 라이브러리가 로드되지 않았거나 앱의 종속 항목에 포함되지 않았거나 어떤 이유로든 찾을 수 없음을 나타냅니다. 자바에서는 모든 네이티브 라이브러리가 System.loadLibrary 함수를 사용하여 명시적으로 로드되어야 합니다.

등록된 계산기를 찾을 수 없습니다.

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

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

일반적으로 OurNewCalculatorCalculatorGraphConfig에서 이름으로 참조되지만 OurNewCalculator의 라이브러리 타겟이 애플리케이션 바이너리에 연결되지 않았음을 나타냅니다. 계산기 그래프에 새 계산기가 추가되면 계산기 그래프를 사용하는 애플리케이션의 빌드 종속 항목으로도 계산기를 추가해야 합니다.

계산기 그래프는 CalculatorGraphConfig::Node:calculator 필드를 통해 계산기를 이름으로 참조하므로 이 오류는 런타임 시 포착됩니다. 계산기 라이브러리가 애플리케이션 바이너리에 연결되면 계산기는 registration.h 라이브러리를 사용하여 REGISTER_CALCULATOR 매크로를 통해 이름으로 자동 등록됩니다. 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::CloseAllPacketSourcesCalculatorGraph::WaitUntilDone를 호출하여 MediaPipe 그래프 실행을 완료하거나 정지합니다. 여기서 목표는 대기 중인 계산기 또는 패킷이 처리를 완료한 다음 그래프를 종료하도록 허용하는 것입니다. 모든 것이 순조롭게 진행되면 그래프의 모든 스트림이 Timestamp::Done에 도달하고 모든 계산기가 CalculatorBase::Close에 도달한 다음 CalculatorGraph::WaitUntilDone가 성공적으로 완료됩니다.

일부 계산기 또는 스트림이 Timestamp::Done 또는 CalculatorBase::Close 상태에 도달할 수 없으면 메서드 CalculatorGraph::Cancel를 호출하여 대기 중인 모든 계산기와 패킷이 완료될 때까지 기다리지 않고 그래프 실행을 종료할 수 있습니다.

출력 타이밍이 고르지 않음

일부 실시간 MediaPipe 그래프는 동영상 효과 또는 동영상 진단으로 볼 수 있도록 일련의 동영상 프레임을 생성합니다. MediaPipe 그래프가 이러한 프레임을 클러스터로 생성하는 경우가 있습니다(예: 동일한 입력 프레임 클러스터에서 여러 출력 프레임이 추정되는 경우). 출력이 생성된 그대로 표시되면 일부 출력 프레임이 즉시 동일한 클러스터의 이후 프레임으로 대체되므로 결과를 시각적으로 보고 평가하기가 어렵습니다. 이 경우 실시간으로 균등한 간격으로 프레임을 표시하여 출력 시각화를 개선할 수 있습니다.

MediaPipe는 타임스탬프를 포인트에 실시간으로 매핑하여 이 사용 사례를 해결합니다. 각 타임스탬프는 시간을 마이크로초 단위로 나타내며 LiveClockSyncCalculator과 같은 계산기는 타임스탬프와 일치하도록 패킷의 출력을 지연시킬 수 있습니다. 이 계산기는 다음과 같이 출력의 타이밍을 조정합니다.

  1. 출력 사이의 시간은 타임스탬프 사이의 시간과 최대한 일치합니다.
  2. 출력은 가능한 최소 지연으로 생성됩니다.

CalculatorGraph가 입력값보다 뒤처짐

많은 실시간 MediaPipe 그래프에서는 짧은 지연 시간이 목표입니다. MediaPipe는 각 패킷의 처리를 최대한 빨리 시작하기 위해 '파이프라인' 스타일의 병렬 처리를 지원합니다. 일반적으로 가능한 가장 짧은 지연 시간은 연속적인 계산기의 '주요 경로'에 따라 각 계산기에 필요한 총 시간입니다. 출력 타이밍이 균일하지 않음에 설명된 것처럼 균등한 간격으로 프레임을 표시하기 위해 도입된 지연으로 인해 MediaPipe 그래프의 지연 시간이 이상적인 수준보다 나쁠 수 있습니다.

그래프의 일부 계산기가 실시간 입력 스트림을 따라잡지 못하면 지연 시간이 계속 증가하며 일부 입력 패킷을 삭제해야 합니다. 권장되는 기법은 How to process realtime input streams에 설명된 대로 FlowLimiterCalculator와 같이 이 용도로 설계된 MediaPipe 계산기를 사용하는 것입니다.