פתרון תקלות

חסר נתיב בינארי של Python

הודעת השגיאה:

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 לא מצליח למצוא את הקובץ הבינארי המקומי של Python. כדי לפתור את הבעיה את הבעיה הזו, קודם צריך למצוא את המיקום הבינארי של python ואז להוסיף --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

חסרות חבילות Python נחוצות

הודעת השגיאה:

ImportError: No module named numpy
Is numpy installed?

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

האחזור של מאגרים של תלות מרחוק נכשל

הודעת השגיאה:

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. באזורים מסוימים, ייתכן שיהיה צורך להגדיר שרת proxy של רשת או להשתמש ב-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 עשוי לעזור.

נכשלה התקנת PIP של Python

הודעת השגיאה:

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

אחרי הרצת הפקודה pip install mediapipe, בדרך כלל המשמעות היא שאין קוד Python תקין של MediaPipe למערכת שלכם. שימו לב: MediaPipe Python PyPI תומך באופן רשמי ב-64-bit גרסה 3.7 עד 3.10 של Python במערכות ההפעלה הבאות:

  • x86_64 Linux
  • x86_64 macOS 10.15+
  • amd64 Windows

אם מערכת ההפעלה נתמכת כרגע והשגיאה הזו עדיין מוצגת, צריך לוודא שגם הקוד הבינארי של Python וגם הגרסה הבינארית של PIP מתאימים ל-Python 3.7 עד 3.10. אחרת, מומלץ לפתח את חבילת MediaPipe Python באופן מקומי על ידי ביצוע הפעולות הבאות הוראות להתאמה אישית כאן.

כשל בטעינת DLL של Python ב-Windows

הודעת השגיאה:

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

מציין בדרך כלל שבמערכת Windows המקומית חסר Visual C++ חבילות שניתן להפיץ ו/או קובצי DLL בזמן ריצה של Visual C++. כדי לפתור את הבעיה, בהתקנה של הקוד הרשמי vc_redist.x64.exe או להתקין את הפקודה 'msvc-runtime' חבילת Python באמצעות הרצה

$ python -m pip install msvc-runtime

לתשומת ליבך, "msvc-runtime" חבילת Python לא משוחררת או לא מתוחזקת מאת 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 אבל שליעד הספרייה של OurNew המחשבון יש לא קושר לקובץ הבינארי של האפליקציה. כשמוסיפים מחשבון חדש של המחשבון, יש להוסיף גם את המחשבון הזה כתלות מסוג build את האפליקציות באמצעות תרשים המחשבון.

השגיאה הזו מזוהה בזמן הריצה כי תרשימי המחשבון מפנים מחשבונים לפי שם בשדה CalculatorGraphConfig::Node:calculator. כשהספרייה של מחשבון מקושרת לקובץ בינארי של אפליקציה, המחשבון נרשם אוטומטית לפי שם באמצעות REGISTER_CALCULATOR באמצעות הספרייה registration.h. שימו לב REGISTER_CALCULATOR יכול לרשום מחשבון עם קידומת של מרחב שמות, זהה למרחב השמות שלו ב-++C. במקרה כזה, גם תרשים המחשבון צריך להשתמש אותה תחילית של מרחב שמות.

שגיאה מסוג 'חסר זיכרון'

תפיסת זיכרון יכולה להיות תסמין של יותר מדי חבילות שמצטברות בתוך תרשים MediaPipe פועל. יכולות להיות לכך כמה סיבות, למשל:

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

לבעיה (1), ייתכן שיהיה צורך לשחרר מנות ישנות יותר כדי לעבד את החבילות החדשות יותר. לקבלת רמזים שונים, ראו: How to process realtime input streams

לבעיה (2), יכול להיות שבזרם קלט אחד אין חבילות נתונים לחלק סיבה. ייתכן שמכשיר או מחשבון לא הוגדרו כראוי או שגרמו ליצירת חבילות רק באופן אקראי. הדבר עלול לגרום למחשבונים במורד הזרם להמתין מנות שאף פעם לא יגיעו, וכתוצאה מכך המנות יצטברו חלק מזרמי הקלט שלהם. MediaPipe מטפל בבעיות כאלה באמצעות "timestamps [גבולות]." לקבלת רמזים שונים, ראו: 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. הפלט מופק עם עיכוב קטן ככל האפשר.

גרף המחשבון מתעכב מאחורי קלט

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

אם חלק מהמחשבונים בגרף לא עומדים בקצב של הקלט בזמן אמת אחר כך זמן האחזור ימשיך לגדול, ויש צורך לשחרר כמה חבילות קלט. השיטה המומלצת היא להשתמש ב-MediaPipe מחשבונים שנועדו במיוחד למטרה הזו, כמו FlowLimiterCalculator כפי שמתואר How to process realtime input streams