v4.8.0

v4.8.0 היא גרסה מרכזית עתירת מאפיינים. בראש הרשימה: מודול מצלמה csi חדש לחלוטין מבוסס-מחלקות עם תמיכה במספר מצלמות, לוח OpenMV N6 (STM32N6) עם NPU מסוג Neural-ART, מנגנון הסקה (inference) מבוסס NPU, מצב אירועים RAW של מצלמת האירועים GenX320, מודול crc חדש, ספריית עיבוד-לאחר (post-processing) של ML שאורגנה מחדש, ו-MicroPython 1.26. כמו כן היא מסירה מספר ממשקי API ישנים — מודול ה-buzzer ושליטת ה-FLIR Lepton של מודול fir — אז קראו את השינויים שוברי-התאימות שלהלן.

עיקרי הדברים

  • מודול מצלמה csi חדש. ממשק csi.CSI מבוסס-מחלקות עם תמיכה בכמה מצלמות בו-זמנית, שהוצג לצד מודול ה-sensor הישן.

  • OpenMV N6. לוח STM32N6, עם NPU מסוג Neural-ART, חציצה משולשת (triple buffering), Soft-CSI ומודול ToF.

  • הסקה (inference) על NPU. מנגנון אחורי של ST Neural-ART (STAI) להסקת מודלים מואצת-חומרה.

  • מצב אירועים של GenX320. פלט אירועים RAW בתוספת draw_event_histogram() להצגה של מצלמת אירועים.

  • עיבוד-לאחר (post-processing) של ML שאורגן מחדש — תת-חבילות לפי ספק (ml.postprocessing.ultralytics, mediapipe, edgeimpulse, darknet) עם מזהי BlazeFace / BlazePalm חדשים ומזהי נקודות-ציון של כפות ידיים ופנים.

  • מודול crc חדש — CRC-16 / CRC-32 מואצי-חומרה.

  • MicroPython עודכן ל-1.26.0.

  • שובר-תאימות: מודול ה-buzzer ושליטת ה-Lepton של מודול ה-fir הוסרו (ה-Lepton הוא כעת מצלמה רגילה). ראו את שינוי ה-fir/Lepton ואת הסרת ה-buzzer.

מאפיינים חדשים

  • מודול המצלמה csi החדש — אובייקט csi.CSI מבוסס-מחלקות עם מספר מצלמות בו-זמנית (עד שלוש ב-N6), תמונת בזק (snapshot) לא-חוסמת, גדלי פריים מותאמים (w, h), ו-print() / repr אינפורמטיבי. הוא הוצג לצד מודול ה-sensor הישן (ואינו תחליף ישיר לו).

  • crccrc.crc16() ו-crc.crc32(), מואצי-חומרה עם נפילה-לאחור (fallback) תוכנתית, ב-OpenMV N6 וב-AE3.

  • image.Image.draw_image() קיבל מילת-מפתח transform= (מטריצת ndarray דו-ממדית של float לעיוותי affine/perspective, מואצי-GPU ב-STM32 וב-Alif); אותו transform זמין גם בהמרת תמונות.

  • draw_event_histogram() — הצגת היסטוגרמות של מצלמת אירועים.

  • מצב אירועים RAW של GenX320csi.IOCTL_GENX320_SET_MODE עם csi.GENX320_MODE_HISTO / csi.GENX320_MODE_EVENT, csi.IOCTL_GENX320_READ_EVENTS, csi.IOCTL_GENX320_CALIBRATE, קבועי סוגי-אירועים, וסקריפטים לדוגמה חדשים.

  • ML — מנגנון אחורי להסקה (inference) של NPU מסוג ST Neural-ART (STAI); ml.Model קיבל מילת-מפתח postprocess= (מעבד-העיבוד-לאחר רץ כעת אוטומטית בתוך predict() גם ללא פונקציית callback); ml.postprocessing אורגן מחדש לתת-חבילות לפי ספק — ml.postprocessing.ultralytics (YoloV5, YoloV8), ml.postprocessing.darknet (YoloV2, YoloLC), ml.postprocessing.edgeimpulse (Fomo), ו-ml.postprocessing.mediapipe (BlazeFace, BlazePalm, HandLandmarks, FaceLandmarks) — השמות הישנים ב-snake_case נשמרו ככינויים; נוספו ml.utils.draw_keypoints() ו-ml.utils.draw_skeleton(); מודלי ה-ROMFS המצורפים גדלו (BlazeFace, YOLO-LC, YOLOv8n, נקודות-ציון של כפות ידיים/ידיים/פנים).

  • audio — קלט מיקרופון-דיגיטלי MDF ב-STM32N6.

  • תצוגה — דרייבר OLED מסוג SSD1351 ודוגמה; בקרי SPIDisplay יכולים לדרוס את פקודות האתחול שלהם; בנאי תצוגת ה-SPI קיבל מילות-מפתח hmirror / vflip.

  • מנתח ביצועים (profiler) על-גבי המכשיר — מוני מחזורים/אירועים של SysTick + Armv8.1-M PMU עם אינסטרומנטציה ברמת הפונקציה, הניתנים לקריאה דרך קישור הניפוי (pyopenmv קיבל תמיכה בניתוח ביצועים ובסמלי ELF).

  • תמיכה בחיישנים חדשים — PixArt PS5520; FLIR BOSON ב-OpenMV H7 Plus; זיהוי-אוטומטי של GenX320.

