7.6. predictの解剖

Model.predict(inputs, *, callback=None) は、読み込まれたモデルオブジェクトが実際に作業を行う場所です。入力が入ってから結果が出てくるまでの間に、3つの段階が順番に実行されます。前処理エンジンディスパッチ後処理です。3つのうち2つはスクリプトが直接制御するパラメータを受け取ります。中間のエンジンはカメラによって決定されます。

左から右へ5つの連結したボックスが水平に流れる図。最も左は「画像入力」で、矢印が「正規化」という副題の付いた「前処理」へ続き、矢印が「TFLM / STAI」という副題の付いた「エンジン」へ続き、矢印が「postprocess=」という副題の付いた「後処理」へ続き、最後の矢印が「結果」へ続きます。中間の3段階はその下にタグを持ちます -- 前処理の下には「ユーザー制御可能」、エンジンの下には「自動」、後処理の下には「ユーザー制御可能」です。

predict() の3つの段階。前処理と後処理はスクリプトが制御するパラメータを受け取ります。中間のエンジンはカメラによって固定されています。

7.6.1. 前処理

前処理段階は、各入力をネットワークが期待する密なテンサーに変換します。最も一般的な入力は、RGB565でキャプチャされた image.Image です。この段階は画像をネットワークの input_shape に切り抜いてリサイズし、RGB565からネットワークが学習されたチャンネル形式(ほとんどのビジョンネットワークではRGB888)に変換し、チャンネルごとのスケールとオフセットを適用し、ネットワークが整数入力を期待する場合は同じパスでモデルの input_dtype に量子化します。float入力向けに学習されたネットワークは量子化ステップをスキップし、スケールとオフセットの結果を直接受け取ります。

デフォルトの ml.preprocessing.Normalization はモデルの入力dtypeを読み取り、適切な変換を自動的に実行します。手動で調整された Normalization は、カスタムチャンネル統計に対して学習されたモデル(ImageNet由来の平均と標準偏差が一般的なケースです)のために、スケール、平均、標準偏差の値を上書きします。単純な呼び出し可能オブジェクトはこの段階を完全に上書きします -- 入力が画像でない場合や、アプリケーションが既に密なテンサーを自前で生成済みの場合に便利です。

7.6.2. エンジンディスパッチ

エンジン段階はネットワークを実行します。どのエンジンにディスパッチするかはカメラによって固定されています。H7とRT1062はTFLM(TensorFlow Lite for Microcontrollersインタープリタで、存在する場合はARM最適化されたCMSIS-NNカーネルにディスパッチします)を実行します。AE3はCortex-M55フォールバックを備えた同じTFLMインタープリタを実行し、オフラインのVelaコンパイラがアクセラレータ用にタグ付けした任意のオペレータをEthos-U NPUが処理します。N6はSTAI、N6専用設計のNPU向けのSTのランタイムを実行します。

スクリプトはエンジンを選択しません。カメラに同梱されているエンジンが、カメラが読み込むすべてのモデルを実行します。

7.6.3. 後処理

後処理段階は、ネットワークの生の出力テンサーを使用可能な結果に戻します。デフォルトの動作は、各出力テンサーを浮動小数点に逆量子化し(float出力のネットワークの場合は変更せずに通過させ)、それらを ndarray オブジェクトのリストとして返すことです。ほとんどのアプリケーションはポストプロセッサ(ネットワークの出力レイアウトを知っている呼び出し可能オブジェクト)を登録して、テンサーをアプリケーションが処理する結果形式にデコードします。バウンディングボックスのリスト、キーポイントのリスト、クラスのリストなどです。

スクリプトはこの段階を2つの方法で制御します。コンストラクタの postprocess= キーワードは、すべての呼び出しで実行されるポストプロセッサを登録します。predict()callback= キーワードは、1回の呼び出しに限り登録されたポストプロセッサを上書きします -- モデルを再読み込みせずに複数のデコーダを切り替えるのに便利です。どちらの形式も (model, inputs, outputs) を受け取り、アプリケーションが期待するものを返します。

7.6.4. スクリプトが制御するもの

前処理と後処理はスクリプトの2つのハンドルです。デフォルトの前処理器はほとんどのビジョンモデルを処理します。特定のネットワークファミリーに適したポストプロセッサは、ml.postprocessing 下のカタログから選ばれます。中間のエンジンはビルドによって決定され、スクリプトが何を要求しようと同じ方法で実行されます。