ไม่มีเส้นทางไบนารีของ 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 แล้วเพิ่ม --action_env PYTHON_BIN_PATH=<path to python binary>
ในคำสั่ง Bazel ตัวอย่างเช่น คุณจะเปลี่ยนไปใช้ไบนารี 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 บางรายการ โปรดเรียกใช้ pip install
หรือ pip3 install
โดยขึ้นอยู่กับเวอร์ชันไบนารีของ Python เพื่อติดตั้งแพ็กเกจเหล่านั้น
ดึงข้อมูลที่เก็บ Dependency ระยะไกลไม่สำเร็จ
ข้อความแสดงข้อผิดพลาด:
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 ดาวน์โหลดที่เก็บทรัพยากร Dependency ที่จำเป็นที่ MediaPipe ต้องการไม่ได้ MedaiPipe มีที่เก็บทรัพยากร Dependency หลายรายการที่โฮสต์โดยเว็บไซต์ต่างๆ ของ Google ในบางภูมิภาค คุณอาจต้องตั้งค่าพร็อกซีเครือข่ายหรือใช้ VPN เพื่อเข้าถึงทรัพยากรเหล่านั้น นอกจากนี้ คุณอาจต้องเพิ่ม --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>"
ลงในคำสั่ง Bazel ดูรายละเอียดเพิ่มเติมได้ที่ปัญหาเกี่ยวกับ 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 และ FFmpeg" ในการติดตั้งเพื่อดูวิธีแก้ไข WORKSPACE ของ MediaPipe และ linux_opencv/macos_opencv/windows_opencv.BUILD สำหรับไลบรารี opencv ในเครื่องของคุณ ปัญหาเกี่ยวกับ 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 Python Pyth รองรับเวอร์ชัน 64 บิตของ Python 3.7 ถึง 3.10 อย่างเป็นทางการในระบบปฏิบัติการต่อไปนี้
- X86_64 Linux
- x86_64 macOS 10.15 ขึ้นไป
- หน้าต่าง amd64
หากระบบรองรับระบบปฏิบัติการอยู่ในปัจจุบันแต่คุณยังเห็นข้อผิดพลาดนี้อยู่ โปรดตรวจสอบว่าทั้งไบนารี Python และ PIP มีไว้สำหรับ Python 3.7 ถึง 3.10 มิเช่นนั้น โปรดลองสร้างแพ็กเกจ MediaPipe Python ในเครื่องโดยทำตามวิธีการที่นี่
โหลด DLL ของ Python ไม่สำเร็จใน Windows
ข้อความแสดงข้อผิดพลาด:
ImportError: DLL load failed: The specified module could not be found
ปกติแล้วจะบ่งบอกว่าระบบ Windows ในเครื่องไม่มีแพ็กเกจ Visual C++ ที่แจกจ่ายซ้ำได้และ/หรือ DLL แบบรันไทม์ Visual C++ ซึ่งแก้ไขได้ด้วยการติดตั้ง vc_redist.x64.exe อย่างเป็นทางการ หรือติดตั้งแพ็กเกจ Python "msvc-runtime" โดยการเรียกใช้
$ python -m pip install msvc-runtime
โปรดทราบว่า Microsoft ไม่ได้เผยแพร่หรือบำรุงรักษาแพ็กเกจ Python "msvc-runtime"
ไม่พบเมธอดเนทีฟ
ข้อความแสดงข้อผิดพลาด:
java.lang.UnsatisfiedLinkError: No implementation found for void com.google.wick.Wick.nativeWick
มักระบุว่าไลบรารีแบบเนทีฟที่จำเป็น เช่น /libwickjni.so
ไม่ได้โหลดหรือไม่รวมอยู่ในทรัพยากร Dependency ของแอป หรือหาไม่พบด้วยเหตุผลบางอย่าง โปรดทราบว่า Java กําหนดให้ต้องโหลดไลบรารีแบบเนทีฟทั้งหมดอย่างชัดแจ้งโดยใช้ฟังก์ชัน System.loadLibrary
ไม่พบเครื่องคิดเลขที่ลงทะเบียนไว้
ข้อความแสดงข้อผิดพลาด:
No registered object with name: OurNewCalculator; Unable to find Calculator "OurNewCalculator"
มักจะระบุว่า OurNewCalculator
มีการอ้างอิงตามชื่อใน CalculatorGraphConfig
แต่เป้าหมายไลบรารีสำหรับ OurNewCalculator ยังไม่ได้ลิงก์กับไบนารีของแอปพลิเคชัน เมื่อเพิ่มเครื่องคิดเลขใหม่ลงในกราฟเครื่องคำนวณ จะต้องเพิ่มเครื่องคำนวณดังกล่าวเป็นทรัพยากร Dependency ของบิลด์ของแอปพลิเคชันที่ใช้กราฟเครื่องคิดเลขด้วย
ระบบพบข้อผิดพลาดนี้ขณะรันไทม์เนื่องจากกราฟเครื่องคิดเลขอ้างอิงเครื่องคำนวณตามชื่อผ่านช่อง CalculatorGraphConfig::Node:calculator
เมื่อไลบรารีสำหรับเครื่องคำนวณลิงก์กับไบนารีของแอปพลิเคชัน ระบบจะลงทะเบียนเครื่องคำนวณโดยอัตโนมัติตามชื่อผ่านมาโคร REGISTER_CALCULATOR
โดยใช้ไลบรารี registration.h
โปรดทราบว่า REGISTER_CALCULATOR
ลงทะเบียนเครื่องคิดเลขที่มีคำนำหน้าเนมสเปซได้ ซึ่งเหมือนกับเนมสเปซ C++ ในกรณีนี้ กราฟเครื่องคำนวณต้องใช้คำนำหน้าเนมสเปซเดียวกันด้วย
ข้อผิดพลาดหน่วยความจำเต็ม
หน่วยความจำที่หมดอาจเป็นอาการของแพ็กเก็ตที่สะสมอยู่ภายในกราฟ MediaPipe ที่ทำงานมากเกินไป ปัญหานี้อาจเกิดขึ้นได้จากสาเหตุหลายประการ เช่น
- เครื่องคิดเลขบางอย่างในกราฟจะไม่สามารถก้าวทันการมาถึงของแพ็กเก็ตจากสตรีมอินพุตแบบเรียลไทม์ เช่น กล้องวิดีโอ
- เครื่องคำนวณบางเครื่องกำลังรอรับแพ็กเก็ตที่เดินทางมาไม่ถึง
สำหรับปัญหา (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::CloseAllPacketSources
และ CalculatorGraph::WaitUntilDone
เพื่อสิ้นสุดหรือระงับการเรียกใช้กราฟ MediaPipe วัตถุประสงค์คืออนุญาตให้เครื่องคำนวณหรือแพ็กเก็ตที่รอดำเนินการประมวลผลจนเสร็จ จากนั้นจึงปิดกราฟ หากทุกอย่างเป็นไปด้วยดี ทุกสตรีมในกราฟจะสูงถึง Timestamp::Done
และเครื่องคำนวณทุกรายการก็จะถึง CalculatorBase::Close
และ CalculatorGraph::WaitUntilDone
ก็จะเสร็จสมบูรณ์
หากเครื่องคำนวณหรือสตรีมบางรายการเข้าถึงสถานะ Timestamp::Done
หรือ CalculatorBase::Close
ไม่ได้ ระบบก็สามารถเรียกใช้เมธอด CalculatorGraph::Cancel
เพื่อสิ้นสุดการเรียกใช้กราฟโดยไม่ต้องรอให้เครื่องคำนวณและแพ็กเก็ตที่รอดำเนินการทั้งหมดดำเนินการเสร็จสิ้น
เวลาเอาต์พุตไม่สม่ำเสมอ
กราฟ MediaPipe แบบเรียลไทม์บางกราฟจะสร้างเฟรมวิดีโอเป็นชุดสำหรับดูเป็นเอฟเฟกต์วิดีโอหรือการวินิจฉัยวิดีโอ บางครั้งกราฟ MediaPipe จะสร้างเฟรมเหล่านี้ในคลัสเตอร์ เช่น เมื่อมีการคัดลอกเฟรมเอาต์พุตหลายเฟรมออกมาจากคลัสเตอร์เฟรมอินพุตเดียวกัน หากมีการแสดงผลเอาต์พุตขณะที่กำลังสร้างขึ้น เฟรมเอาต์พุตบางเฟรมจะถูกแทนที่โดยเฟรมภายหลังในคลัสเตอร์เดียวกันทันที ซึ่งทำให้มองเห็นและประเมินผลลัพธ์ได้ยาก ในกรณีเช่นนี้ คุณปรับปรุงการแสดงภาพเอาต์พุตได้ด้วยการนำเสนอเฟรมในช่วงเวลาที่เท่ากันแบบเรียลไทม์
MediaPipe จะจัดการ Use Case นี้โดยการแมปการประทับเวลากับจุดแบบเรียลไทม์
การประทับเวลาแต่ละรายการจะระบุเวลาเป็นไมโครวินาที และเครื่องคำนวณ เช่น LiveClockSyncCalculator
อาจหน่วงเวลาเอาต์พุตของแพ็กเก็ตให้ตรงกับการประทับเวลาได้ เครื่องคำนวณประเภทนี้จะปรับเวลาของผลลัพธ์ ดังนี้
- เวลาระหว่างเอาต์พุตจะสอดคล้องกับเวลาระหว่างการประทับเวลาที่ใกล้เคียงที่สุด
- เอาต์พุตจะผลิตโดยมีความล่าช้าน้อยที่สุดที่เป็นไปได้
เครื่องคิดเลขกราฟที่ล่าช้าหลังอินพุต
สำหรับกราฟ MediaPipe แบบเรียลไทม์จำนวนมาก เวลาในการตอบสนองต่ำถือเป็นวัตถุประสงค์ MediaPipe รองรับการประมวลผลแบบขนานของสไตล์ "ไปป์" เพื่อเริ่มประมวลผลแต่ละแพ็กเก็ตโดยเร็วที่สุด โดยปกติเวลาในการตอบสนองที่ต่ำที่สุดคือเวลารวมที่เครื่องคำนวณแต่ละเครื่องต้องใช้กับ "เส้นทางวิกฤติ" ของเครื่องคำนวณต่อเนื่อง เวลาในการตอบสนองของกราฟ MediaPipe อาจแย่กว่าที่ควรจะเป็นเนื่องจากความล่าช้าที่เกิดขึ้นในการแสดงเฟรมเป็นช่วงระยะเวลาที่เท่ากันตามที่อธิบายไว้ในเวลาเอาต์พุตไม่เท่ากัน
หากเครื่องคำนวณบางรายการในกราฟแสดงผลสตรีมอินพุตแบบเรียลไทม์ไม่ได้ เวลาในการตอบสนองก็จะเพิ่มขึ้นอย่างต่อเนื่อง จึงจำเป็นต้องทิ้งแพ็กเก็ตอินพุตบางส่วน เทคนิคที่แนะนำคือการใช้เครื่องคำนวณ MediaPipe ที่ออกแบบมาเพื่อวัตถุประสงค์นี้โดยเฉพาะ เช่น FlowLimiterCalculator
ตามที่อธิบายไว้ใน How to process realtime input streams