שינויים ושיפורים נוספים

  • MicroPython עודכן ל-1.26.0.

  • הפעלת מצלמה — שעון החיישן נותק ממצב ה-CSI, זיהוי המצלמה באתחול מהיר יותר (התצורה הנפוצה ביותר נבדקת ראשונה), ושעון ברירת-המחדל של OV7725 ב-OpenMV 3 תוקן.

  • איכות תמונה — תיקון gamma של ISP תוכנתי (Alif ו-STM32) ותיקון פיקסלים-פגומים (STM32) פעילים כברירת מחדל; חיישני PAG7936 ו-PS5520 קיבלו בקרות איזון-לבן אוטומטי.

  • ביצועיםimage.Image.to_ndarray() מואץ באמצעות Helium SIMD ומעבד-העיבוד-לאחר של FOMO עבר וקטוריזציה עם ulab.

  • דרייבר ה-FLIR Lepton נכתב מחדש כך שיקבל פריימים אסינכרונית ברקע — סיבוב/transpose עובד כעת, הציור מבצע הגדלה בילינארית, והאיפוס מהיר יותר.

  • תפוקת לכידה — ה-CSI של i.MX RT1062 משתמש כעת בהאצת DMA מלאה, ול-STM32 N6 יש draw_image() עם האצת-GPU חומרתית.

תיקוני באגים

מצלמה וחיישנים:

  • תוקנו מצבי RGB565 / GRAYSCALE / BAYER / YUV422 בחיישני STM32, PAJ6100 ב-OpenMV H7 / H7 Plus, OpenMV 2 QVGA RGB565, ותצורת ה-CSI mono / RGB-YUV של ה-N6; מצלמת הבדיקה התוכנתית מתאפסת כעת באופן דטרמיניסטי.

  • איזון-לבן אוטומטי כבר אינו צובע את התמונה בירוק בקצבי פריים נמוכים או משתנים (ממוצע נע של 250 אלפיות-שנייה מחליף את הדגימה כל-100-פריימים), והבהוב הבהירות של PS5520 תוקן.

עיבוד תמונה:

  • תוקנה תקלת רינדור של ציור-קו; image.Image.flush() מרוקנת כעת את חוצץ (buffer) ה-JPEG של התמונה שעליה היא נקראה; Normalization מיישמת כעת ממוצע/סטיית-תקן על קלטי float; הקצאת תמונה-מקובץ תוקנה.

לכידת מצלמה:

  • תוקן שיבוש תמונה חמור בהעברות שאינן JPEG (פסיקת הפריים מופעלת כעת רק במצב JPEG), תמיכה ב-JPEG mode-3, ונעילות של גודל-קו DMA וחוצץ-קטן ב-STM32; סנכרון VOSPI / Lepton אמין יותר, בייחוד ב-N6.

