تحديد المشاكل وحلّها

مسار بايثون الثنائي مفقود

رسالة الخطأ:

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 في العثور على البرنامج الثنائي المحلي لـ بايثون. لحل المشكلة هذه المشكلة، ويُرجى أولاً البحث عن مكان ثنائي بايثون ثم إضافة --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

هناك حزم بايثون ضرورية غير موجودة

رسالة الخطأ:

ImportError: No module named numpy
Is numpy installed?

يشير عادةً إلى عدم تثبيت حزم بايثون. يُرجى التنفيذ pip install أو pip3 install اعتمادًا على إصدار بايثون الثنائي بتثبيت هذه الحزم.

تعذَّر استرجاع مستودعات التبعية عن بُعد.

رسالة الخطأ:

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)

يشير عادةً إلى تعذُّر تنزيل مستودعات التبعية اللازمة التي يحتاجها MediaPipe. تحتوي MedaiPipe على العديد من مستودعات التبعية التي التي تستضيفها مواقع 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" الأقسام في التثبيت للاطلاع على كيفية تعديل مساحة العمل الخاصة بـ MediaPipe ملفات linux_opencv/macos_opencv/Windows_opencv.BUILD لـ opencv المحلي المكتبات. مشكلة GitHub هذه قد يكون مفيدًا أيضًا.

تعذّر تثبيت 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 بت. الإصدارات من 3.7 إلى 3.10 على نظام التشغيل التالي:

  • x86_64 Linux
  • الإصدار x86_64 من نظام التشغيل macOS 10.15 أو الإصدارات الأحدث
  • amd64 لنظام التشغيل Windows

إذا كان نظام التشغيل متوافقًا حاليًا مع استمرار ظهور هذا الخطأ، يُرجى التأكد من أن كلا البرنامجين بايثون وpip يُستخدمان بلغة بايثون 3.7 إلى 3.10. وإلا، يُرجى مراعاة إنشاء حزمة MediaPipe Python محليًا من خلال اتباع التعليمات هنا.

تعذَّر تحميل مكتبة الربط الديناميكي في Python على نظام التشغيل Windows

رسالة الخطأ:

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

يشير عادةً إلى أن نظام Windows المحلي يفتقد إلى Visual C++ الحزم القابلة لإعادة التوزيع و/أو مكتبات الربط الديناميكي لوقت تشغيل 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 تم تحميلها أو لم يتم تضمينها في ملحقات التطبيق أو لا يمكن تم العثور عليها لسبب ما. لاحظ أن Java تتطلب أن تكون كل مكتبة أصلية تم تحميله بشكل صريح باستخدام الدالة System.loadLibrary.

لم يتم العثور على آلة حاسبة مسجَّلة

رسالة الخطأ:

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

عادةً ما يشير إلى أن OurNewCalculator تتم الإشارة إليه بالاسم في CalculatorGraphConfig ولكن يحتوي هدف المكتبة لـ OurNewCalculator على لم يتم ربطها بالتطبيق الثنائي. عند إضافة حاسبة جديدة إلى للحاسبة البيانية، يجب أيضًا إضافة هذه الحاسبة كتبعية إصدار التطبيقات باستخدام الرسم البياني للآلة الحاسبة.

يظهر هذا الخطأ في وقت التشغيل لأنّ الرسوم البيانية للآلة الحاسبة تشير إلى آلات حاسبة حسب الاسم من خلال الحقل 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 من عدد حزم البيانات المُدرَجة في قائمة الانتظار في أي بث إدخال من خلال تقييد الإدخالات الرسم البياني. بالنسبة إلى مجموعات بث الإدخال في الوقت الفعلي، عدد الحزم في قائمة انتظار الإدخال يجب أن تكون قيمة مجموعة البث دائمًا صفرًا أو واحدًا وإذا لم يكن الأمر كذلك، فقد يظهر لك رسالة التحذير التالية:

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 حالة الاستخدام هذه من خلال ربط الطوابع الزمنية بالنقاط في الوقت الفعلي. يشير كل طابع زمني إلى الوقت بالميكرو ثانية، ويمكنك استخدام آلة حاسبة مثل يمكن لـ "LiveClockSyncCalculator" تأخير إخراج حزم البيانات لمطابقتها. الطوابع الزمنية. تقوم هذه الحاسبة بضبط توقيت المخرجات على النحو التالي:

  1. يتوافق الوقت بين الإخراج مع الوقت بين الطوابع الزمنية قدر الإمكان.
  2. ويتم إنتاج النتائج بأقل مهلة ممكنة.

يتأخر الرسم البياني للآلة الحاسبة عن الإدخالات

بالنسبة إلى العديد من الرسوم البيانية MediaPipe في الوقت الفعلي، يعد وقت الاستجابة البطيء هدفًا. MediaPipe يدعم "المسارات" بالمعالجة المتوازية للنمط لبدء معالجة لكل حزمة في أقرب وقت ممكن. عادةً ما يكون أقل وقت استجابة ممكن الوقت الإجمالي الذي تحتاجه كل حاسبة على طول "مسار حرج" من المتتالية آلات حاسبة. قد يكون وقت استجابة الرسم البياني لـ MediaPipe أسوأ من المثالي بسبب التأخيرات التي تطرأ على عرض الإطارات، فاصل زمني زوجي كما هو موضح في توقيت الإخراج غير متساوي.

إذا تعذر على بعض الحاسبات الموجودة في الرسم البياني مواكبة الإدخال في الوقت الفعلي مجموعات البث، سيستمر وقت الاستجابة في الزيادة، ومن الضروري وإسقاط بعض حزم الإدخال. والأسلوب الموصى به هو استخدام MediaPipe آلات حاسبة مصممة خصيصًا لهذا الغرض مثل FlowLimiterCalculator كما هو موضّح في How to process realtime input streams