সমস্যা সমাধান

পাইথন বাইনারি পথ অনুপস্থিত

ত্রুটি বার্তা:

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 স্থানীয় পাইথন বাইনারি খুঁজে পেতে ব্যর্থ হয়। এই সমস্যাটি সমাধান করার জন্য, অনুগ্রহ করে প্রথমে পাইথন বাইনারি কোথায় আছে তা খুঁজে বের করুন এবং তারপর 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

প্রয়োজনীয় পাইথন প্যাকেজ অনুপস্থিত

ত্রুটি বার্তা:

ImportError: No module named numpy
Is numpy installed?

সাধারণত নির্দিষ্ট 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 প্রয়োজনীয় নির্ভরতা সংগ্রহস্থল ডাউনলোড করতে ব্যর্থ হয় যা MediaPipe এর প্রয়োজন। MedaiPipe-এর বেশ কয়েকটি নির্ভরতা সংগ্রহস্থল রয়েছে যা Google সাইট দ্বারা হোস্ট করা হয়। কিছু অঞ্চলে, সেই সংস্থানগুলি অ্যাক্সেস করতে আপনাকে একটি নেটওয়ার্ক প্রক্সি সেট আপ করতে বা একটি VPN ব্যবহার করতে হতে পারে৷ আপনাকে 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 মিডিয়াপাইপের জন্য সঠিকভাবে কনফিগার করা হয়নি। আপনার স্থানীয় opencv লাইব্রেরির জন্য MediaPipe-এর WORKSPACE এবং linux_opencv/macos_opencv/windows_opencv.BUILD ফাইলগুলি কীভাবে সংশোধন করতে হয় তা দেখতে অনুগ্রহ করে ইনস্টলেশনে "OpenCV এবং FFmpeg ইনস্টল করুন" বিভাগগুলি দেখুন। এই GitHub সমস্যাটিও সাহায্য করতে পারে।

পাইথন পিপ ইনস্টল ব্যর্থতা

ত্রুটি বার্তা:

ERROR: Could not find a version that satisfies the requirement mediapipe
ERROR: No matching distribution found for mediapipe

pip install mediapipe সাধারণত নির্দেশ করে যে আপনার সিস্টেমের জন্য কোন যোগ্য মিডিয়াপাইপ পাইথন নেই। দয়া করে মনে রাখবেন যে MediaPipe Python PyPI আনুষ্ঠানিকভাবে নিম্নলিখিত OS-এ Python 3.7 থেকে 3.10-এর 64-বিট সংস্করণ সমর্থন করে:

  • x86_64 লিনাক্স
  • x86_64 macOS 10.15+
  • amd64 উইন্ডোজ

যদি ওএস বর্তমানে সমর্থিত হয় এবং আপনি এখনও এই ত্রুটিটি দেখতে পান, দয়া করে নিশ্চিত করুন যে পাইথন এবং পিপ বাইনারি উভয়ই পাইথন 3.7 থেকে 3.10 এর জন্য। অন্যথায়, এখানে নির্দেশাবলী অনুসরণ করে স্থানীয়ভাবে MediaPipe Python প্যাকেজ তৈরি করার কথা বিবেচনা করুন।

উইন্ডোজে পাইথন ডিএলএল লোড ব্যর্থতা

ত্রুটি বার্তা:

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

সাধারণত নির্দেশ করে যে স্থানীয় উইন্ডোজ সিস্টেমে ভিজ্যুয়াল C++ পুনরায় বিতরণযোগ্য প্যাকেজ এবং/অথবা ভিজ্যুয়াল C++ রানটাইম DLL অনুপস্থিত। এটি অফিসিয়াল vc_redist.x64.exe ইনস্টল করে বা "msvc-রানটাইম" পাইথন প্যাকেজ চালু করে ইনস্টল করে সমাধান করা যেতে পারে

$ python -m pip install msvc-runtime

অনুগ্রহ করে মনে রাখবেন যে "msvc-রানটাইম" পাইথন প্যাকেজটি 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 ফিল্ডের মাধ্যমে তাদের ক্যালকুলেটরগুলিকে নাম দিয়ে উল্লেখ করে। যখন একটি ক্যালকুলেটরের জন্য লাইব্রেরি একটি অ্যাপ্লিকেশন বাইনারিতে লিঙ্ক করা হয়, তখন ক্যালকুলেটর স্বয়ংক্রিয়ভাবে registration.h লাইব্রেরি ব্যবহার করে REGISTER_CALCULATOR ম্যাক্রোর মাধ্যমে নাম দ্বারা নিবন্ধিত হয়৷ মনে রাখবেন যে 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 একটি মিডিয়াপাইপ গ্রাফের সম্পাদন শেষ বা স্থগিত করতে কল করবে। এখানে উদ্দেশ্য হল যে কোনও মুলতুবি থাকা ক্যালকুলেটর বা প্যাকেটগুলিকে প্রক্রিয়াকরণ সম্পূর্ণ করার অনুমতি দেওয়া এবং তারপরে গ্রাফটি বন্ধ করা। সবকিছু ঠিকঠাক থাকলে, গ্রাফের প্রতিটি স্ট্রীম Timestamp::Done , এবং প্রতিটি ক্যালকুলেটর CalculatorBase::Close পৌঁছাবে এবং তারপর CalculatorGraph::WaitUntilDone সফলভাবে সম্পন্ন হবে।

