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:
- Beberapa kalkulator dalam grafik tidak dapat mengimbangi kedatangan paket dari aliran input realtime seperti kamera video.
- 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:
- Waktu antara output sesuai dengan waktu antara stempel waktu sesecara mungkin.
- 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