推論前に画像を前処理する
| 項目 | 値 |
|---|---|
| カテゴリ | モデルと推論 |
| 難易度 | 中級 |
| 推定所要時間 | 15-20 minutes |
| ラベル | preprocessing, normalization, image |
コンパイルされたモデルは、特定の形状と値の範囲で入力されることを想定しています。つまり、固定された色の順序、固定された次元、および学習時に使用された正規化のレシピです。前処理は、生 のデコードされた画像を目的のテンソルに変換する段階です。これを間違えると、モデルは実行されますが、信頼性の低い無意味な結果を返すだけです。そのため、デプロイされたモデルが「壊れている」ように見える場合は、まず前処理を確認する必要があります。
この章では、最も頻繁に使用する前処理の制御(色の形式、入力/出力の次元、リサイズ動作、およびチャネルごとのmean/stddev正規化)を設定し、次に、完全なモデルに単一の決定論的なテンソルを適用する前に、モデルの前処理グラフを調べます。この章の終わりまでに、完全な前処理契約を宣言し、それをモデルに添付し、設定されたルートが存在することを確認します。
ウォークスルー
前処理契約を設定する
これらのオプションは、前処理段階で適用される契約を宣言します。format(またはcolor_convert.input_format)は、入力時の色の順序を固定します。input_max_*フィールドは、ランタイムが受け入れる動的な入力を制限します。リサイズ/出力の次元は、推論のために生成されるテンソルのサイズを設定します。そして、normalizeとチャネルごとのmean/stddev定 数は、値のスケーリングを適用します。正規化定数は、モデルの学習時のレシピと一致する必要があります。一致しない統計は、信頼性の低い出力の最も一般的な原因です。
フィールドはModel::Options::preprocessの下に存在します。color_convert.input_formatはPreprocessColorFormat列挙型を受け取り、normalize.enableはAutoFlagであり、normalize.mean / normalize.stddevはstd::array<float, 3>です。
simaai::neat::Model::Options opt;
opt.preprocess.color_convert.input_format = simaai::neat::PreprocessColorFormat::BGR;
opt.preprocess.input_max_width = size;
opt.preprocess.input_max_height = size;
opt.preprocess.input_max_depth = 3;
opt.preprocess.resize.width = size;
opt.preprocess.resize.height = size;
opt.preprocess.resize.width = size;
opt.preprocess.resize.height = size;
opt.preprocess.normalize.enable = simaai::neat::AutoFlag::On;
opt.preprocess.normalize.mean = std::array<float, 3>{0.5f, 0.5f, 0.5f};
opt.preprocess.normalize.stddev = std::array<float, 3>{0.5f, 0.5f, 0.5f};
モデルを構築する
アーカイブパスとオプションからModelを構築すると、前処理契約が ロードされたモデルにバインドされます。これにより、モデルは前処理定義を保持するため、そこから派生したすべての段階または実行で同じレシピが再利用されます。
simaai::neat::Model model(model_path, opt);