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

المسار الثنائي في بايثون غير متوفّر

رسالة الخطأ:

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 بناءً على إصدار Python الثنائي لتثبيت هذه الحزم.

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

رسالة الخطأ:

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 فشل في تنزيل مستودعات التبعية الضرورية التي تحتاجها 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" في قسم التثبيت لمعرفة كيفية تعديل ملفات 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
  • macOS 10.15 والإصدارات الأحدث من نظام التشغيل x86_64
  • amd64 Windows

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

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

رسالة الخطأ:

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

إلى أن نظام Windows المحلي يفتقد إلى حزم Visual C++ القابلة لإعادة التوزيع و/أو مكتبات الربط الديناميكي الخاصة بوقت تشغيل Visual C++. يمكن حل هذه المشكلة إما من خلال تثبيت vc_redist.x64.exe الرسمي أو تثبيت حزمة Python "msvc-runtime" من خلال تشغيل

$ python -m pip install msvc-runtime

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

يتم اكتشاف هذا الخطأ في وقت التشغيل لأن الرسوم البيانية للآلة الحاسبة تشير إلى الحاسبات الخاصة بها حسب الاسم من خلال الحقل 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.