7.6. predict 剖析

Model.predict(inputs, *, callback=None) 是已載入的模型物件實際執行工作的地方。在輸入進入與結果輸出之間,會依序執行三個階段:前處理引擎派送後處理。三者之中有兩者接受指令碼直接控制的參數;中間的引擎則由相機決定。

由左至右五個相連方框的水平流程。最左邊是「影像輸入」;一個箭頭指向 副標題為「正規化」的「前處理」;一個箭頭指向 副標題為「TFLM / STAI」的「引擎」;一個箭頭指向 副標題為「postprocess=」的「後處理」;最後一個 箭頭指向「結果」。中間三個階段下方各帶有一個 標記 -- 「前處理」下方為「使用者可控制」、 「引擎」下方為「自動」、「後處理」下方為「使用者可控制」。

predict() 的三個階段。前處理與後處理接受指令碼控制的參數;中間的引擎由相機固定。

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 下的型錄中挑選。中間的引擎由建置決定,且無論指令碼要求什麼,它都以相同方式執行。