سوالات متداول

نحوه تبدیل ImageFrames و GpuBuffer

ماشین حساب ImageFrameToGpuBufferCalculator و GpuBufferToImageFrameCalculator بین بسته هایی از نوع ImageFrame و GpuBuffer به عقب و جلو تبدیل می شوند. ImageFrame به داده های تصویر در حافظه CPU در هر یک از تعدادی از فرمت های تصویر بیت مپ اشاره دارد. GpuBuffer به داده های تصویر در حافظه GPU اشاره دارد. می‌توانید جزئیات بیشتری را در بخش مفاهیم چارچوب مبدل‌های GpuBuffer به ImageFrame بیابید. شما می توانید یک نمونه را در:

نحوه تجسم نتایج ادراک

AnnotationOverlayCalculator اجازه می دهد تا نتایج ادراک، مانند کادرهای محدود، فلش ها، و بیضی ها، روی فریم های ویدیویی که با اشیاء شناسایی شده تراز شده اند قرار گیرند. نتایج را می توان در یک پنجره تشخیصی هنگام اجرا در یک ایستگاه کاری، یا در یک قاب بافت هنگام اجرا بر روی دستگاه نمایش داد. می توانید نمونه ای از استفاده از AnnotationOverlayCalculator را در موارد زیر مشاهده کنید:

نحوه اجرای موازی ماشین حساب ها

در یک نمودار ماشین حساب، MediaPipe به طور معمول گره های ماشین حساب جداگانه را به صورت موازی اجرا می کند. MediaPipe مجموعه ای از رشته ها را حفظ می کند و هر ماشین حساب را به محض اینکه یک رشته در دسترس است و همه ورودی های آن آماده است، اجرا می کند. هر نمونه ماشین حساب فقط برای یک مجموعه از ورودی ها در یک زمان اجرا می شود، بنابراین بیشتر ماشین حساب ها فقط باید با رشته ها سازگار باشند و ایمن نباشند.

برای فعال کردن یک ماشین حساب برای پردازش چندین ورودی به صورت موازی، دو روش ممکن وجود دارد:

  1. چندین گره ماشین حساب را تعریف کنید و بسته های ورودی را به همه گره ها ارسال کنید.
  2. ماشین حساب را به صورت رشته ای ایمن کنید و تنظیمات max_in_flight آن را پیکربندی کنید.

روش اول را می توان با استفاده از ماشین حساب های طراحی شده برای توزیع بسته ها در سایر ماشین حساب ها مانند RoundRobinDemuxCalculator دنبال کرد. یک RoundRobinDemuxCalculator می‌تواند بسته‌های متوالی را در چندین گره ScaleImageCalculator با پیکربندی یکسان توزیع کند.

روش دوم حداکثر فراخوانی max_in_flight از روش CalculatorBase::Process در همان گره ماشین حساب امکان پذیر می کند. بسته‌های خروجی از CalculatorBase::Process به‌طور خودکار قبل از ارسال به ماشین‌حساب‌های پایین‌دست، توسط مهر زمانی مرتب می‌شوند.

با هر یک از این روش ها، باید بدانید که ماشین حسابی که به صورت موازی کار می کند نمی تواند حالت داخلی را مانند یک ماشین حساب متوالی معمولی حفظ کند.

هنگام استفاده از ImmediateInputStreamHandler، مُهر زمانی خروجی بگیرید

ImmediateInputStreamHandler هر بسته را به محض رسیدن به جریان ورودی تحویل می دهد. در نتیجه، می‌تواند بسته‌ای را با مهر زمانی بالاتر از یک جریان ورودی قبل از تحویل بسته با مهر زمانی پایین‌تر از جریان ورودی متفاوت تحویل دهد. اگر این مهرهای زمانی ورودی هر دو برای بسته‌های ارسال شده به یک جریان خروجی استفاده شوند، آن جریان خروجی از عدم افزایش یکنواخت مهر زمانی شکایت می‌کند. به منظور رفع این مشکل، ماشین حساب باید مراقب باشد که یک بسته تنها پس از تکمیل پردازش برای مهر زمانی آن، خروجی بگیرد. این کار را می‌توان با صبر کردن تا دریافت بسته‌های ورودی از تمام جریان‌های ورودی برای آن مُهر زمانی، یا با نادیده گرفتن بسته‌ای که با مهر زمانی که قبلاً پردازش شده است، انجام داد.