שונות:

  • omv.board_id() מחזיר את ה-UID הנכון ב-RT1060; YoloV2 כבר אינו קורס כשהוא נבנה ללא עוגנים (anchors) מפורשים.

תמיכת חומרה ולוחות

  • OpenMV N6 — STM32N6 עם NPU מסוג Neural-ART, חציצה משולשת (triple buffering), פלט SPI LCD/TV, Soft-CSI, מודול tof, ומודלי ROMFS מצורפים.

  • Arduino GIGA — פלט תצוגה MIPI DSI.

  • חיישנים חדשים — PixArt PS5520; FLIR BOSON ב-OpenMV H7 Plus; זיהוי-אוטומטי של GenX320.

  • OpenMV Pure Thermal — ה-FLIR Lepton הוא כעת חיישן מצלמה רגיל (משני).

  • Alif AE3 — תיקון gamma של ISP תוכנתי, מודול crc, ותיקוני SPI.

שינויים שוברי-תאימות ב-API

שינויי API גלויים-למשתמש בין v4.7.0 ל-v4.8.0. היקף: מודולי C של Python ב-modules/ וספריות Python ב-scripts/libraries/.

כל שינוי מתויג לפי השפעתו:

  • major — רוב הסקריפטים שהשתמשו בו זקוקים לעריכות.

  • minor — API צר; משפיע רק על סקריפטים שהשתמשו בו.

  • behavior — אותו API, תוצאות שונות; בדקו מחדש סקריפטים מכווננים.

  • tooling — משפיע רק על כלי-מארח / בנייה מהמקור.

השינויים מקובצים לפי השפעה בסדר הזה — major תחילה, ואז minor, behavior, ו-tooling. אם אתם רק רוצים לפורט את הקוד שלכם, דלגו לרשימת ההגירה בסוף כדי לקבל רשימת מטלות מתומצתת. כל hash של commit מקושר ל-diff שלו ב-GitHub.

FLIR Lepton הועבר מחוץ למודול ה-fir (major)

ה-FLIR Lepton מונע כעת כחיישן מצלמה רגיל במקום דרך מודול ה-fir. שליטת ה-Lepton הוסרה מ-fir: הסוג FIR_LEPTON והמתודות radiometric(), register_vsync_cb(), register_frame_cb(), get_frame_available(), ו-trigger_ffc() נעלמו. לכדו את ה-Lepton כמו כל מצלמה אחרת (הוא מופיע כחיישן משני ב-OpenMV Pure Thermal); דוגמת ה-Pure Thermal נכתבה מחדש לממשק החדש. חיישני ה-fir שאינם Lepton (Grid-EYE, MLX, AMG8833) ללא שינוי.

Commits: bacfb7aeb, 117710566, 592a22902, 1a614202e

מודול ה-buzzer הוסר (minor)

מודול ה-buzzer הוסר מהפורטים של STM32 ו-i.MX RT. הניעו את הזמזם באמצעות machine.PWM במקום; נוספה דוגמת זמזם ל-Pure Thermal המשתמשת ב-PWM.

Commits: ccb947924, 444120f2d

omv.disable_fb() הוסר (minor)

הפונקציה omv.disable_fb() הוסרה; הזרמת חוצץ-הפריימים (frame buffer) נשלטת כעת דרך ממשק המצלמה. סקריפטי ה-RPC הישנים למחשב שהסתמכו עליה הוסרו אף הם.

Commits: 84c3db58a, 6fe99051c

csi חדש — ה-API שלו עדיין אינו מוקפא (minor)

מודול ה-csi הוצג ב-v4.8.0 וה-API שלו התפתח במהלך הגרסה: csi.fb() הוסר, ו-csi.CSI.snapshot() (image=...) דורש כעת תמונה ניתנת-לשינוי ומצייר/מקנה-מידה את הפריים הנלכד לתוכה במקום לבצע העתקה-עמוקה גולמית. מאמצים מוקדמים של המודול החדש צריכים לבדוק מחדש; ה-API הישן של sensor אינו מושפע.

Commits: 0bc0385eb, 8cd7a309f

מצב הזרמה של image.ImageIO ו-close() (minor)

