Khắc phục sự cố

Thiếu đường dẫn nhị phân Python

Thông báo lỗi:

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

thường chỉ ra rằng Bazel không tìm thấy tệp nhị phân Python cục bộ. Để giải quyết vấn đề này, trước tiên, vui lòng tìm vị trí của tệp nhị phân python rồi thêm --action_env PYTHON_BIN_PATH=<path to python binary> vào lệnh Bazel. Ví dụ: bạn có thể chuyển sang sử dụng tệp nhị phân python3 mặc định của hệ thống bằng lệnh sau:

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

Thiếu các gói Python cần thiết

Thông báo lỗi:

ImportError: No module named numpy
Is numpy installed?

thường cho biết rằng một số gói Python nhất định chưa được cài đặt. Vui lòng chạy pip install hoặc pip3 install, tuỳ thuộc vào phiên bản nhị phân Python để cài đặt các gói đó.

Không tìm nạp được kho lưu trữ phần phụ thuộc từ xa

Thông báo lỗi:

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)

thường cho biết rằng Bazel không thể tải các kho lưu trữ phần phụ thuộc cần thiết mà MediaPipe cần. MedaiPipe có một số kho lưu trữ phần phụ thuộc do các trang web của Google lưu trữ. Ở một số khu vực, bạn có thể cần thiết lập proxy mạng hoặc sử dụng VPN để truy cập các tài nguyên đó. Bạn cũng có thể cần thêm --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>" vào lệnh Bazel. Hãy xem vấn đề này trên GitHub để biết thêm thông tin chi tiết.

Nếu bạn cho rằng đó không phải là vấn đề về mạng, thì một khả năng khác là một số tài nguyên có thể tạm thời không sử dụng được, vui lòng chạy bazel clean --expunge rồi thử lại sau. Nếu cách này vẫn không hoạt động, vui lòng báo cáo vấn đề trên GitHub kèm theo thông báo lỗi chi tiết.

Cấu hình MediaPipe OpenCV không chính xác

Thông báo lỗi:

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

thường chỉ ra rằng OpenCV không được định cấu hình đúng cho MediaPipe. Vui lòng xem mục "Cài đặt OpenCV và FFmpeg" trong mục Installation (Cài đặt) để biết cách sửa đổi các tệp WORKSPACE và linux_opencv/macos_opencv/windows_opencv.BUILD cho thư viện Opencv cục bộ của bạn. Vấn đề này trên GitHub cũng có thể hữu ích.

Lỗi cài đặt pip Python

Thông báo lỗi:

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

sau khi chạy pip install mediapipe thường cho biết rằng không có MediaPipe Python nào đủ điều kiện cho hệ thống của bạn. Xin lưu ý rằng MediaPipe Python PyPI chính thức hỗ trợ phiên bản 64 bit của Python 3.7 đến 3.10 trên hệ điều hành sau:

  • Linux x86_64
  • x86_64 macOS 10.15 trở lên
  • Windows amd64

Nếu hệ điều hành đang được hỗ trợ mà bạn vẫn gặp lỗi này, vui lòng đảm bảo rằng cả tệp nhị phân Python và pip đều dành cho Python 3.7 đến 3.10. Nếu không, vui lòng cân nhắc tạo gói MediaPipe Python cục bộ bằng cách làm theo hướng dẫn tại đây.

Không tải được DLL Python trên Windows

Thông báo lỗi:

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

thường cho biết rằng hệ thống Windows cục bộ đang thiếu các gói có thể phân phối lại Visual C++ và/hoặc DLL thời gian chạy Visual C++. Bạn có thể giải quyết vấn đề này bằng cách cài đặt vc_redist.x64.exe chính thức hoặc cài đặt gói Python "msvc-runtime" bằng cách chạy

$ python -m pip install msvc-runtime

Xin lưu ý rằng gói Python "msvc-runtime" không được Microsoft phát hành hoặc duy trì.

Không tìm thấy phương thức gốc

Thông báo lỗi:

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

thường cho biết rằng một thư viện gốc cần thiết, chẳng hạn như /libwickjni.so chưa được tải, không được đưa vào các phần phụ thuộc của ứng dụng hoặc không tìm thấy được vì lý do nào đó. Xin lưu ý rằng Java yêu cầu mọi thư viện gốc đều phải được tải một cách rõ ràng bằng hàm System.loadLibrary.

Không tìm thấy máy tính nào đã đăng ký

Thông báo lỗi:

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

thường cho biết OurNewCalculator được tham chiếu theo tên trong CalculatorGraphConfig nhưng mục tiêu thư viện cho OurNewCalculator chưa được liên kết với tệp nhị phân của ứng dụng. Khi thêm một công cụ tính mới vào biểu đồ tính toán, bạn cũng phải thêm công cụ tính đó dưới dạng phần phụ thuộc của bản dựng của các ứng dụng dùng biểu đồ tính toán.

Lỗi này xảy ra trong thời gian chạy vì biểu đồ máy tính tham chiếu máy tính theo tên thông qua trường CalculatorGraphConfig::Node:calculator. Khi thư viện máy tính được liên kết với một tệp nhị phân của ứng dụng, máy tính đó sẽ tự động được đăng ký theo tên thông qua macro REGISTER_CALCULATOR bằng cách sử dụng thư viện registration.h. Xin lưu ý rằng REGISTER_CALCULATOR có thể đăng ký máy tính có tiền tố không gian tên, giống với không gian tên C++. Trong trường hợp này, biểu đồ tính toán cũng phải sử dụng cùng một tiền tố không gian tên.

Lỗi hết bộ nhớ