نحوه تغییر تنظیمات در زمان اجرا

دو روش اصلی برای تغییر تنظیمات نمودار ماشین حساب در حین اجرای برنامه وجود دارد:

  1. نمودار ماشین حساب را با CalculatorGraphConfig اصلاح شده راه اندازی مجدد کنید.
  2. گزینه های جدید ماشین حساب را از طریق بسته های موجود در جریان های ورودی نمودار ارسال کنید.

اولین رویکرد دارای مزیت استفاده از ابزارهای پردازش CalculatorGraphConfig مانند "subgraphs" است. روش دوم این مزیت را دارد که به ماشین‌حساب‌ها و بسته‌های فعال اجازه می‌دهد در حین تغییر تنظیمات در پرواز باقی بمانند. مشارکت کنندگان Mediapipe در حال حاضر در حال بررسی رویکردهای جایگزین برای دستیابی به هر دوی این مزایا هستند.

نحوه پردازش جریان های ورودی بیدرنگ

چارچوب mediapipe می تواند برای پردازش جریان های داده به صورت آنلاین یا آفلاین استفاده شود. برای پردازش آفلاین، بسته ها به محض آماده شدن ماشین حساب ها برای پردازش آن بسته ها به نمودار فشار داده می شوند. برای پردازش آنلاین، یک بسته برای هر فریم به هنگام ثبت آن فریم به نمودار فشار داده می شود.

چارچوب MediaPipe فقط مستلزم آن است که بسته‌های متوالی به طور یکنواخت با افزایش زمان مُهر اختصاص داده شوند. طبق قرارداد، ماشین‌حساب‌ها و نمودارهای بی‌درنگ از زمان ضبط یا زمان ارائه به‌عنوان مهر زمانی برای هر بسته استفاده می‌کنند، که هر مهر زمانی نشان‌دهنده میکروثانیه‌ها از Jan/1/1970:00:00:00 . این اجازه می دهد تا بسته ها از منابع مختلف با یک نظم جهانی سازگار پردازش شوند.

به طور معمول برای پردازش آفلاین، هر بسته ورودی پردازش می شود و پردازش تا زمانی که لازم باشد ادامه می یابد. برای پردازش آنلاین، اغلب لازم است بسته های ورودی را رها کنید تا با ورود فریم های داده ورودی همگام شوید. وقتی ورودی‌ها خیلی مکرر می‌رسند، روش توصیه‌شده برای حذف بسته‌ها استفاده از ماشین‌حساب‌های MediaPipe است که به‌طور خاص برای این منظور طراحی شده‌اند، مانند FlowLimiterCalculator و PacketClonerCalculator .

برای پردازش آنلاین، همچنین لازم است به سرعت مشخص شود که چه زمانی پردازش می تواند ادامه یابد. MediaPipe با انتشار مرزهای مهر زمانی بین ماشین حساب ها از این امر پشتیبانی می کند. مرزهای مهر زمانی فواصل مُهر زمانی را نشان می‌دهند که حاوی بسته‌های ورودی نیستند و به ماشین‌حساب‌ها اجازه می‌دهند تا فوراً پردازش آن مهرهای زمانی را آغاز کنند. ماشین‌حساب‌هایی که برای پردازش بیدرنگ طراحی شده‌اند، باید مرزهای مهر زمانی را به دقت محاسبه کنند تا در اسرع وقت پردازش را آغاز کنند. به عنوان مثال، MakePairCalculator از SetOffset API برای انتشار مرزهای مهر زمانی از جریان های ورودی به جریان های خروجی استفاده می کند.

آیا می توانم MediaPipe را در MS Windows اجرا کنم؟

در حال حاضر قابل حمل MediaPipe از Debian Linux، Ubuntu Linux، MacOS، Android و iOS پشتیبانی می کند. هسته چارچوب MediaPipe یک کتابخانه ++C است که مطابق با استاندارد C++11 است، بنابراین انتقال آن به پلتفرم‌های اضافی نسبتاً آسان است.