שאלות נפוצות

איך להמיר תמונות ImageFrame ו-GpuBuffers

המחשבונים ImageFrameToGpuBufferCalculator ו-GpuBufferToImageFrameCalculator ממירים בין חבילות מסוג ImageFrame ו-GpuBuffer. ImageFrame מתייחס לנתוני תמונה בזיכרון המעבד (CPU) בכל אחד מהפורמטים של תמונות במפת סיביות. GpuBuffer מתייחס לנתוני תמונה בזיכרון GPU. תוכל לקרוא פרטים נוספים בקטע GpuBuffer to ImageFrame Converters. תוכלו לראות דוגמה ב:

איך להמחיש את תוצאות התפיסה

באמצעות AnnotationOverlayCalculator ניתן להוסיף בפריים של הווידאו תוצאות תפיסה, כמו תיבות תוחמות, חצים ואובליות, בפריימים של הווידאו מיושרים עם האובייקטים שזוהו. ניתן להציג את התוצאות בחלון אבחון כשמשתמשים בתחנת עבודה, או במסגרת מרקם כשמפעילים את המכשיר. אפשר לראות דוגמה לשימוש ב-AnnotationOverlayCalculator ב:

איך להפעיל מחשבונים במקביל

בתוך תרשים מחשבון, MediaPipe מפעיל באופן שגרתי צמתים נפרדים של מחשבון, במקביל. MediaPipe מנהלת מאגר של שרשורים ומריצה כל מחשבון ברגע ששרשור יהיה זמין, וכל הקלט שלו יהיה מוכן. כל מכונת מחשבון רצה רק לקבוצת קלט אחת בכל פעם, ולכן רוב המחשבונים צריכים להיות תואמים ל-thread בלבד ולא ל-thread-safe.

כדי לאפשר למחשבון אחד לעבד מספר קלט במקביל, יש שתי גישות אפשריות:

  1. הגדרה של מספר צמתים של מחשבון ושליחה של מנות קלט לכל הצמתים.
  2. מגדירים את המחשבון לבטיחות בשרשורים וקובעים את הגדרת max_in_flight שלו.

אפשר להשתמש בגישה הראשונה באמצעות מחשבונים שנועדו לחלק חבילות בין מחשבונים אחרים, כמו RoundRobinDemuxCalculator. RoundRobinDemuxCalculator יחיד יכול לפזר חבילות רצופות בין כמה צמתים של ScaleImageCalculator שהוגדרו באופן זהה.

הגישה השנייה מאפשרת עד max_in_flight הפעלות של השיטה CalculatorBase::Process באותו צומת של המחשבון. מנות הפלט מ-CalculatorBase::Process מסודרות באופן אוטומטי לפי חותמת הזמן לפני שהן מועברות למחשבונים downstream.

בכל אחת משתי הפעולות האלה, עליכם להיות מודעים לכך שהמחשבון שפועל במקביל לא יכול לשמור על מצב פנימי באותו אופן כמו מחשבון רציף רגיל.

חותמות זמן של הפלט כשמשתמשים ב-ImmediateinputStreamHandler

ה-ImmediateInputStreamHandler מספק כל חבילה ברגע שהיא מגיעה לזרם הקלט. כתוצאה מכך, היא יכולה להעביר חבילה עם חותמת זמן גבוהה יותר מזרם קלט אחד, לפני שהיא מעבירה חבילה עם חותמת זמן נמוכה יותר מזרם קלט אחר. אם חותמות הזמן של הקלט משמשות גם לחבילות שנשלחות לזרם פלט אחד, באותו זרם יוסבר שחותמות הזמן לא גדלות באופן מונוטוני. כדי לפתור את הבעיה, המחשבון צריך להפיק פלט של חבילה רק אחרי שהעיבוד של חותמת הזמן הסתיים. אפשר לעשות זאת על ידי המתנה עד שחבילות הקלט יתקבלו מכל מקורות הקלט עבור חותמת הזמן הזו, או על ידי התעלמות מחבילה שמגיעה עם חותמת זמן שכבר עובדה.

איך משנים את ההגדרות בזמן ריצה

יש שתי גישות עיקריות לשינוי ההגדרות של תרשים מחשבון בזמן שהאפליקציה פועלת:

  1. מתחילים מחדש את תרשים המחשבון עם הערך CalculatorGraphConfig שהשתנה.
  2. שלח אפשרויות מחשבון חדשות דרך חבילות בתזרמי קלט של גרף.

בגישה הראשונה יש יתרון בשימוש בכלי עיבוד CalculatorGraphConfig, כמו 'תת-תרשימים'. בגישה השנייה יש יתרון בכך שהם מאפשרים למַחונים ולחבילות פעילים להישאר במצב בזמן שההגדרות משתנות. שותפים ביצירת המדיה של Mediapipe בוחנים כרגע גישות חלופיות כדי להשיג את שני היתרונות האלה.

איך לעבד מקורות קלט בזמן אמת

אפשר להשתמש ב-framework של Mediapipe כדי לעבד מקורות נתונים אונליין או אופליין. לעיבוד אופליין, המנות נדחפות לתרשים ברגע שמחשבונים מוכנים לעבד את החבילות האלה. לעיבוד אונליין, חבילה אחת לכל פריים נשלחת לתרשים בזמן שהפריים מתועד.

כדי להשתמש ב-framework של MediaPipe, צריך להקצות רק לחבילות רצופות חותמות זמן שעולות באופן מונוטוני. באופן מוסכמה, מחשבונים ותרשימים בזמן אמת משתמשים בזמן ההקלטה או בזמן ההצגה כחותמת הזמן של כל מנה, כאשר כל חותמת זמן מייצגת מיליוניות השנייה מאז Jan/1/1970:00:00:00. כך ניתן לעבד חבילות ממקורות שונים לפי סדר גלובלי ועקבי.

בדרך כלל לעיבוד אופליין, כל חבילת קלט מעובדת והעיבוד נמשך ככל הנדרש. בעיבוד אונליין, לעיתים קרובות צריך לשחרר את חבילות הקלט כדי לעמוד בקצב הגעת המסגרות של נתוני הקלט. כשהקלטים מגיעים בתדירות גבוהה מדי, השיטה המומלצת להסרת מנות היא להשתמש במחשבוני MediaPipe שמיועדים במיוחד למטרה הזו, כמו FlowLimiterCalculator ו-PacketClonerCalculator.

כשמדובר בעיבוד אונליין, צריך גם לקבוע במהירות מתי אפשר להמשיך את העיבוד. טכנולוגיית MediaPipe תומכת בכך על ידי הפצת גבולות חותמת הזמן בין מחשבונים. הגבולות של חותמות הזמן מציינים מרווחים של חותמות זמן שלא יכללו חבילות קלט, והם מאפשרים למחשבונים להתחיל לעבד את חותמות הזמן האלה באופן מיידי. מחשבונים שמיועדים לעיבוד בזמן אמת צריכים לחשב בקפידה את הגבולות של חותמת הזמן על מנת להתחיל את העיבוד במהירות האפשרית. לדוגמה, ב-MakePairCalculator נעשה שימוש ב-API של SetOffset כדי להפיץ את הגבולות של חותמת הזמן ממקורות הקלט אל זרמי הפלט.

האם אוכל להריץ את MediaPipe ב-MS Windows?

נכון לעכשיו, הניוד של MediaPipe תומך ב-Debian Linux, ב-Ubuntu Linux, ב-MacOS, ב-Android וב-iOS. הליבה של MediaPipe framework היא ספריית C++ שתואמת לתקן C++11, כך שקל יחסית לנייד אותה לפלטפורמות נוספות.