7.1. מהי רשת נוירונים

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

7.1.1. המנגנון

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

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

A vertical stack of nine labelled boxes representing the layers of a small classification network. The top box is labelled "Input image" with a tensor shape of (192, 192, 3). An arrow leads down to a "Conv + ReLU" box with shape (96, 96, 32). Another arrow leads to a second "Conv + ReLU" box with shape (48, 48, 64). A "MaxPool" box follows with shape (24, 24, 64). Two more "Conv + ReLU" boxes follow with shapes (12, 12, 128) and (6, 6, 256). A "Global average pool" box has shape (256,). A "Fully connected" box has shape (1000,). The bottom box is labelled "Class scores" with shape (1000,). The tensor flow is top to bottom.

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

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

7.1.2. מה מוזן פנימה, מה יוצא החוצה

שני קצותיה של הרשת הם טנזורים – מערכים רב־ממדיים של מספרים, אותו סוג של אובייקט שפרק numpy הציג זה עתה. טנזור הקלט עבור רשת ראייה הוא התמונה שנקלטה, מסודרת מחדש למתכונת שהרשת מצפה לה: בדרך כלל צורת ‎4-tuple‏ (B, H, W, C) שבה B הוא ממד האצווה (תמיד 1 במצלמה, מאחר שפריים אחד מעובד בכל פעם), H ו־W הם הגובה והרוחב בפיקסלים שהרשת מצפה להם, ו־C הוא מספר הערוצים (3 ברשת RGB, 1 בגווני אפור).

טנזור הפלט תלוי בייעוד של הרשת:

  • רשת סיווג מפיקה טנזור חד־ממדי של ציוני ביטחון, אחד לכל מחלקה. האינדקס של הציון הגבוה ביותר הוא המחלקה החזויה. מזהה האנשים הנגזר מ־MobileNet, המגיע ברוב המצלמות, הוא בצורה זו: שני ציונים, אחד עבור ”person“ ואחד עבור ”not person“.

  • רשת זיהוי מפיקה טנזור דו־ממדי שערכיו מתארים רשימה של תיבות תוחמות בתוספת הסתברויות מחלקה. YOLOv8 הוא בצורה זו: טנזור (84, N) שבו 4 מתוך 84 השורות הן ערכי רגרסיית תיבה ו־80 האחרות הן הסתברויות לכל מחלקה, חוזרות על פני N מיקומי עוגן.

  • רשת נקודות מפתח מפיקה טנזור שערכיו הם מיקומי פיקסל של נקודות ציון בעלות שם. מודל נקודות הציון של הפנים של MediaPipe הוא בצורה זו: 468 נקודות מפתח לכל פנים שזוהו.

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

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

לכל צורה יש מעבד־פלט (post-processor) משלה במצלמה הממיר את טנזור הפלט הגולמי בחזרה לצורת התוצאה שבה משתמשת שאר האפליקציה – תיבות תוחמות, רשימות נקודות מפתח, תוויות מחלקה, הערכות מספריות. מעבד הפלט הוא קוד בצד האפליקציה היודע את מתכונת הפלט של הרשת; הרשת עצמה היא רק החישוב האריתמטי שמפיק את הטנזור.

7.1.3. מדוע זה עובד במצלמה

שני רכיבים אריתמטיים הופכים זאת למעשי עבור רכיב ברמת מיקרו־בקר. הראשון הוא קוונטיזציה. האימון מתרחש בחישוב נקודה צפה של 32 ביט; ההסקה יכולה לרוץ בחישוב שלמים של 8 ביט כמעט ללא אובדן דיוק עבור רוב הרשתות. משקלים של 8 ביט תופסים רבע מהאחסון ורצים פי כמה מהר יותר ממספרי הנקודה הצפה של 32 ביט. כל מודל שהמצלמה מגיעה איתו עבר קוונטיזציה מראש מחוץ למצלמה.

השני הוא האצת חומרה. את אותו חישוב אריתמטי שמעבד של מיקרו־בקר מתקדם בו פקודה אחת בכל פעם, מאיץ רשת נוירונים מריץ מאות פעולות בבת אחת. המצלמות החדשות יותר (ה־AE3 וה־N6) נושאות יחידת עיבוד נוירונים (NPU) ייעודית – מאיץ טנזורים על ה־SoC – שהופכת מודל שהיה לוקח שנייה לרוץ על המעבד לכזה שרץ בעשרות מילי־שניות. פרק מנועי ההסקה מתאר כיצד נראה חלקה של המצלמה בכך.

7.1.4. מה מכסה הפרק

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

  • טעינה ובדיקה של מודל;

  • מחיצת הפלאש שבה שוכנים קובצי המודלים;

  • ארבעת השלבים של קריאת הסקה;

  • המנועים שמבצעים בפועל את החישוב האריתמטי;

  • ומעבדי הפלט שהופכים טנזור פלט בחזרה לרשימה של תיבות, נקודות מפתח, או מחלקות.

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