การแก้ปัญหา

ไม่มีเส้นทางไบนารีของ 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. เครื่องคิดเลขบางอย่างในกราฟจะไม่สามารถก้าวทันการมาถึงของแพ็กเก็ตจากสตรีมอินพุตแบบเรียลไทม์ เช่น กล้องวิดีโอ
  2. เครื่องคำนวณบางเครื่องกำลังรอรับแพ็กเก็ตที่เดินทางมาไม่ถึง

สำหรับปัญหา (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 อาจหน่วงเวลาเอาต์พุตของแพ็กเก็ตให้ตรงกับการประทับเวลาได้ เครื่องคำนวณประเภทนี้จะปรับเวลาของผลลัพธ์ ดังนี้

  1. เวลาระหว่างเอาต์พุตจะสอดคล้องกับเวลาระหว่างการประทับเวลาที่ใกล้เคียงที่สุด
  2. เอาต์พุตจะผลิตโดยมีความล่าช้าน้อยที่สุดที่เป็นไปได้

เครื่องคิดเลขกราฟที่ล่าช้าหลังอินพุต

สำหรับกราฟ MediaPipe แบบเรียลไทม์จำนวนมาก เวลาในการตอบสนองต่ำถือเป็นวัตถุประสงค์ MediaPipe รองรับการประมวลผลแบบขนานของสไตล์ "ไปป์" เพื่อเริ่มประมวลผลแต่ละแพ็กเก็ตโดยเร็วที่สุด โดยปกติเวลาในการตอบสนองที่ต่ำที่สุดคือเวลารวมที่เครื่องคำนวณแต่ละเครื่องต้องใช้กับ "เส้นทางวิกฤติ" ของเครื่องคำนวณต่อเนื่อง เวลาในการตอบสนองของกราฟ MediaPipe อาจแย่กว่าที่ควรจะเป็นเนื่องจากความล่าช้าที่เกิดขึ้นในการแสดงเฟรมเป็นช่วงระยะเวลาที่เท่ากันตามที่อธิบายไว้ในเวลาเอาต์พุตไม่เท่ากัน

หากเครื่องคำนวณบางรายการในกราฟแสดงผลสตรีมอินพุตแบบเรียลไทม์ไม่ได้ เวลาในการตอบสนองก็จะเพิ่มขึ้นอย่างต่อเนื่อง จึงจำเป็นต้องทิ้งแพ็กเก็ตอินพุตบางส่วน เทคนิคที่แนะนำคือการใช้เครื่องคำนวณ MediaPipe ที่ออกแบบมาเพื่อวัตถุประสงค์นี้โดยเฉพาะ เช่น FlowLimiterCalculator ตามที่อธิบายไว้ใน How to process realtime input streams