Pemecahan masalah

Jalur biner Python tidak ada

Pesan error:

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

biasanya menunjukkan bahwa Bazel gagal menemukan biner Python lokal. Untuk mengatasi masalah ini, temukan terlebih dahulu lokasi biner python, lalu tambahkan --action_env PYTHON_BIN_PATH=<path to python binary> ke perintah Bazel. Misalnya, Anda dapat beralih untuk menggunakan biner python3 default sistem dengan perintah berikut:

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

Paket Python yang diperlukan tidak ada

Pesan error:

ImportError: No module named numpy
Is numpy installed?

biasanya menunjukkan bahwa paket Python tertentu tidak diinstal. Jalankan pip install atau pip3 install, bergantung pada versi biner Python Anda untuk menginstal paket tersebut.

Gagal mengambil repositori dependensi jarak jauh

Pesan error:

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)

biasanya menunjukkan bahwa Bazel gagal mendownload repositori dependensi yang diperlukan yang diperlukan MediaPipe. MediaPipe memiliki beberapa repositori dependensi yang dihosting oleh situs Google. Di beberapa region, Anda mungkin perlu menyiapkan proxy jaringan atau menggunakan VPN untuk mengakses resource tersebut. Anda mungkin juga perlu menambahkan --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>" ke perintah Bazel. Lihat masalah GitHub ini untuk mengetahui detail selengkapnya.

Jika Anda yakin bahwa masalahnya bukan masalah jaringan, kemungkinan lainnya adalah beberapa resource mungkin tidak tersedia untuk sementara, jalankan bazel clean --expunge dan coba lagi nanti. Jika masih tidak berfungsi, ajukan masalah GitHub dengan pesan error mendetail.

Konfigurasi OpenCV MediaPipe salah

Pesan error:

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

biasanya menunjukkan bahwa OpenCV tidak dikonfigurasi dengan benar untuk MediaPipe. Harap lihat bagian "Menginstal OpenCV dan FFmpeg" di Penginstalan untuk melihat cara mengubah WORKSPACE MediaPipe dan file linux_opencv/macos_opencv/windows_opencv.BUILD untuk library opencv lokal Anda. Masalah GitHub ini juga dapat membantu.

Kegagalan penginstalan pip Python

Pesan error:

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

setelah menjalankan pip install mediapipe biasanya menunjukkan bahwa tidak ada MediaPipe Python yang memenuhi syarat untuk sistem Anda. Perhatikan bahwa MediaPipe Python PyPI secara resmi mendukung Python versi 64-bit 3.7 hingga 3.10 di OS berikut:

  • Linux x86_64
  • x86_64 macOS 10.15+
  • Windows amd64

Jika OS saat ini didukung dan Anda masih melihat error ini, pastikan biner Python dan pip untuk Python 3.7 hingga 3.10. Jika tidak, pertimbangkan untuk mem-build paket MediaPipe Python secara lokal dengan mengikuti petunjuk di sini.

Kegagalan pemuatan DLL Python di Windows

Pesan error:

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

biasanya menunjukkan bahwa sistem Windows lokal tidak memiliki paket Visual C++ yang dapat didistribusikan ulang dan/atau DLL runtime Visual C++. Hal ini dapat diatasi dengan menginstal vc_redist.x64.exe resmi atau menginstal paket Python "msvc-runtime" dengan menjalankan

$ python -m pip install msvc-runtime

Perlu diketahui bahwa paket Python "msvc-runtime" tidak dirilis atau dikelola oleh Microsoft.

Metode native tidak ditemukan

Pesan error:

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

biasanya menunjukkan bahwa library native yang diperlukan, seperti /libwickjni.so belum dimuat atau belum disertakan dalam dependensi aplikasi atau tidak dapat ditemukan karena alasan tertentu. Perhatikan bahwa Java mewajibkan setiap library native untuk dimuat secara eksplisit menggunakan fungsi System.loadLibrary.

Tidak ditemukan kalkulator terdaftar

Pesan error:

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

biasanya menunjukkan bahwa OurNewCalculator direferensikan berdasarkan nama dalam CalculatorGraphConfig, tetapi target library untuk OurNewCalculator belum ditautkan ke biner aplikasi. Saat kalkulator baru ditambahkan ke grafik kalkulator, kalkulator tersebut juga harus ditambahkan sebagai dependensi build aplikasi yang menggunakan grafik kalkulator.

Error ini tertangkap saat runtime karena grafik kalkulator mereferensikan kalkulatornya berdasarkan nama melalui kolom CalculatorGraphConfig::Node:calculator. Saat library untuk kalkulator ditautkan ke biner aplikasi, kalkulator akan otomatis didaftarkan berdasarkan nama melalui makro REGISTER_CALCULATOR menggunakan library registration.h. Perhatikan bahwa REGISTER_CALCULATOR dapat mendaftarkan kalkulator dengan awalan namespace, yang identik dengan namespace C++-nya. Dalam hal ini, grafik kalkulator juga harus menggunakan awalan namespace yang sama.

Error Kehabisan Memori

