5.34. סיכום¶
מודול ה-image הוא ה-API הגדול ביותר שהמצלמה חושפת, והפרק זה עתה כיסה את קווי המתאר שלו: כיצד תמונה מיוצגת בזיכרון, כיצד המצלמה קוראת וכותבת פיקסלים בודדים, כיצד היא מציירת לתוך פריימים שנלכדו, כיצד היא עוברת טרנספורמציה עליהם אריתמטית וגאומטרית, כיצד היא מסווגת אותם לפי סף ומסננת אותם, כיצד היא מחלצת מהם מדידות וזיהויים, כיצד היא מפענחת מהם סמלים מודפסים, כיצד היא משווה תמונה אחת מול אחרת, וכיצד היא מעבירה את התוצאות אל המצלמה וממנה.
ערכת הכלים רחבה בכוונה. צינור ראייה ממוחשבת קלאסי הרץ על מצלמה משובצת קטנה מבצע את רוב עבודתו לפני שמשהו מגיע למודל למידת מכונה, כשיש כזה – בחירת סף מנקה את הקלט, מסננים מנקים רעש, אזורים מצמצמים את החיפוש, מזהי רכיבים/כתמים (blob) וקווים מאתרים מועמדים, ניקוד דמיון מחליט אם המועמד מעניין, ושכבת ה-I/O מוסרת את התוצאה לכל מה שמריץ את השלב הבא. כל עמוד בפרק זה כיסה אחת מאותן פעולות; הצינור הנכון לכל יישום נתון הוא רצף שלהן המורכבות בסדר שהבעיה דורשת.
5.34.1. תבנית הצינור¶
רוב יישומי המצלמה הלא-טריוויאליים עוקבים אחר אותם קווי מתאר. לכוד פריים מהחיישן. עבד מקדימה אותו: המר פורמטים, השווה את ההיסטוגרמה, טשטש החוצה רעש. אתר את האזורים או המאפיינים המעניינים: זיהוי רכיבים/כתמים (blob), זיהוי קווים, התאמת תבנית, פענוח קוד. נתח את מה שנמצא: מדידות גאומטריות, ניקוד דמיון, סטטיסטיקה. החלט מה לעשות בהתבסס על הניתוח: הפעל GPIO, דווח על מטען, לכוד-ורשום, מסור את הפריים למודל ML. הפק את ההחלטה או את הפריט שנלכד: שמור, קודד, שלח, צייר בחזרה לתוך הפריים עבור התצוגה המקדימה ב-IDE.
אף עמוד בודד בפרק לא כיסה כל שלב; הפרק כיסה את אבני הבניין שהצינור מרכיב. בחירה באילו אבנים להשתמש ובאיזה סדר היא עבודתו של סקריפט היישום.
5.34.2. לאן הפרק מוביל¶
מודול ה-image עוסק בתמונות כתמונות – פיקסלים, אזורים, ציור, זיהויים. הרבה עבודה על נתונים שנלכדו אינה מתאימה למסגרת הזו. חישוב סטטיסטיקה על מערך מספרי שרירותי, הרצת חשבון מווקטר על נתוני חיישן גולמיים, החלת טרנספורמציית מטריצה מותאמת אישית שאין מאחוריה מתודה של מודול image, הכנת נתונים למודל למידת מכונה הרוצה פריסת טנזור ספציפית – כל אלה הם משימות לספריית מערכים מספריים, לא לכזו של עיבוד תמונה.
הפרק הבא מכסה בדיוק את זה. מודול ulab.numpy המסופק עם MicroPython על המצלמה הוא תת-קבוצה של NumPy, ושני גשרים מחברים אותו למודול ה-image: to_ndarray() מעתיק את הפיקסלים של פריים לתוך ndarray עבור עבודה מספרית, והבנאי של Image מקבל ndarray כדי לבנות תמונה חדשה מהתוצאה, מוכנה להצגה, שמירה, או הזנה בחזרה לתוך ספריית ה-image. שני המודולים מתחברים – כל אחד עושה את מה שהשני אינו עושה, ויחד הם מכסים את העבודה המספרית ועבודת ההדמיה שיישום ראייה משובץ זקוק להן.