عیب یابی

مسیر باینری پایتون وجود ندارد

پیغام خطا:

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)

معمولاً نشان می دهد که Bazel نمی تواند مخازن وابستگی لازم را که MediaPipe به آن نیاز دارد دانلود کند. MedaiPipe چندین مخزن وابستگی دارد که توسط سایت های گوگل میزبانی می شوند. در برخی از مناطق، ممکن است نیاز به راه اندازی یک پروکسی شبکه یا استفاده از 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 MediaPipe و linux_opencv/macos_opencv/windows_opencv.BUILD را برای کتابخانه‌های opencv محلی خود تغییر دهید. این مشکل GitHub نیز ممکن است کمک کند.

شکست در نصب پیپ پایتون

پیغام خطا:

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

پس از اجرای pip install mediapipe معمولا نشان می دهد که MediaPipe پایتون واجد شرایطی برای سیستم شما وجود ندارد. لطفا توجه داشته باشید که MediaPipe Python PyPI رسما از نسخه 64 بیتی پایتون 3.7 تا 3.10 در سیستم عامل زیر پشتیبانی می کند:

  • x86_64 لینوکس
  • x86_64 macOS 10.15+
  • ویندوز amd64

اگر سیستم عامل در حال حاضر پشتیبانی می شود و همچنان این خطا را مشاهده می کنید، لطفاً مطمئن شوید که پایتون و پیپ باینری برای پایتون 3.7 تا 3.10 هستند. در غیر این صورت، لطفاً با دنبال کردن دستورالعمل‌های اینجا ، بسته MediaPipe Python را به صورت محلی بسازید.

شکست بارگذاری DLL پایتون در ویندوز

پیغام خطا:

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

معمولاً نشان می دهد که سیستم محلی ویندوز فاقد بسته های قابل توزیع مجدد Visual C++ و/یا DLL های زمان اجرا Visual C++ است. این مشکل با نصب vc_redist.x64.exe رسمی یا نصب بسته پایتون "msvc-runtime" با اجرا قابل حل است.

$ python -m pip install msvc-runtime

لطفاً توجه داشته باشید که بسته پایتون "msvc-runtime" توسط مایکروسافت منتشر یا نگهداری نمی شود.

روش بومی یافت نشد

پیغام خطا:

java.lang.UnsatisfiedLinkError: No implementation found for void com.google.wick.Wick.nativeWick

معمولاً نشان می‌دهد که یک کتابخانه بومی مورد نیاز، مانند /libwickjni.so بارگیری نشده است یا در وابستگی‌های برنامه گنجانده نشده است یا به دلایلی یافت نمی‌شود. توجه داشته باشید که جاوا نیاز دارد که هر کتابخانه بومی به طور صریح با استفاده از تابع 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++ آن ثبت کند. در این مورد، نمودار ماشین حساب نیز باید از همان پیشوند فضای نام استفاده کند.

خطای Out Of Memory

خسته شدن حافظه می تواند نشانه ای از انباشته شدن تعداد زیادی بسته در داخل یک نمودار 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. خروجی ها با کمترین تاخیر ممکن تولید می شوند.

CalculatorGraph از ورودی ها عقب است

برای بسیاری از نمودارهای MediaPipe بلادرنگ، تاخیر کم یک هدف است. MediaPipe از پردازش موازی به سبک "pipelined" پشتیبانی می کند تا پردازش هر بسته را در اسرع وقت آغاز کند. معمولاً کمترین تأخیر ممکن، کل زمان مورد نیاز هر ماشین حساب در امتداد یک «مسیر بحرانی» ماشین‌حساب‌های متوالی است. تأخیر یک نمودار MediaPipe به دلیل تأخیرهایی که برای نمایش فریم‌ها ایجاد می‌شود ، می‌تواند بدتر از حالت ایده‌آل باشد.

اگر برخی از ماشین‌حساب‌های موجود در نمودار نتوانند با جریان‌های ورودی بی‌درنگ همگام شوند، تأخیر همچنان افزایش می‌یابد و حذف برخی از بسته‌های ورودی ضروری می‌شود. روش توصیه شده استفاده از ماشین حساب های MediaPipe است که به طور خاص برای این منظور طراحی شده اند، مانند FlowLimiterCalculator همانطور که در How to process realtime input streams توضیح داده شده است.