Memori yang habis dapat menjadi gejala terlalu banyak paket yang terakumulasi di dalam grafik MediaPipe yang sedang berjalan. Hal ini dapat terjadi karena sejumlah alasan, seperti:

  1. Beberapa kalkulator dalam grafik tidak dapat mengimbangi kedatangan paket dari aliran input realtime seperti kamera video.
  2. Beberapa kalkulator menunggu paket yang tidak akan pernah tiba.

Untuk masalah (1), Anda mungkin perlu menghapus beberapa paket lama di paket lama untuk memproses paket yang lebih baru. Untuk beberapa petunjuk, lihat: How to process realtime input streams.

Untuk masalah (2), mungkin satu aliran input tidak memiliki paket karena beberapa alasan. Perangkat atau kalkulator mungkin salah dikonfigurasi atau hanya menghasilkan paket secara sporadis. Hal ini dapat menyebabkan kalkulator downstream menunggu banyak paket yang tidak akan pernah tiba, yang pada akhirnya menyebabkan paket menumpuk di beberapa aliran inputnya. MediaPipe mengatasi masalah semacam ini menggunakan "batas stempel waktu". Untuk beberapa petunjuk, lihat: How to process realtime input streams.

Setelan MediaPipe CalculatorGraphConfig::max_queue_size membatasi jumlah paket yang diantrekan di stream input apa pun dengan membatasi input ke grafik. Untuk streaming input real-time, jumlah paket yang diantrekan di streaming input hampir selalu nol atau satu. Jika tidak, Anda mungkin melihat pesan peringatan berikut:

Resolved a deadlock by increasing max_queue_size of input stream

Selain itu, setelan CalculatorGraphConfig::report_deadlock dapat ditetapkan untuk menyebabkan eksekusi grafik gagal dan menampilkan deadlock sebagai error, sehingga max_queue_size bertindak sebagai batas penggunaan memori.

Grafik berhenti berfungsi

Banyak aplikasi akan memanggil CalculatorGraph::CloseAllPacketSources dan CalculatorGraph::WaitUntilDone untuk menyelesaikan atau menangguhkan eksekusi grafik MediaPipe. Tujuannya di sini adalah untuk mengizinkan kalkulator atau paket yang tertunda untuk menyelesaikan pemrosesan, lalu menonaktifkan grafik. Jika semuanya berjalan lancar, setiap aliran dalam grafik akan mencapai Timestamp::Done, dan setiap kalkulator akan mencapai CalculatorBase::Close, lalu CalculatorGraph::WaitUntilDone akan berhasil diselesaikan.

Jika beberapa kalkulator atau streaming tidak dapat mencapai status Timestamp::Done atau CalculatorBase::Close, metode CalculatorGraph::Cancel dapat dipanggil untuk menghentikan operasi grafik tanpa menunggu semua kalkulator dan paket yang tertunda selesai.

Pengaturan waktu output tidak merata

Beberapa grafik MediaPipe real-time menghasilkan serangkaian frame video untuk dilihat sebagai efek video atau sebagai diagnostik video. Terkadang, grafik MediaPipe akan menghasilkan frame ini dalam cluster, misalnya saat beberapa frame output diekstrapolasi dari cluster frame input yang sama. Jika output ditampilkan seperti yang dihasilkan, beberapa frame output akan segera diganti dengan frame berikutnya dalam cluster yang sama, sehingga hasil sulit dilihat dan dievaluasi secara visual. Dalam kasus seperti ini, visualisasi output dapat ditingkatkan dengan mempresentasikan frame pada interval yang sama secara real time.

MediaPipe menangani kasus penggunaan ini dengan memetakan stempel waktu ke titik secara real time. Setiap stempel waktu menunjukkan waktu dalam mikrodetik, dan kalkulator seperti LiveClockSyncCalculator dapat menunda output paket agar cocok dengan stempel waktunya. Kalkulator semacam ini menyesuaikan waktu output sehingga:

  1. Waktu antara output sesuai dengan waktu antara stempel waktu sesecara mungkin.
  2. Output dihasilkan dengan penundaan sekecil mungkin.

CalculatorGraph tertinggal dari input

Untuk banyak grafik MediaPipe realtime, latensi rendah adalah tujuan. MediaPipe mendukung pemrosesan paralel bergaya "pipeline" untuk memulai pemrosesan setiap paket sedini mungkin. Biasanya, latensi terendah adalah total waktu yang diperlukan oleh setiap kalkulator di sepanjang "jalur kritis" dari kalkulator berurutan. Latensi grafik MediaPipe dapat lebih buruk dari yang ideal karena penundaan yang diperkenalkan untuk menampilkan frame dengan interval yang merata seperti yang dijelaskan dalam Pengaturan waktu output tidak merata.

Jika beberapa kalkulator dalam grafik tidak dapat mengimbangi streaming input real-time, latensi akan terus meningkat, dan Anda perlu menghapus beberapa paket input. Teknik yang direkomendasikan adalah menggunakan kalkulator MediaPipe yang dirancang khusus untuk tujuan ini seperti FlowLimiterCalculator seperti yang dijelaskan dalam How to process realtime input streams.

