7.16. סיכום

הפרק הזה עבר על החלקים של ml שאליהם אפליקציית OpenMV פונה כאשר שלב הסקה הוא חלק מצינור העיבוד:

  • מושגים – מהי רשת נוירונים במונחים אריתמטיים (ערימה של אופרטורים הניתנים לאימון הממפים טנזור לטנזור), מה הראייה הממוחשבת שינתה לעומת עיבוד תמונה קלאסי (אלגוריתם הסיכום שכתב אדם נעלם, והוחלף במשקלים שנלמדו מנתונים מתויגים), ודמו ה-hello שהריץ מזהה פנים בכמה שורות בודדות של Python.

  • מודול ml – אובייקט ml.Model ותכונותיו לבדיקת טנזורי הקלט והפלט, נתיבי קובצי המודל שהוא מקבל, והיכן קבצים אלה ממוקמים: מחיצת ROMFS לקריאה בלבד להרצה ישירות מזיכרון הפלאש (flash), או כל מערכת קבצים אחרת של MicroPython כאשר ניתן להעתיק את המודל ל-RAM בזמן הטעינה.

  • צינור ההסקה – שלושת השלבים ש-predict() מריץ ברצף (קדם-עיבוד, שיגור למנוע, פוסט-עיבוד), הידית Normalization על שלב ראשון, ידית הפוסט-עיבוד על שלב שלישי, והאריתמטיקה של הקוונטיזציה הקושרת את טנזורי המספרים השלמים שהמצלמה מריצה בחזרה למספרים בעלי ערך ממשי שמולם אומנה הרשת.

  • מנועי הסקה – TFLM (מפרש האופרטורים שרוב המצלמות מריצות), CMSIS-NN (ספריית גרעיני ה-SIMD שמתחתיו על Cortex-M), וה-NPU-ים (Ethos-U55 של Arm על ה-AE3 בשילוב המהדר הלא-מקוון Vela, ו-Neural-ART של ST על ה-N6 בשילוב STAI ו-STEdgeAI). המנוע נקבע על ידי המצלמה; הסקריפט אינו בוחר אותו.

  • פענוח הפלט – מעבדי הפוסט-עיבוד שהופכים טנזורי פלט גולמיים לתיבות, נקודות מפתח או רשימות לכל מחלקה, המחלקה NMS שמכווצת מועמדים חופפים, סקירת YOLOv8 שמראה כיצד לשמור על פענוח מהיר על ידי החלת סף לפני הביטול של הקוונטיזציה, והפרוטוקול לכתיבת מפענח מותאם אישית כאשר הקטלוג אינו מכסה מודל מסוים.

7.16.1. מה שכעת בהישג יד

שלושה דברים שהפרק מכין אליהם:

  • טעינת מודל מאומן והרצתו. כל דבר ב-/rom/ עובד ללא הכנה נוספת; כל דבר שמסופק חיצונית כקובץ .tflite תואם עובד לאחר שהכלי הלא-מקוון עבור המצלמה היעודה (Vela עבור ה-AE3, STEdgeAI עבור ה-N6) הפיק את הפריסה הנכונה.

  • פענוח כל טנזור פלט. כאשר הארכיטקטורה מופיעה בקטלוג, בחירת מעבד הפוסט-עיבוד הנכון היא טכנית: YoloV8 עבור מודל YOLOv8, BlazeFace עבור BlazeFace, וכן הלאה. כאשר היא אינה מופיעה, הפרוטוקול writing-your-own מכסה את החוזה, וה-סקירת YOLOv8 היא ההפניה הנקייה ביותר להעתקה ממנה.

  • הסקת מסקנות לגבי ביצועים. מודל שרץ ב-30 FPS על NPU עשוי לרוץ ב-3 FPS על Cortex-M7; היחס תלוי בכמה מהרשת המצלמה מסוגלת להוריד מהמעבד. קוונטיזציה, מיקום ב-ROMFS, קומפילציה ל-NPU, וכיסוי האופרטורים של מנוע היעד הם ארבעת המנופים, והפרק כיסה כל אחד מהם.

7.16.2. ML משתלב עם שאר חלקי המצלמה

הסקה רצה לעיתים נדירות בבידוד. מודול image לוכד ומבצע קדם-עיבוד לפריים, מודול ml מריץ את הרשת, ו-ulab.numpy מבצע כל עבודה מספרית שלאף אחד מהצדדים אין יכולת מובנית עבורה. סקריפט זיהוי טיפוסי משלב את שלושתם: לכידה באמצעות csi, התאמת הפריים באופן אופציונלי באמצעות image, הרצת predict(), פוסט-עיבוד התוצאה באמצעות המודול הנכון מתוך ml.postprocessing, ופנייה אל ulab.numpy עבור כל חישוב מותאם אישית שהאפליקציה רוצה לבצע מעל לתיבות שמעבד הפוסט-עיבוד החזיר. שלושת המודולים חולקים את אותו מודל זיכרון; הגבולות ביניהם הם ללא העתקה (zero-copy) בכל מקום אפשרי.