חסר נתיב בינארי של 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), ייתכן שיהיה צורך לשחרר מנות ישנות יותר כדי
לעבד את החבילות החדשות יותר. לקבלת רמזים שונים, ראו:
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
יכול לעכב את הפלט של חבילות בהתאם
חותמות זמן. באמצעות מחשבון כזה, אפשר להתאים את התזמון של הפקת הפלט בדרכים הבאות:
- הזמן בין הפלט תואם לזמן שבין חותמות זמן כפי בצורה הטובה ביותר.
- הפלט מופק עם עיכוב קטן ככל האפשר.
גרף המחשבון מתעכב מאחורי קלט
בתרשימים רבים בזמן אמת של MediaPipe, זמן אחזור קצר הוא מטרה. MediaPipe תומך ב-"pipe בשביל" סגנון של עיבוד מקביל כדי להתחיל לעבד כל חבילה בהקדם האפשרי. בדרך כלל, זמן האחזור הנמוך ביותר האפשרי הוא הזמן הכולל שנדרש על ידי כל מחשבון לאורך 'נתיב קריטי' מתוך עוקבים מחשבונים. זמן האחזור של תרשים MediaPipe עשוי להיות גרוע יותר מהזמן האידיאלי עקב עיכובים בהצגת פריימים במרווחי זמן שווים, כפי שמתואר תזמון הפלט לא שווה.
אם חלק מהמחשבונים בגרף לא עומדים בקצב של הקלט בזמן אמת
אחר כך זמן האחזור ימשיך לגדול, ויש צורך
לשחרר כמה חבילות קלט. השיטה המומלצת היא להשתמש ב-MediaPipe
מחשבונים שנועדו במיוחד למטרה הזו, כמו
FlowLimiterCalculator
כפי שמתואר
How to process realtime input streams