समस्या हल करना

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 बाइनरी कहां है. इसके बाद, Bazel कमांड में --action_env PYTHON_BIN_PATH=<path to python binary> जोड़ें. उदाहरण के लिए, आप नीचे दिए गए निर्देश की मदद से सिस्टम की डिफ़ॉल्ट 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 पैकेज इंस्टॉल नहीं किए गए हैं. अपने Python बाइनरी वर्शन के आधार पर, कृपया उन पैकेज को इंस्टॉल करने के लिए 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)

आम तौर पर, यह बताता है कि Bazel ज़रूरी डिपेंडेंसी डेटा स्टोर करने की जगहों को डाउनलोड नहीं कर पाया. MedaiPipe में कई डिपेंडेंसी डेटा स्टोर हैं, जिन्हें Google साइटें होस्ट करती हैं. कुछ इलाकों में, आपको नेटवर्क प्रॉक्सी सेट अप करना पड़ सकता है या इन संसाधनों को ऐक्सेस करने के लिए वीपीएन का इस्तेमाल करना पड़ सकता है. आपको Bazel कमांड में --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>" जोड़ना भी पड़ सकता है. ज़्यादा जानकारी के लिए, 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 के SPACESPACE और Linux_opencv/macos_opencv/Windows_opencv.BUILD फ़ाइलों में अपनी स्थानीय Opencv लाइब्रेरी में बदलाव करने का तरीका जानें. GitHub की इस समस्या से भी मदद मिल सकती है.

Python पीआईपी (पिक्चर में पिक्चर) इंस्टॉल नहीं किया जा सका

गड़बड़ी का मैसेज:

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 आधिकारिक तौर पर नीचे दिए गए OS पर Python 3.7 से 3.10 के 64-बिट वर्शन के साथ काम करता है:

  • x86_64 लिनक्स
  • x86_64 macOS 10.15+
  • amd64 Windows

अगर इस समय ओएस पर काम करता है और आपको अब भी यह गड़बड़ी दिखती है, तो कृपया पक्का करें कि Python और पीआईपी बाइनरी, दोनों Python 3.7 से 3.10 के लिए इस्तेमाल करें. अगर ऐसा नहीं है, तो कृपया यहां दिए गए निर्देशों का पालन करके, स्थानीय रूप से MediaPipe Python पैकेज बनाएं.

Windows पर Python DLL लोड नहीं हो सका

गड़बड़ी का मैसेज:

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

आम तौर पर यह बताता है कि लोकल Windows सिस्टम में विज़ुअल C++ फिर से डिस्ट्रिब्यूट किए जा सकने वाले पैकेज और/या विज़ुअल C++ रनटाइम डीएलएल मौजूद नहीं हैं. इसे या तो आधिकारिक vc_redist.x64.exe इंस्टॉल करके या "msvc-runtime" Python पैकेज को इंस्टॉल करके हल किया जा सकता है

$ python -m pip install msvc-runtime

कृपया ध्यान दें कि Microsoft, "msvc-runtime" Python पैकेज को रिलीज़ नहीं करता या न ही इसका रखरखाव करता है.

नेटिव मेथड नहीं मिला

गड़बड़ी का मैसेज:

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"

आम तौर पर यह बताता है कि CalculatorGraphConfig में, OurNewCalculator को नाम से रेफ़र किया गया है, लेकिन YourNewCalculator की लाइब्रेरी को टारगेट करने के लिए, उसे ऐप्लिकेशन बाइनरी से लिंक नहीं किया गया है. जब कैलकुलेटर ग्राफ़ में एक नया कैलकुलेटर जोड़ा जाता है, तो उसे कैलकुलेटर ग्राफ़ का इस्तेमाल करके, ऐप्लिकेशन की बिल्ड डिपेंडेंसी के तौर पर भी जोड़ा जाना चाहिए.

यह गड़बड़ी रनटाइम में इसलिए पकड़ी जाती है, क्योंकि कैलकुलेटर ग्राफ़ में 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, मेमोरी के इस्तेमाल की सीमा के तौर पर काम करता है.

ग्राफ़ हैंग हो जाता है

कई ऐप्लिकेशन, MediaPipe ग्राफ़ को पूरा करने या निलंबित करने के लिए, CalculatorGraph::CloseAllPacketSources और CalculatorGraph::WaitUntilDone को कॉल करेंगे. यहां का मकसद, बचे हुए कैलकुलेटर या पैकेट को प्रोसेसिंग पूरी करने की अनुमति देना है. इसके बाद, ग्राफ़ को बंद करना है. अगर सब ठीक रहता है, तो ग्राफ़ में मौजूद हर स्ट्रीम 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 में बताया गया है.