การแก้ปัญหา

ไม่มีเส้นทางไบนารีของ 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 และ ไฟล์ 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 PyPI รองรับเวอร์ชัน 64 บิตอย่างเป็นทางการ ของ Python 3.7 ถึง 3.10 ในระบบปฏิบัติการต่อไปนี้

  • x86_64 Linux
  • x86_64 macOS 10.15 ขึ้นไป
  • Windows สำหรับ amd64

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

โหลด Python DLL ไม่สำเร็จใน Windows

ข้อความแสดงข้อผิดพลาด:

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

มักจะแสดงว่าระบบ Windows ในเครื่องไม่มี Visual C++ แพ็กเกจที่กระจายซ้ำได้และ/หรือ DLL รันไทม์ของ Visual C++ ปัญหานี้สามารถแก้ไขได้โดย การติดตั้ง vc_redist.x64.exe หรือติดตั้ง "msvc-runtime" แพ็กเกจ Python โดยการเรียกใช้

$ python -m pip install msvc-runtime

โปรดทราบว่า "msvc-runtime" ไม่ได้เปิดหรือบำรุงรักษาแพ็กเกจ Python Microsoft

ไม่พบเมธอดเนทีฟ

ข้อความแสดงข้อผิดพลาด:

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) อาจเป็นไปได้ว่าสตรีมอินพุต 1 รายการขาดแพ็กเก็ตสำหรับบางรายการ เหตุผล อุปกรณ์หรือเครื่องคิดเลขอาจมีการกำหนดค่าที่ไม่ถูกต้องหรืออาจสร้างแพ็กเก็ต เป็นครั้งคราวเท่านั้น ซึ่งอาจทำให้เครื่องคำนวณดาวน์สตรีมต้องรอ แพ็กเก็ตที่จะไม่มาถึง ซึ่งส่งผลให้แพ็กเก็ตเกิดการสะสม สตรีมอินพุตบางรายการของพวกเขา MediaPipe จัดการกับปัญหาประเภทนี้โดยใช้ "การประทับเวลา bounds" โปรดดูคำแนะนำต่อไปนี้ 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 นี้โดยการแมปการประทับเวลากับ Point แบบเรียลไทม์ การประทับเวลาแต่ละรายการจะระบุเวลาเป็นไมโครวินาทีและเครื่องคิดเลข เช่น LiveClockSyncCalculator สามารถหน่วงเวลาเอาต์พุตของแพ็กเก็ตในการจับคู่ ของคุณ เครื่องคิดเลขประเภทนี้จะปรับเวลาของเอาต์พุต ดังนี้

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

CalculatorGraph ช้ากว่าอินพุต

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

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