v4.8.0

v4.8.0 是一個重大功能釋出版本。重點包括:全新的基於類別的 csi 相機模組,支援多相機;搭載 Neural-ART NPU 的 OpenMV N6(STM32N6)開發板;NPU 推論後端;GenX320 事件相機 RAW 事件模式;全新的 crc 模組;重新整理過的 ML 後處理函式庫;以及 MicroPython 1.26。本版本也移除了一些舊版 API——buzzer 模組和 fir 模組的 FLIR Lepton 控制功能——因此請閱讀下方的破壞性變更。

重點摘要

  • 全新 csi 相機模組。 基於類別的 csi.CSI API,支援多台相機同時運作,與舊版 sensor 模組並存推出。

  • OpenMV N6。 STM32N6 開發板,搭載 Neural-ART NPU、三重緩衝、Soft-CSI 以及 ToF 模組。

  • NPU 推論。 用於硬體加速模型推論的 ST Neural-ART(STAI)後端。

  • GenX320 事件模式。 RAW 事件輸出,加上用於事件相機渲染的 draw_event_histogram()

  • 重新整理過的 ML 後處理——廠商子套件(ml.postprocessing.ultralyticsmediapipeedgeimpulsedarknet),加上全新的 BlazeFace / BlazePalm / 手部及臉部關鍵點偵測器。

  • 全新 crc 模組——硬體加速的 CRC-16 / CRC-32。

  • MicroPython 更新至 1.26.0。

  • 破壞性變更: buzzer 模組與 fir 模組的 Lepton 控制功能已移除(Lepton 現在是一般相機)。請參閱 fir/Lepton 變更buzzer 移除說明

新功能

  • 全新的 csi 相機模組——基於類別的 csi.CSI 物件,支援多台相機同時運作(N6 上最多三台)、非阻塞快照、自訂 (w, h) 影格大小,以及資訊豐富的 print() / repr。它與舊版 sensor 模組並存推出(並非直接替代品)。

  • crc——crc.crc16()crc.crc32(),在 OpenMV N6 與 AE3 上提供硬體加速並附帶軟體備援。

  • image.Image.draw_image() 新增了 transform= 關鍵字(一個用於仿射/透視扭曲的 2 維浮點 ndarray 矩陣,在 STM32 與 Alif 上以 GPU 加速);相同的轉換也可用於影像轉換。

  • draw_event_histogram()——渲染事件相機直方圖。

  • GenX320 RAW 事件模式——csi.IOCTL_GENX320_SET_MODE 搭配 csi.GENX320_MODE_HISTO / csi.GENX320_MODE_EVENTcsi.IOCTL_GENX320_READ_EVENTScsi.IOCTL_GENX320_CALIBRATE、事件類型常數,以及新的範例指令碼。

  • ML——一個 ST Neural-ART(STAI)NPU 推論後端;ml.Model 新增了 postprocess= 關鍵字(後處理器現在會在 predict() 內自動執行,即使沒有提供回呼函式);ml.postprocessing 重新整理為廠商子套件——ml.postprocessing.ultralyticsYoloV5YoloV8)、ml.postprocessing.darknetYoloV2YoloLC)、ml.postprocessing.edgeimpulseFomo),以及 ml.postprocessing.mediapipeBlazeFaceBlazePalmHandLandmarksFaceLandmarks)——舊的 snake_case 名稱仍保留為別名;新增了 ml.utils.draw_keypoints()ml.utils.draw_skeleton();隨附的 ROMFS 模型也增加了(BlazeFace、YOLO-LC、YOLOv8n、手掌/手部/臉部關鍵點)。

  • audio——STM32N6 上的 MDF 數位麥克風輸入。

  • 顯示——SSD1351 OLED 驅動程式與範例;SPIDisplay 控制器可覆寫其初始化命令;SPI 顯示器建構子新增了 hmirror / vflip 關鍵字。

  • 裝置端分析器——SysTick + Armv8.1-M PMU 週期/事件計數器,具備函式層級的儀器化,可透過除錯連結讀取(pyopenmv 新增了分析與 ELF 符號支援)。

  • 新感測器支援——PixArt PS5520;OpenMV H7 Plus 上的 FLIR BOSON;GenX320 自動偵測。