Memantau input kalkulator dan penyelesaian stempel waktu

Men-debug kalkulator MediaPipe sering kali memerlukan pemahaman mendalam tentang alur data dan sinkronisasi stempel waktu. Paket masuk ke kalkulator pertama kali di-buffer dalam antrean input per aliran untuk disinkronkan oleh InputStreamHandler yang ditetapkan. Tugas InputStreamHandler adalah menentukan paket input yang ditetapkan untuk stempel waktu yang telah disetujui, yang menempatkan kalkulator ke dalam status "siap", diikuti dengan memicu panggilan Calculator::Process dengan paket yang ditentukan sebagai input.

DebugInputStreamHandler dapat digunakan untuk melacak paket masuk dan penyelesaian stempel waktu secara real time dalam output LOG(INFO) aplikasi. Fungsi ini dapat ditetapkan ke kalkulator tertentu melalui input_stream_handler Kalkulator atau grafik secara global melalui kolom input_stream_handler CalculatorGraphConfig.

Selama eksekusi grafik, paket yang masuk akan menghasilkan pesan LOG yang mengungkapkan stempel waktu dan jenis paket, diikuti dengan status saat ini dari semua antrean input:

[INFO] SomeCalculator: Adding packet (ts:2, type:int) to stream INPUT_B:0:input_b
[INFO] SomeCalculator: INPUT_A:0:input_a num_packets: 0 min_ts: 2
[INFO] SomeCalculator: INPUT_B:0:input_b num_packets: 1 min_ts: 2

Selain itu, hal ini memungkinkan pemantauan peristiwa penyelesaian stempel waktu (jika DefaultInputStreamHandler diterapkan). Hal ini dapat membantu mengungkapkan peningkatan batas stempel waktu yang tidak terduga pada aliran input yang menghasilkan panggilan Calculator::Process dengan kumpulan input yang tidak lengkap sehingga menghasilkan paket kosong pada aliran input (yang mungkin diperlukan).

Contoh skenario:

node {
  calculator: "SomeCalculator"
  input_stream: "INPUT_A:a"
  input_stream: "INPUT_B:b"
  ...
}

Diberikan kalkulator dengan dua input, menerima paket masuk dengan stempel waktu 1 di aliran A, diikuti dengan paket input dengan stempel waktu 2 di aliran B. Batas stempel waktu meningkat menjadi 2 di streaming B dengan paket input yang tertunda di streaming A pada stempel waktu 1 memicu panggilan Calculator::Process dengan kumpulan input yang tidak lengkap untuk stempel waktu 1. Dalam hal ini, DefaultInputStreamHandler menghasilkan output:

[INFO] SomeCalculator: Filled input set at ts: 1 with MISSING packets in input streams: INPUT_B:0:input_b.

VLOG adalah teman Anda

MediaPipe menggunakan VLOG di banyak tempat untuk mencatat peristiwa penting untuk tujuan proses debug, tanpa memengaruhi performa jika logging tidak diaktifkan.

Lihat selengkapnya tentang VLOG di abseil VLOG

Perhatikan bahwa VLOG dapat berisi spam jika Anda mengaktifkannya secara global, misalnya (menggunakan flag --v). Flag --vmodule solusi yang memungkinkan tingkat yang berbeda ditetapkan untuk file sumber yang berbeda.

Jika --v / --vmodule tidak dapat digunakan (misalnya, menjalankan aplikasi Android), MediaPipe memungkinkan penggantian flag VLOG --v / --vmodule untuk tujuan proses debug yang diterapkan saat CalculatorGraph dibuat.

Penggantian:

  • MEDIAPIPE_VLOG_V: menentukan dan memberikan nilai yang Anda berikan untuk --v
  • MEDIAPIPE_VLOG_VMODULE: menentukan dan memberikan nilai yang Anda berikan untuk --vmodule

Anda dapat menetapkan penggantian dengan menambahkan: --copt=-DMEDIAPIPE_VLOG_VMODULE=\"*calculator*=5\"

dengan pola modul dan level VLOG yang diinginkan (lihat detail selengkapnya untuk --vmodule di abseil VLOG) ke perintah build Anda.

PENTING: perhatikan bahwa menambahkan hal di atas ke perintah build akan memicu pembuatan ulang seluruh biner termasuk dependensi. Jadi, mengingat penggantian VLOG hanya ada untuk tujuan proses debug, akan lebih cepat jika Anda hanya mengubah vlog_overrides.cc dengan menambahkan MEDIAPIPE_VLOG_V/VMODULE di bagian paling atas.

Flag yang tidak didukung selama build

Jika menggunakan Clang 18 atau yang lebih lama, Anda mungkin harus menonaktifkan beberapa pengoptimalan compiler di backend CPU kami.

Untuk menonaktifkan dukungan untuk avxvnniint8, tambahkan kode berikut ke .bazelrc:

build --define=xnn_enable_avxvnniint8=false