v4.7.0¶
v4.7.0 היא גרסה עיקרית עם תכונות חדשות. הבולט שבהם: לוח OpenMV AE3 חדש (Alif Ensemble, Cortex-M55 + Ethos-U55 NPU) עם מודל תכנות דו-ליבתי openamp, מערכת קבצים ROMFS (/rom) לקריאה-בלבד עם מודלים ומפלים מצורפים, תמיכה ב-VL53L8CX time-of-flight בגודל 8x8, מעבדי-בתר חדשים YOLOv8 / YOLO-LC, ו-MicroPython 1.25. כמו כן היא משנה את אופן טעינתם של מודלים מובנים ומפלי Haar, לכן קראו את השינויים שוברי התאימות שלהלן.
עיקרי הדברים¶
לוח OpenMV AE3 — לוח Alif Ensemble (Cortex-M55 + Ethos-U55 NPU), עם פורט מלא, מאתחל (bootloader) ו-ROMFS.
מודול
openampדו-ליבתי — העברת עבודה לליבת ה-Alif השנייה מעל RPMsg (המעטר@async_remote,Endpoint/EndpointIO).ROMFS — מערכת קבצים
/romלקריאה-בלבד עם מודלי TFLite ומפלי Haar מובנים, וכן בונה מארח חדשtools/mkromfs.py.VL53L8CX — תמיכה בחיישן time-of-flight רב-אזורי בגודל 8x8.
מעבדי-בתר חדשים ל-ML —
yolo_v8_postprocessו-yolo_lc_postprocess.MicroPython עודכן ל-1.25.0.
שובר תאימות: מודלים מובנים ומפלי Haar נטענים כעת מ-
/romלפי נתיב (ראו את שינוי ml.Model ואת שינוי מפל ה-Haar).
תכונות חדשות¶
OpenMV AE3 — לוח Alif Ensemble חדש (ליבת יישומים Cortex-M55 + Ethos-U55 NPU), עם פורט, מאתחל (bootloader), תצורת לוח, RGB LED ותמיכת ROMFS.
openamp— מודול חדש למודל ה-RPC הדו-ליבתי של Alif (Open-AMP / RPMsg):Endpoint,EndpointIO,new_service_callback, והמעטר@async_remoteלהעברת פונקציות שעברו marshalling אל הליבה השנייה. ליבות ה-HE/HP מגיעות עם מריץ משימות_boot.pyמבוסס asyncio שבברירת מחדל.audio— הפורט של Alif מוסיף את מודול האודיו (מיקרופון PDM) עם API הזרמה מבוסס פונקציית callback (audio.init(channels=, frequency=, gain_db=, buffers=, samples=, overflow=, highpass=)) ב-AE3.ROMFS — מערכת קבצים
/romלקריאה-בלבד עם נכסים מובנים (מודלי TFLite, מפלי Haar, …) ארוזים לכל לוח, כלי מארח חדשtools/mkromfs.py(tflite, tflite+vela, מפל Haar, טקסט, בינארי), ועוזרscripts/libraries/romfs.pyהחושף אתls_romfs().עיבוד-בתר של ML — מחלקות חדשות
yolo_v8_postprocess(YOLOv8) ו-yolo_lc_postprocess(וריאנט קל-משקל של tiny-YOLOv2 עם עוגנים שבברירת מחדל מותאמים למערכות משובצות), שכל אחת מקבלתthreshold,nms_thresholdו-nms_sigma.הגנה מהבהוב ב-GenX320 — ioctl חדש
IOCTL_GENX320_SET_AFKלהפעלה והגדרה של מסנן הנוגד-הבהוב של חיישן האירועים (תדר הבהוב מינימלי/מקסימלי ב-הרץ), עם דוגמהgenx320_grayscale_set_afk.py.VL53L8CX — תמיכה בחיישן time-of-flight רב-אזורי בגודל 8x8 דרך מודול ה-
tof(זיהוי אוטומטי, 8x8 ב-15 הרץ).
שינויים ושיפורים נוספים¶
MicroPython עודכן ל-1.25.0 (פורטים של STM32 ו-i.MX RT), עם הוספת פורט ה-Alif מהמקור והסרת מנהלי ההתקן הישנים של BT-HCI מפורטי ה-STM32 / i.MX RT.
GenX320 — רצף ISSD חדש מכפיל את שעון הפיקסלים הפנימי (24 ← 48 MHz) לקצבי פריימים גבוהים יותר.
STM32N6 / ST Edge AI — תשתית לפריסת מודלי Neural-ART ב-STM32N6 (כלי ST Edge AI ותמיכת ROMFS).
PAG7936 — קצב הביטים של ה-CSI PHY מוגדר כעת, בשיפור פעולת אותו חיישן.
תיקוני באגים¶
מצלמה וחיישנים:
תוקן ה-IMU מעל I2C — לוחות המחווטים את ה-IMU מסוג LSM6DSx ב-I2C מאתחלים וקוראים כעת כראוי (נתיב ה-I2C השתמש בעבר בנתיב קריאה שבור ובקבועים שגויים).
אתחול FLIR Boson מנסה כעת עד 10 פעמים עבור חיישנים ישנים יותר (< IDD 4.x) שלוקח להם כ-10 שניות לעלות, והגדרות ברירת המחדל מהיצרן משוחזרות באיפוס כך שהגדרות שנטענו חיצונית אינן יכולות לשבור את פלט הווידאו.
תוקן ה-
psee_ehc_activate_overrideשל GenX320 שכתב זמן צבירה שגוי (אפס).בלוחות STM32 ללא חומרת FastMode+, בקשת מצב מהיר ב-I2C מוגנת כעת כראוי במקום להגדיר את אפיק התקשורת באופן שגוי בשקט.
למידת מכונה:
תוקנו איסוף התיבות התוחמות וטיפול ב-
np.nonzeroבמעבדי-הבתר של YOLOv2 / YOLOv5, בשיפור אמינות הזיהוי.
תמיכה בחומרה ובלוחות¶
OpenMV AE3 — לוח Alif Ensemble חדש (Cortex-M55 + Ethos-U55 NPU).
VL53L8CX — חיישן time-of-flight רב-אזורי בגודל 8x8; חיישן ה-ToF של ה-AE3 הוחלף מ-VL53L5CX ל-VL53L8CX.
STM32N6 — תשתית לפריסת מודלים של ST Edge AI (Neural-ART).
שינויי API שוברי תאימות¶
שבירות API גלויות למשתמש בין v4.6.20 ל-v4.7.0. היקף: מודולי C של Python ב-modules/ וספריות Python ב-scripts/libraries/.
כל שינוי מתויג לפי מידת השפעתו:
עיקרי — רוב הסקריפטים שהשתמשו בו זקוקים לעריכות.
מינורי — API צר; משפיע רק על סקריפטים שהשתמשו בו.
התנהגות — אותו API, תוצאות שונות; בדקו מחדש סקריפטים מכווננים.
השינויים מקובצים לפי השפעה בסדר זה. אם אתם רק רוצים להסב את הקוד שלכם, דלגו אל רשימת ההסבה בסוף לקבלת רשימת מטלות מתומצתת. כל גיבוב (hash) של קומיט מקושר ל-diff שלו ב-GitHub.
מודלים מובנים נטענים לפי נתיב, לא לפי שם (עיקרי)¶
ml.Model כבר אינו טוען מודל מובנה ממחרוזת שם פשוטה. מודלים נטענים כעת ממערכת הקבצים / ROMFS לפי נתיב:
model = ml.Model("/rom/person_detect.tflite") # was: ml.Model("person_detect")
התכונה model.labels בצד ה-C הוסרה; התוויות נטענות כעת על ידי עוטף ה-ml.Model של Python מקובץ נלווה <model>.txt (None אם נעדר). כל הדוגמאות המצורפות ו-ml/apps.py עודכנו לנתיבי /rom/*.tflite.
מפלי Haar נטענים מ-ROMFS (מינורי)¶
image.HaarCascade() טוען כעת מפלים מובנים דרך ה-VFS / ROMFS. קובץ מפל הפנים החזיתי שבברירת מחדל שונה שמו מ-haarcascade_frontalface_default.xml ל-haarcascade_frontalface.xml, וכישלון טעינה מעלה כעת RuntimeError (”Failed to load Haar cascade“) במקום OSError.
קומיט: 9de1220d8
סמנטיקת tof.reset() / tof.deinit() (התנהגות)¶
במודול ה-tof, reset() היה בעבר כינוי ל-init() ולא היה deinit אמיתי. tof.reset() מבצע כעת איפוס חיישן ממשי ו-tof.deinit() מכבה את החיישן כראוי (עם תמיכה בכיבוי VL53L5CX). קוד שהסתמך על כך ש-reset() מאתחל מחדש את החיישן צריך להיבדק מחדש.
מגבלות תזמון ומצב-אירועים ב-GenX320 (התנהגות)¶
רצף ה-ISSD החדש של GenX320 משנה את בסיס הזמן של החיישן: ארגומנטי קצב הפריימים והחשיפה מבוטאים כעת ביחידות של 1 MHz במקום להיות משוקללים לפי השעון, וההסתרה (blanking) של HSYNC מותאמת דינמית לקצב הפריימים המבוקש. סקריפטים שקיבעו ערכי תזמון של GenX320 חייבים לכוונם מחדש. צילום במצב-אירועים מעלה כעת שגיאה כאשר transpose של תמונה מופעל (הוא אינו נתמך בתצורה זו).
רשימת הסבה¶
להסבה נקייה ל-v4.7.0 העבודה האופיינית היא:
שנו את טעינת המודלים המובנים ממחרוזת שם לנתיב
/rom/<name>.tflite, וספקו תוויות דרך קובץ נלווה<name>.txt(שינוי ml.Model).עדכנו את
haarcascade_frontalface_default.xmlל-haarcascade_frontalface.xmlותפסוRuntimeError(לאOSError) בכישלון טעינת מפל (שינוי מפל ה-Haar).הסירו קוד שהסתמך על כך ש-
tof.reset()מאתחל מחדש את החיישן (שינוי ה-tof).כווננו מחדש כל ערכי קצב-פריימים / חשיפה מקובעים של GenX320 ליחידות של 1 MHz, ואל תפעילו transpose במצב-אירועים (שינוי ה-GenX320).