Tình trạng hết bộ nhớ có thể là dấu hiệu của việc có quá nhiều gói được tích luỹ bên trong một biểu đồ MediaPipe đang chạy. Điều này có thể xảy ra vì một số lý do, chẳng hạn như:

  1. Đơn giản là một số máy tính trong biểu đồ không thể theo kịp việc xuất hiện các gói từ luồng đầu vào theo thời gian thực, chẳng hạn như máy quay video.
  2. Một số máy tính đang chờ các gói không bao giờ đến.

Đối với bài toán (1), bạn có thể cần phải bỏ một số gói cũ hơn để xử lý các gói mới hơn. Để xem một số gợi ý, hãy xem: How to process realtime input streams.

Đối với vấn đề (2), có thể là một luồng đầu vào thiếu các gói vì một số lý do. Một thiết bị hoặc máy tính có thể bị định cấu hình sai hoặc chỉ tạo các gói ngẫu nhiên. Điều này có thể khiến các trình tính toán hạ nguồn phải chờ nhiều gói không bao giờ đến, do đó khiến các gói tích luỹ trên một số luồng đầu vào. MediaPipe giải quyết loại vấn đề này bằng cách sử dụng "giới hạn dấu thời gian". Để xem một số gợi ý, hãy xem: How to process realtime input streams.

Chế độ cài đặt MediaPipe CalculatorGraphConfig::max_queue_size giới hạn số lượng gói được đưa vào hàng đợi trên bất kỳ luồng đầu vào nào bằng cách điều tiết dữ liệu đầu vào cho biểu đồ. Đối với luồng đầu vào theo thời gian thực, số lượng gói được xếp hàng tại luồng đầu vào hầu như luôn bằng 0 hoặc 1. Nếu không phải như vậy, bạn có thể thấy thông báo cảnh báo sau:

Resolved a deadlock by increasing max_queue_size of input stream

Ngoài ra, bạn có thể thiết lập chế độ cài đặt CalculatorGraphConfig::report_deadlock để khiến biểu đồ chạy không thành công và biểu thị tình trạng tắc nghẽn dưới dạng lỗi, sao cho max_queue_size hoạt động như một giới hạn sử dụng bộ nhớ.

Biểu đồ bị treo

Nhiều ứng dụng sẽ gọi CalculatorGraph::CloseAllPacketSourcesCalculatorGraph::WaitUntilDone để hoàn tất hoặc tạm ngưng quá trình thực thi biểu đồ MediaPipe. Mục tiêu ở đây là cho phép mọi máy tính hoặc gói đang chờ xử lý hoàn tất quá trình xử lý, sau đó tắt biểu đồ. Nếu mọi việc diễn ra suôn sẻ, mọi luồng trong biểu đồ sẽ đạt Timestamp::Done và mọi công cụ tính sẽ đạt đến CalculatorBase::Close, sau đó, CalculatorGraph::WaitUntilDone sẽ hoàn tất thành công.

Nếu một số máy tính hoặc luồng không thể đạt đến trạng thái Timestamp::Done hoặc CalculatorBase::Close, thì phương thức CalculatorGraph::Cancel có thể được gọi để chấm dứt quá trình chạy biểu đồ mà không cần đợi tất cả các gói và máy tính đang chờ xử lý hoàn tất.

Thời gian đầu ra không đồng đều

Một số biểu đồ MediaPipe theo thời gian thực tạo ra một loạt khung hình video để xem dưới dạng hiệu ứng video hoặc dữ liệu chẩn đoán video. Đôi khi, một biểu đồ MediaPipe sẽ tạo các khung này theo cụm, chẳng hạn như khi một số khung đầu ra được trích xuất từ cùng một cụm khung đầu vào. Nếu đầu ra được trình bày khi chúng được tạo, một số khung đầu ra sẽ ngay lập tức được thay thế bằng các khung hình sau đó trong cùng một cụm, điều này khiến kết quả khó xem và đánh giá một cách trực quan. Trong các trường hợp như vậy, hình ảnh đầu ra có thể được cải thiện bằng cách trình bày các khung hình ở các khoảng thời gian đồng đều theo thời gian thực.

MediaPipe giải quyết trường hợp sử dụng này bằng cách ánh xạ dấu thời gian tới các điểm theo thời gian thực. Mỗi dấu thời gian cho biết thời gian tính bằng micrô giây và một máy tính như LiveClockSyncCalculator có thể trì hoãn đầu ra của các gói để khớp với dấu thời gian. Loại máy tính này điều chỉnh thời gian xuất dữ liệu sao cho:

  1. Thời gian giữa các đầu ra tương ứng với thời gian giữa các dấu thời gian càng gần nhau càng tốt.
  2. Các dữ liệu đầu ra được tạo với độ trễ nhỏ nhất có thể.

CalculatorGraph hoạt động chậm hơn so với dữ liệu đầu vào

Đối với nhiều biểu đồ MediaPipe theo thời gian thực, độ trễ thấp là một mục tiêu. MediaPipe hỗ trợ quy trình xử lý song song theo kiểu "pipelines" để bắt đầu xử lý từng gói sớm nhất có thể. Thông thường, độ trễ thấp nhất có thể là tổng thời gian mà mỗi công cụ tính yêu cầu theo "đường dẫn quan trọng" của các lần tính liên tiếp. Độ trễ của biểu đồ MediaPipe có thể kém hơn mức lý tưởng do độ trễ được đưa vào để hiển thị các khung hình đồng đều như mô tả trong phần Thời gian đầu ra không đồng đều.

Nếu một số máy tính trong biểu đồ không thể theo kịp luồng đầu vào theo thời gian thực, thì độ trễ sẽ tiếp tục tăng và bạn cần phải bỏ một số gói đầu vào. Kỹ thuật đề xuất là sử dụng các máy tính MediaPipe được thiết kế riêng cho mục đích này, chẳng hạn như FlowLimiterCalculator như mô tả trong How to process realtime input streams.