7.16. 總結¶
本章逐一介紹了當推論步驟成為處理流程的一環時,OpenMV 應用程式會用到的 ml 各個部分:
概念 -- 從算術角度說明神經網路是什麼(一疊可訓練的運算子,將張量映射為張量)、機器學習相較於傳統影像處理改變了什麼(人工撰寫的概括演算法不見了,取而代之的是從標記資料學習而來的權重),以及只用寥寥數行 Python 就執行人臉偵測器的 hello 範例。
ml 模組 --
ml.Model物件及其用於檢視輸入與輸出張量的屬性、它所接受的模型檔路徑,以及這些檔案存放的位置:可直接從快閃記憶體執行的唯讀 ROMFS 分割區,或任何其他 MicroPython 檔案系統(此時模型會在載入時複製到 RAM 中)。推論流程 --
predict()依序執行的三個階段(前處理、引擎分派、後處理)、作用於第一階段的Normalization控制代碼、作用於第三階段的後處理器控制代碼,以及將相機所執行的整數張量與網路訓練時所用的實數值連繫起來的量化運算。推論引擎 -- TFLM(多數相機所使用的運算子直譯器)、CMSIS-NN(在 Cortex-M 上支撐它的 SIMD 核心函式庫),以及 NPU(AE3 上的 Arm Ethos-U55 搭配 Vela 離線編譯器、N6 上的 ST Neural-ART 搭配 STAI 與 STEdgeAI)。引擎由相機決定;指令碼無法選擇。
解碼輸出 -- 將原始輸出張量轉換為邊界框、關鍵點或各類別清單的後處理器、用於合併重疊候選的
NMS類別、示範如何在反量化前先做閾值處理以保持解碼快速的 YOLOv8 範例導覽,以及當目錄未涵蓋某個模型時撰寫自訂解碼器所遵循的協定。
7.16.1. 現在可以做到的事¶
本章為以下三件事打下基礎:
載入並執行已訓練的模型。
/rom/中的任何東西都無需進一步準備即可使用;任何以相容的.tflite形式於外部提供的模型,在針對目標相機的離線工具(AE3 用 Vela、N6 用 STEdgeAI)產生正確的版面配置後即可使用。解碼任何輸出張量。 當該架構在目錄中時,選用正確的後處理器是固定流程:YOLOv8 模型用
YoloV8、BlazeFace 用BlazeFace,依此類推。當它不在目錄中時,writing-your-own 協定涵蓋了相關約定,而 YOLOv8 範例導覽 則是最易於參照與仿照的範例。推論效能的判斷。 在 NPU 上以 30 FPS 執行的模型,在 Cortex-M7 上可能只跑 3 FPS;此比例取決於相機能將網路的多少部分從 CPU 卸載出去。量化、ROMFS 放置位置、NPU 編譯,以及目標引擎的運算子涵蓋範圍是四個調控槓桿,本章逐一介紹了它們。
7.16.2. ML 與相機其餘部分的組合運用¶
推論很少獨立執行。image 模組擷取並前處理影格、ml 模組執行網路,而 ulab.numpy 則負責任一方都沒有內建功能可處理的數值運算。一個典型的偵測指令碼結合了這三者:以 csi 擷取、視需要以 image 調整影格、執行 predict()、以 ml.postprocessing 中合適的模組對結果做後處理,並針對應用程式想在後處理器所回傳的邊界框之上進行的任何自訂運算動用 ulab.numpy。這三個模組共用相同的記憶體模型;只要可能,它們之間的邊界都是零複製的。