7.6. predict 剖析¶
Model.predict(inputs, *, callback=None) 是已載入的模型物件實際執行工作的地方。在輸入進入與結果輸出之間,會依序執行三個階段:前處理、引擎派送、後處理。三者之中有兩者接受指令碼直接控制的參數;中間的引擎則由相機決定。
7.6.1. 前處理¶
前處理階段會將每個輸入轉換為網路所預期的密集張量。最常見的輸入是以 RGB565 擷取的 image.Image。此階段會將其裁切並調整大小至網路的 input_shape、從 RGB565 轉換為網路訓練時所採用的通道格式(大多數視覺網路為 RGB888)、套用各通道的縮放與偏移,並 -- 當網路預期整數輸入時 -- 在同一道流程中量化為模型的 input_dtype。針對浮點輸入訓練的網路會跳過量化步驟,直接接收縮放與偏移後的結果。
預設的 ml.preprocessing.Normalization 會讀取模型的輸入 dtype 並自動執行正確的轉換。手動調校的 Normalization 會覆寫縮放、平均值與標準差,以用於針對自訂通道統計量訓練的模型(衍生自 ImageNet 的平均值與標準差是常見的情況)。一個普通的可呼叫物件則會完全覆寫此階段 -- 當輸入根本不是影像,或應用程式本身已產生密集張量時很有用。
7.6.2. 引擎派送¶
引擎階段會執行網路。它派送到哪個引擎由相機固定:H7 與 RT1062 執行 TFLM(TensorFlow Lite for Microcontrollers 直譯器,在存在 ARM 最佳化 CMSIS-NN 核心之處派送它們);AE3 執行相同的 TFLM 直譯器搭配其 Cortex-M55 後備方案,並由 Ethos-U NPU 處理離線 Vela 編譯器標記給加速器的任何運算子;N6 執行 STAI,即 ST 為 N6 專用 NPU 所打造的執行階段。
指令碼不會挑選引擎。相機隨附的引擎會執行相機所載入的每個模型。
7.6.3. 後處理¶
後處理階段會將網路的原始輸出張量轉換回可用的結果。預設行為是將每個輸出張量還原量化(dequantize)為浮點數(或對於具有浮點輸出的網路則原樣傳遞),並將它們以 ndarray 物件列表的形式回傳。大多數應用程式會註冊一個後處理器 -- 一個了解網路輸出佈局的可呼叫物件 -- 來將張量解碼為應用程式所依據的結果形式:邊界框列表、關鍵點列表、類別列表。
指令碼以兩種方式控制此階段。建構子上的 postprocess= 關鍵字會註冊一個在每次呼叫時都執行的後處理器。predict() 上的 callback= 關鍵字則僅就單次呼叫覆寫已註冊的後處理器 -- 在無需重新載入模型的情況下於數個解碼器之間切換時很有用。任一形式都會接收 (model, inputs, outputs) 並回傳應用程式所預期的任何內容。
7.6.4. 指令碼所控制的部分¶
前處理與後處理是指令碼的兩個操作把手。預設的前處理器能處理大多數視覺模型;針對特定網路族系的正確後處理器則從 ml.postprocessing 下的型錄中挑選。中間的引擎由建置決定,且無論指令碼要求什麼,它都以相同方式執行。