যদি কিছু ক্যালকুলেটর বা স্ট্রীম Timestamp::Done বা CalculatorBase::Close স্টেটে পৌঁছাতে না পারে, তবে সমস্ত মুলতুবি থাকা ক্যালকুলেটর এবং প্যাকেট সম্পূর্ণ হওয়ার জন্য অপেক্ষা না করে গ্রাফ রানটি বন্ধ করতে CalculatorGraph::Cancel পদ্ধতিটি বলা যেতে পারে।

আউটপুট সময় অসম

কিছু রিয়েলটাইম মিডিয়াপাইপ গ্রাফ ভিডিও ইফেক্ট বা ভিডিও ডায়াগনস্টিক হিসাবে দেখার জন্য ভিডিও ফ্রেমগুলির একটি সিরিজ তৈরি করে। কখনও কখনও, একটি MediaPipe গ্রাফ এই ফ্রেমগুলিকে ক্লাস্টারে তৈরি করে, উদাহরণস্বরূপ যখন ইনপুট ফ্রেমের একই ক্লাস্টার থেকে একাধিক আউটপুট ফ্রেম এক্সট্রাপোলেট করা হয়। যদি আউটপুটগুলি উত্পাদিত হওয়ার সাথে সাথে উপস্থাপন করা হয়, কিছু আউটপুট ফ্রেম অবিলম্বে একই ক্লাস্টারে পরবর্তী ফ্রেমের দ্বারা প্রতিস্থাপিত হয়, যা ফলাফলগুলি দেখতে এবং মূল্যায়ন করা কঠিন করে তোলে। এই ধরনের ক্ষেত্রে, রিয়েল টাইমে এমনকি বিরতিতে ফ্রেমগুলি উপস্থাপন করে আউটপুট ভিজ্যুয়ালাইজেশন উন্নত করা যেতে পারে।

MediaPipe রিয়েল টাইমে পয়েন্টে টাইমস্ট্যাম্প ম্যাপ করে এই ব্যবহারের ক্ষেত্রে সমাধান করে। প্রতিটি টাইমস্ট্যাম্প মাইক্রোসেকেন্ডে একটি সময় নির্দেশ করে এবং একটি ক্যালকুলেটর যেমন LiveClockSyncCalculator তাদের টাইমস্ট্যাম্পের সাথে মিলিত হতে প্যাকেটের আউটপুট বিলম্বিত করতে পারে। এই ধরণের ক্যালকুলেটর আউটপুটগুলির সময় সামঞ্জস্য করে যেমন:

  1. আউটপুটগুলির মধ্যে সময় যতটা সম্ভব ঘনিষ্ঠভাবে টাইমস্ট্যাম্পগুলির মধ্যে সময়ের সাথে মিলে যায়।
  2. আউটপুট সম্ভব ক্ষুদ্রতম বিলম্ব সঙ্গে উত্পাদিত হয়.

ক্যালকুলেটর গ্রাফ ইনপুট থেকে পিছিয়ে আছে

অনেক রিয়েলটাইম মিডিয়াপাইপ গ্রাফের জন্য, কম লেটেন্সি একটি উদ্দেশ্য। MediaPipe যত তাড়াতাড়ি সম্ভব প্রতিটি প্যাকেটের প্রক্রিয়াকরণ শুরু করার জন্য "পাইপলাইন" শৈলী সমান্তরাল প্রক্রিয়াকরণ সমর্থন করে। সাধারনত সর্বনিম্ন সম্ভাব্য লেটেন্সি হল ক্রমাগত ক্যালকুলেটরগুলির একটি "গুরুত্বপূর্ণ পথ" বরাবর প্রতিটি ক্যালকুলেটরের জন্য প্রয়োজনীয় মোট সময়। একটি MediaPipe গ্রাফের লেটেন্সি আদর্শের চেয়ে খারাপ হতে পারে কারণ আউটপুট টাইমিং -এ বর্ণিত একটি সমান ব্যবধানে ফ্রেমগুলি প্রদর্শন করতে বিলম্বের কারণে।

যদি গ্রাফের কিছু ক্যালকুলেটর রিয়েলটাইম ইনপুট স্ট্রীমগুলির সাথে তাল মিলিয়ে চলতে না পারে, তাহলে লেটেন্সি বাড়তে থাকবে এবং কিছু ইনপুট প্যাকেট ড্রপ করার প্রয়োজন হবে৷ প্রস্তাবিত কৌশলটি হল এই উদ্দেশ্যে বিশেষভাবে ডিজাইন করা MediaPipe ক্যালকুলেটরগুলি ব্যবহার করা যেমন FlowLimiterCalculator যেমন How to process realtime input streams তাতে বর্ণিত।