image.ImageIO — הארגומנט mode מקבל כעת רק אותיות קטנות 'r' / 'w' (אות גדולה נדחית עם הודעת שגיאה מעודכנת), ופתיחה עם 'w' תמיד מקצרת/יוצרת-מחדש את הקובץ במקום לשמר זרם קיים. ImageIO.close() הוא כעת אידמפוטנטי (סגירת זרם שכבר נסגר אינה מעלה עוד חריגה) ומחזיר None במקום את אובייקט הזרם.

Commits: 715c4cbba, 21ceec422

ערך ההחזרה של BlazeFace / BlazePalm (minor)

מעבדי-העיבוד-לאחר BlazeFace ו-BlazePalm (חדשים בגרסה זו) מחזירים כעת רשימת תיבות-תוחמות יחידה במקום הרשימה המלאה לפי-מחלקה — הקוראים מאנדקסים את התוצאה ישירות במקום [0].

Commit: 75e16b573

פונקציית ה-callback של עיבוד-לאחר של ML מקבלת טנזורים גולמיים (behavior)

פונקציית callback של עיבוד-לאחר ב-predict() של ml.Model מקבלת כעת הפניות לטנזור-הפלט הגולמי (המכומת) במקום ndarray של float שהומר מראש — זה מונע מיצוי זיכרון במודלים גדולים. אם לא סופקה פונקציית callback, ה-ndarray של float עדיין מוחזר. פונקציות callback מותאמות חייבות לבטל את הכימות (dequantize) של הטנזורים בעצמן (מעבדי-העיבוד-לאחר המובנים כבר עושים זאת).

Commit: 84e6ee650

שעון המצלמה נותק ממצב ה-CSI (behavior)

שעון החיישן בלתי-תלוי כעת במצב ה-CSI. set_clock / set_frequency מגדירים מחדש את השעון רק כאשר התדר המבוקש שונה ביותר מסבולת מסוימת, ו-get_clk_frequency מקבל ערך בוליאני כדי להחזיר את התדר המדויק (ולא הנקוב). שעון ברירת-המחדל הוא 24 MHz ב-OpenMV N6 וב-AE3, כך שאין צורך ב-set_clock() מפורש באתחול. סקריפטים שהחליפו את השעון ללכידות רגישות-תזמון צריכים לבדוק מחדש את ההנחות שלהם.

Commits: 2040a0a00, 09c0052df, 66ade9aea, 7e0a251bc, e6f43f3ca

פרוטוקול ניפוי USB ויעדי קושחה (tooling)

שום דבר מזה אינו משפיע על סקריפטי MicroPython. פקודות USBDBG מיושנות (SCRIPT_SAVE, TEMPLATE_SAVE, DESCRIPTOR_SAVE, ATTR_READ, ATTR_WRITE, TX_INPUT, SET_TIME) הוסרו ופקודות לא-נתמכות מ-IDEs ישנים יותר נשטפות כעת במקום להקריס לוחות TinyUSB בחיבור; יעד קושחת ה-UVC הישן של STM32 הוסר. כלי-מארח ישנים צריכים להתעדכן; ראו את ההיסטוריה של מאגר הקושחה לפרטים.

Commits: 90bd11e93, 657c9a632, 35182f035

רשימת הגירה

לפורט נקי ל-v4.8.0, העבודה האופיינית היא:

  1. אם השתמשתם ב-FLIR Lepton דרך fir, עברו ללכוד אותו כחיישן מצלמה (שינוי ה-fir/Lepton).

  2. החליפו כל שימוש ב-buzzer ב-machine.PWM (הסרת ה-buzzer).

  3. הסירו קריאות omv.disable_fb() (הסרת ה-omv.disable_fb()).

  4. עבור image.ImageIO: השתמשו באותיות קטנות 'r'/'w' וצפו ש-'w' יקצר (שינוי ה-ImageIO).

  5. עבור פונקציות callback מותאמות של עיבוד-לאחר של ML: בטלו את הכימות (dequantize) של הפניות הטנזור הגולמי בעצמכם, או הסתמכו על נתיב ה-float של ברירת-המחדל (שינוי ה-callback).

  6. בדקו מחדש כל סקריפט שהניע את שעון החיישן ללכידות רגישות-תזמון (שינוי השעון).