其他變更與改進

  • MicroPython 更新至 1.26.0。

  • 相機啟動——感測器時脈已與 CSI 狀態解耦,開機時的相機偵測更快(會先嘗試最常見的設定),且 OpenMV 3 OV7725 的預設時脈已修正。

  • 影像品質——軟體 ISP 伽瑪校正(Alif 與 STM32)與壞點校正(STM32)預設啟用;PAG7936 與 PS5520 感測器新增了自動白平衡控制。

  • 效能——image.Image.to_ndarray() 以 Helium SIMD 加速,且 FOMO 後處理器已使用 ulab 向量化。

  • FLIR Lepton 驅動程式重寫,可在背景非同步接收影格——旋轉/transpose 現在可運作、繪製時以雙線性方式放大、重置也更快。

  • 擷取吞吐量——i.MX RT1062 CSI 現在使用完整的 DMA 卸載,且 STM32 N6 具備硬體 GPU 的 draw_image()

錯誤修正

相機與感測器:

  • 修正了 STM32 感測器、OpenMV H7 / H7 Plus 上的 PAJ6100、OpenMV 2 QVGA RGB565,以及 N6 CSI mono / RGB-YUV 設定中的 RGB565 / GRAYSCALE / BAYER / YUV422 模式;軟體測試相機現在會以確定性的方式重置。

  • 自動白平衡在低或變動影格率下不再使影像偏綠(以 250 毫秒移動平均取代每 100 影格取樣一次),且 PS5520 的亮度閃爍問題已修正。

影像處理:

  • 修正了一個畫線渲染瑕疵;image.Image.flush() 現在會清空其所呼叫影像的 JPEG 緩衝區;Normalization 現在會對浮點輸入套用平均值/標準差;從檔案載入影像的配置問題已修正。

相機擷取:

  • 修正了非 JPEG 傳輸時嚴重的影像損毀問題(影格中斷現在僅在 JPEG 模式下啟用)、JPEG 模式 3 支援,以及 STM32 上的 DMA 行大小與小緩衝區鎖死問題;VOSPI / Lepton 同步更為可靠,尤其在 N6 上。

其他:

  • omv.board_id() 在 RT1060 上會回傳正確的 UID;YoloV2 在未提供明確 anchors 而建構時不再當機。

硬體與開發板支援

  • OpenMV N6——STM32N6,搭載 Neural-ART NPU、三重緩衝、SPI LCD/TV 輸出、Soft-CSI、tof 模組,以及隨附的 ROMFS 模型。

  • Arduino GIGA——MIPI DSI 顯示輸出。

  • 新感測器——PixArt PS5520;OpenMV H7 Plus 上的 FLIR BOSON;GenX320 自動偵測。

  • OpenMV Pure Thermal——FLIR Lepton 現在是一般(次要)相機感測器。

  • Alif AE3——軟體 ISP 伽瑪校正、crc 模組,以及 SPI 修正。

破壞性 API 變更

v4.7.0 與 v4.8.0 之間使用者可見的 API 破壞性變更。範圍:modules/ 中的 Python C 模組與 scripts/libraries/ 中的 Python 函式庫。

每項變更都標記了其影響程度:

  • major——大多數使用到它的指令碼都需要修改。

  • minor——窄範圍 API;僅影響使用到它的指令碼。

  • behavior——相同 API,不同結果;請重新檢查調校過的指令碼。

  • tooling——僅影響主機工具/從原始碼建置。

變更依影響程度按該順序分組——先是 major,接著 minorbehaviortooling。如果你只想移植你的程式碼,可直接跳到結尾的 移植檢查清單,那裡有精簡的待辦清單。每個提交雜湊都連結至其在 GitHub 上的 diff。

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 範例已改寫為新 API。非 Lepton 的 fir 感測器(Grid-EYE、MLX、AMG8833)維持不變。

提交: bacfb7aeb117710566592a229021a614202e

buzzer 模組已移除 (minor)

