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 được tệp nhị phân Python cục bộ. Để giải quyết vấn đề này, trước tiên hãy 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. Cho 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 cách sau đây:

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

Nếu bạn cho rằng đó không phải là sự cố mạng, một khả năng khác là tài nguyên có thể tạm thời không có sẵn, 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 cho biết OpenCV không được định cấu hình đúng cho MediaPipe. Năn nỉ hãy xem đường liên kết "Cài đặt OpenCV và FFmpeg" các phần trong Cài đặt để xem cách sửa đổi WORKSPACE và Tệp linux_opencv/macos_opencv/windows_opencv.BUILD cho opencv cục bộ của bạn thư viện. Vấn đề này trên GitHub cũng có thể giúp ích cho bạn.

Không cài đặt được 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 không có MediaPipe Python đủ đ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 phiên bản 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 hiện được hỗ trợ và bạn vẫn gặp lỗi này, hãy đảm bảo cả hai tệp nhị phân Python và pip đều dành cho Python 3.7 đến 3.10. Nếu không, hãy cân nhắc tạo gói MediaPipe Python cục bộ bằng cách làm theo xem hướng dẫn tại đây.

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

Thông báo lỗi:

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

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

$ python -m pip install msvc-runtime

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

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 hoặc chưa được đưa vào phần phụ thuộc của ứng dụng hoặc không thể được được tìm thấy vì lý do nào đó. Xin lưu ý rằng Java yêu cầu mọi thư viện gốc phải được tải rõ ràng bằng hàm System.loadLibrary.

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

Thông báo lỗi:

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

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

Lỗi này gặp phải trong thời gian chạy do biểu đồ trên máy tính tham chiếu đến theo tên thông qua trường CalculatorGraphConfig::Node:calculator. Khi thư viện cho máy tính được liên kết với tệp nhị phân của ứng dụng, 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. Lưu ý rằng REGISTER_CALCULATOR có thể đăng ký một máy tính bằng tiền tố không gian tên, giống hệt với không gian tên C++. Trong trường hợp này, biểu đồ máy tính 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ớ

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

  1. Một số máy tính trong đồ thị đơn giản không thể bắt kịp với sự xuất hiện của các gói dữ liệu 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 đợi các gói không bao giờ đến.

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

Đối với bài toán (2), có thể một luồng đầu vào bị thiếu gói cho 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 tạo gói tin chỉ thỉnh thoảng. Điều này có thể khiến các công cụ tính hạ nguồn phải đợi nhiều các gói không bao giờ đến, do đó các gói sẽ tích luỹ một số luồng đầu vào của họ. MediaPipe xử lý loại sự cố này bằng cách sử dụng "giới hạn dấu thời gian". Để biết 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ố gói được thêm 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 đầu vào cho biểu đồ. Đối với luồng đầu vào theo thời gian thực, số gói đã xếp hàng đợi tại một đầu vào luồng phải hầu như luôn có giá trị 0 hoặc 1. Nếu không phải trường hợp nà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, cài đặt CalculatorGraphConfig::report_deadlock có thể được đặt để khiến chạy biểu đồ không thành công và hiển thị tắc nghẽn dưới dạng lỗi, chẳng hạn như max_queue_size đóng vai trò là 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 việc thực thi MediaPipe biểu đồ. Mục tiêu ở đây là cho phép mọi máy tính hoặc gói tin đang chờ xử lý xử lý xong, sau đó tắt biểu đồ. Nếu mọi việc suôn sẻ, mọi trong biểu đồ sẽ đạt Timestamp::Done và mỗi máy tính sẽ truy cập CalculatorBase::Close, sau đó là 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ể là được gọi để chấm dứt chạy đồ thị mà không cần đợi tất cả các máy tính đang chờ xử lý và gói dữ liệu cần hoàn tất.

Thời gian xuất không đồng đều

Một số đồ thị MediaPipe 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ưới dạng công cụ chẩn đoán video. Đôi khi, đồ thị MediaPipe sẽ tạo ra các khung này theo cụm, ví dụ: khi một số khung đầu ra được được ngoại suy từ cùng một cụm khung đầu vào. Nếu kết quả được trình bày khi chúng được tạo ra, một số khung đầu ra ngay lập tức được thay thế bằng các khung trong cùng một cụm, khiến kết quả khó xem và đánh giá một cách trực quan. Trong những trường hợp như vậy, có thể cải thiện hình ảnh đầu ra bằng cách trình bày khung hình ở các khoảng thời gian bằng nhau theo thời gian thực.

MediaPipe xử lý trường hợp sử dụng này bằng cách ánh xạ dấu thời gian vớ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 hàm 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 ra kết quả 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 như chính xác nhất có thể.
  2. Đầu ra được tạo với độ trễ nhỏ nhất có thể.

CalculatorGraph bị trễ so với thông tin đầu vào

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

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