مسیر باینری پایتون وجود ندارد
پیغام خطا:
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 به آن نیاز دارد دانلود کند. MediaPipe چندین مخزن وابستگی دارد که توسط سایت های گوگل میزبانی می شوند. در برخی از مناطق، ممکن است نیاز به راه اندازی یک پروکسی شبکه یا استفاده از 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)، ممکن است لازم باشد برخی از بستههای قدیمی را در قدیمیتر رها کنید تا بستههای جدیدتر پردازش شوند. برای برخی نکات، نگاه کنید به: 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
می تواند خروجی بسته ها را برای مطابقت با مهرهای زمانی آنها به تاخیر بیندازد. این نوع ماشین حساب زمان بندی خروجی ها را طوری تنظیم می کند که:
- زمان بین خروجی ها با زمان بین مهرهای زمانی تا حد امکان مطابقت دارد.
- خروجی ها با کمترین تاخیر ممکن تولید می شوند.
CalculatorGraph از ورودی ها عقب است
برای بسیاری از نمودارهای MediaPipe بلادرنگ، تاخیر کم یک هدف است. MediaPipe از پردازش موازی به سبک "pipelined" پشتیبانی می کند تا پردازش هر بسته را در اسرع وقت آغاز کند. معمولاً کمترین تأخیر ممکن، کل زمان مورد نیاز هر ماشین حساب در امتداد یک «مسیر بحرانی» ماشینحسابهای متوالی است. تأخیر یک نمودار MediaPipe به دلیل تأخیرهایی که برای نمایش فریمها ایجاد میشود ، میتواند بدتر از حالت ایدهآل باشد.
اگر برخی از ماشینحسابهای موجود در نمودار نتوانند با جریانهای ورودی بیدرنگ همگام شوند، تأخیر همچنان افزایش مییابد و حذف برخی از بستههای ورودی ضروری میشود. روش توصیه شده استفاده از ماشین حساب های MediaPipe است که به طور خاص برای این منظور طراحی شده اند، مانند FlowLimiterCalculator
همانطور که در How to process realtime input streams
توضیح داده شده است.
نظارت بر ورودیهای ماشینحساب و تسویههای مهر زمانی
اشکال زدایی ماشین حساب های MediaPipe اغلب به درک عمیق جریان داده و همگام سازی مهر زمان نیاز دارد. بسته های ورودی به ماشین حساب ابتدا در صف های ورودی در هر جریان بافر می شوند تا توسط InputStreamHandler
اختصاص داده شده همگام شوند. وظیفه InputStreamHandler
تعیین مجموعه بسته ورودی برای یک مهر زمانی ثابت است، که ماشین حساب را در حالت "آماده" قرار می دهد و به دنبال آن یک Calculator:: Process فراخوانی با مجموعه بسته تعیین شده به عنوان ورودی آغاز می شود.
DebugInputStreamHandler
میتواند برای ردیابی بستههای دریافتی و تسویههای مُهر زمانی در زمان واقعی در خروجی LOG(INFO) برنامه استفاده شود. می توان آن را از طریق input_stream_handler ماشین حساب به ماشین حساب های خاصی اختصاص داد یا از طریق فیلد input_stream_handler CalculatorGraphConfig
به صورت جهانی نمودار کرد.
در طول اجرای نمودار، بسته های ورودی پیام های LOG را تولید می کنند که مهر زمانی و نوع بسته را نشان می دهد و به دنبال آن وضعیت فعلی تمام صف های ورودی:
[INFO] SomeCalculator: Adding packet (ts:2, type:int) to stream INPUT_B:0:input_b
[INFO] SomeCalculator: INPUT_A:0:input_a num_packets: 0 min_ts: 2
[INFO] SomeCalculator: INPUT_B:0:input_b num_packets: 1 min_ts: 2
علاوه بر این، نظارت بر رویدادهای تسویه مهر زمانی را فعال می کند (در صورتی که DefaultInputStreamHandler
اعمال شود). این میتواند به آشکارسازی یک افزایش غیرمنتظره کران مهر زمانی در جریانهای ورودی که منجر به یک Calculator::فرایند تماس با مجموعه ورودی ناقص و در نتیجه بستههای خالی در جریانهای ورودی (احتمالاً مورد نیاز) میشود، کمک کند.
سناریوی نمونه:
node {
calculator: "SomeCalculator"
input_stream: "INPUT_A:a"
input_stream: "INPUT_B:b"
...
}
با توجه به یک ماشین حساب با دو ورودی، دریافت بسته ورودی با مهر زمانی 1 در جریان A و به دنبال آن بسته ورودی با مهر زمانی 2 در جریان B. محدود شده مهر زمانی به 2 در جریان B با بسته ورودی معلق در جریان A در مهر زمانی 1 افزایش می یابد. Calculator:: پردازش تماس با یک مجموعه ورودی ناقص برای مهر زمانی 1. در این مورد، خروجی های DefaultInputStreamHandler
:
[INFO] SomeCalculator: Filled input set at ts: 1 with MISSING packets in input streams: INPUT_B:0:input_b.
VLOG دوست شماست
MediaPipe در بسیاری از مکانها از VLOG
برای ثبت رویدادهای مهم برای اهداف اشکالزدایی استفاده میکند، در حالی که در صورت فعال نبودن گزارش روی عملکرد تأثیری نمیگذارد.
درباره VLOG
در abseil VLOG
بیشتر ببینید
به خاطر داشته باشید که اگر VLOG
را بصورت سراسری فعال کنید (با استفاده از پرچم --v
) می تواند هرزنامه باشد. راه حل --vmodule
flag که اجازه می دهد سطوح مختلف برای فایل های منبع مختلف تنظیم شود.
در مواردی که نمی توان از --v
/ --vmodule
استفاده کرد (مثلاً اجرای یک برنامه Android)، MediaPipe اجازه می دهد تا پرچم های VLOG
--v
/ --vmodule
را برای اهداف اشکال زدایی تنظیم کنید که هنگام ایجاد CalculatorGraph
اعمال می شوند.
لغو:
-
MEDIAPIPE_VLOG_V
: مقداری را که برای--v
ارائه میدهید تعریف و ارائه کنید -
MEDIAPIPE_VLOG_VMODULE
: تعریف و ارائه مقداری که برای--vmodule
ارائه می کنید
میتوانید با افزودن موارد زیر، موارد زیر را تنظیم کنید: --copt=-DMEDIAPIPE_VLOG_VMODULE=\"*calculator*=5\"
با الگوهای ماژول مورد نظر و سطوح VLOG
(به جزئیات بیشتر برای --vmodule
در abseil VLOG
مراجعه کنید) به دستور ساخت خود.
مهم: توجه داشته باشید که افزودن موارد فوق به دستور ساخت شما باعث ایجاد بازسازی کل باینری از جمله وابستگی ها می شود. بنابراین، با توجه به اینکه لغو VLOG
فقط برای اهداف اشکالزدایی وجود دارد، سریعتر است که به سادگی vlog_overrides.cc
را تغییر دهید و MEDIAPIPE_VLOG_V/VMODULE
در بالا اضافه کنید.
پرچم های پشتیبانی نشده در طول ساخت
اگر از Clang 18 یا بالاتر استفاده می کنید، ممکن است مجبور شوید برخی از بهینه سازی های کامپایلر را در باطن CPU ما غیرفعال کنید.
برای غیرفعال کردن پشتیبانی از avxvnniint8
، موارد زیر را به شما اضافه کنید .bazelrc
:
build --define=xnn_enable_avxvnniint8=false