buzzer 模組已從 STM32 與 i.MX RT 移植版本中移除。請改用 machine.PWM 來驅動蜂鳴器;本版本新增了一個使用 PWM 的 Pure Thermal 蜂鳴器範例。

提交: ccb947924444120f2d

omv.disable_fb() 已移除 (minor)

omv.disable_fb() 函式已移除;影格緩衝區串流現在透過相機 API 控制。依賴它的舊版 RPC 桌面指令碼也一併移除。

提交: 84c3db58a6fe99051c

csi 是新模組——其 API 尚未凍結 (minor)

csi 模組在 v4.8.0 中推出,其 API 在釋出過程中有所演進:csi.fb() 已移除,且 csi.CSI.snapshot()(image=...) 現在需要一個可變影像,並會將擷取到的影格繪製/縮放到其中,而非進行原始的深層複製。新模組的早期採用者應重新測試;舊版 sensor API 不受影響。

提交: 0bc0385eb8cd7a309f

image.ImageIO 串流模式與 close() (minor)

image.ImageIO——mode 引數現在僅接受小寫的 'r' / 'w'(大寫會被拒絕並顯示更新後的錯誤訊息),且以 'w' 開啟時一律會截斷/重新建立檔案,而非保留現有串流。ImageIO.close() 現在是冪等的(關閉已關閉的串流不再引發例外),並回傳 None 而非串流物件。

提交: 715c4cbba21ceec422

BlazeFace / BlazePalm 回傳值 (minor)

BlazeFaceBlazePalm 後處理器(本版本新增)現在回傳單一邊界框清單,而非完整的逐類別清單——呼叫端直接對結果進行索引,而非使用 [0]

提交: 75e16b573

ML 後處理器回呼函式接收原始張量 (behavior)

ml.Modelpredict() 後處理回呼函式現在會接收原始(量化)的輸出張量參考,而非預先轉換的浮點 ndarray——這可避免大型模型上的記憶體耗盡。如果未提供回呼函式,仍會回傳浮點 ndarray。自訂回呼函式必須自行反量化張量(內建的後處理器已會這麼做)。

提交: 84e6ee650

相機時脈與 CSI 狀態解耦 (behavior)

感測器時脈現在獨立於 CSI 狀態。set_clock / set_frequency 僅在所請求的頻率差異超過容許值時才會重新設定時脈,且 get_clk_frequency 接受一個布林值以回傳精確(而非標稱)頻率。OpenMV N6 與 AE3 上的預設時脈為 24 MHz,因此開機時不需要明確的 set_clock()。為了時序敏感的擷取而切換時脈的指令碼,應重新檢查其假設。

提交: 2040a0a0009c0052df66ade9aea7e0a251bce6f43f3ca

USB 除錯協定與韌體目標 (tooling)

這些都不影響 MicroPython 指令碼。過時的 USBDBG 命令(SCRIPT_SAVETEMPLATE_SAVEDESCRIPTOR_SAVEATTR_READATTR_WRITETX_INPUTSET_TIME)已移除,且來自較舊 IDE 的不支援命令現在會被清除,而非在連線時讓 TinyUSB 開發板當機;舊版 STM32 UVC 韌體目標已移除。舊的主機工具應更新;詳情請參閱 韌體儲存庫 的歷史記錄。

提交: 90bd11e93657c9a63235182f035

移植檢查清單

若要乾淨地移植到 v4.8.0,典型的工作如下:

  1. 如果你透過 fir 使用 FLIR Lepton,請改為將它當作相機感測器來擷取(fir/Lepton 變更)。

  2. 將任何 buzzer 的使用替換為 machine.PWMbuzzer 移除說明)。

  3. 移除 omv.disable_fb() 呼叫(omv.disable_fb() 移除說明)。

  4. 對於 image.ImageIO:使用小寫的 'r'/'w',並預期 'w' 會截斷檔案(ImageIO 變更)。

  5. 對於自訂的 ML 後處理回呼函式:自行反量化原始張量參考,或依賴預設的浮點路徑(回呼函式變更)。

  6. 重新檢查任何為了時序敏感擷取而驅動感測器時脈的指令碼(時脈變更)。