[従来] 前処理計算の組込み

危険

ここで説明されているコードは非推奨になりました。従来のソリューションの適用を避けるため使用しないでください。下位互換性を確保するためにしばらく保持されますが、最新のアプリケーションでは使用してはなりません

このガイドでは、非推奨となった変換方法について説明します。新しい推奨方法に関するガイドは、変換パラメーターの記事に記載されています。

推論用の入力データはトレーニングのデータセットとは異なる場合があり、推論の前に追加の前処理が必要になります。前処理や推論を含むパイプライン全体を高速化するため、モデル変換 API は、mean_valuesscale_valuesreverse_input_channelslayout など特別なパラメーターを提供します。

これらのパラメーターに基づいて、モデル変換 API は、定義された前処理を実行するために挿入されたサブグラフを含む OpenVINO IR を生成します。この前処理ブロックは、入力データの平均スケール正規化、チャネル次元に沿ったデータの反転、およびデータ・レイアウトの変更を実行できます。パラメーターの詳細については次のセクションを参照するか、OpenVINO ランタイムの同じ機能については前処理 API の概要を参照してください。

レイアウトを指定

バッチの設定、平均値またはスケールの適用、入力チャネル (BGR<->RGB) の反転など、いくつかの前処理で入力レイアウトの設定が必要になる場合があります。

レイアウトは形状の次元の平均を定義し、入力と出力の両方に指定できます。一部の前処理では、バッチの設定、平均値またはスケールの適用、入力チャネル (BGR<->RGB) の反転など、入力レイアウトの設定が必要です。

レイアウト構文の詳細については、レイアウト API の概要を参照してください。レイアウトを指定するには、layout オプションの後にレイアウト値を使用します。

例えば、次のコマンドは、ONNX 形式にエクスポートされた Tensorflow nasnet_large モデルの NHWC レイアウトを指定します。

from openvino.tools.mo import convert_model
ov_model = convert_model("tf_nasnet_large.onnx", layout="nhwc")
mo --input_model tf_nasnet_large.onnx --layout nhwc

さらに、モデルに複数の入力がある場合、または入力と出力の両方のレイアウトが必要である場合は、各入力または出力の名前を指定してレイアウトを適用する必要があります。

例えば、次のコマンドは、NCHW レイアウトの最初の入力 input_1 と、N? レイアウトとして表現される画像の 2 次元バッチとサイズを持つ 2 番目の入力 image_shape を持つ ONNX Yolo v3 Tiny モデルのレイアウトを指定します。

from openvino.tools.mo import convert_model
ov_model = convert_model("yolov3-tiny.onnx", layout={"input_1": "nchw", "image_shape": "n?"})
mo --input_model yolov3-tiny.onnx --layout input_1(nchw),image_shape(n?)

モデルのレイアウトを変更

モデルのレイアウトが入力データと異なる場合、モデルのレイアウトの変更が必要になる場合があります。レイアウトを変更するには、layout または source_layouttarget_layout とともに使用します。

例えば、前述と同じ nasnet_large モデルの場合、次のコマンドで NCHW レイアウトにデータを提供できます。

from openvino.tools.mo import convert_model
ov_model = convert_model("tf_nasnet_large.onnx", source_layout="nhwc", target_layout="nchw")

ov_model = convert_model("tf_nasnet_large.onnx", layout="nhwc->nchw")
mo --input_model tf_nasnet_large.onnx --source_layout nhwc --target_layout nchw

mo --input_model tf_nasnet_large.onnx --layout "nhwc->nchw"

さらに、モデルに複数の入力がある場合、または入力と出力の両方のレイアウトが必要である場合は、各入力または出力の名前を指定してレイアウトを適用する必要があります。

例えば、前述の Yolo v3 Tiny モデルの NHWC レイアウトにデータを提供するには、次のコマンドを使用します。

from openvino.tools.mo import convert_model
ov_model = convert_model("yolov3-tiny.onnx", source_layout={"input_1": "nchw", "image_shape": "n?"}, target_layout={"input_1": "nhwc"})

ov_model = convert_model("yolov3-tiny.onnx", layout={"input_1": "nchw->nhwc", "image_shape": "n?"}
mo --input_model yolov3-tiny.onnx --source_layout "input_1(nchw),image_shape(n?)" --target_layout "input_1(nhwc)"

mo --input_model yolov3-tiny.onnx --layout "input_1(nchw->nhwc),image_shape(n?)"

平均とスケール値の指定

ニューラル・ネットワーク・モデルは通常、正規化された入力データでトレーニングされます。これは、入力データ値が特定の範囲 ([0, 1][-1, 1] など) に収まるように変換されることを意味します。場合によっては、前処理の一環として、入力データ値から平均値 (平均画像) が減算されます。

入力データの前処理の実装には 2 つのケースがあります。

  • 入力前処理操作はモデルの一部です。

    この場合、アプリケーションは別の前処理ステップを実行しません。すべてがモデル自体に埋め込まれています。convert_model() は、必要な前処理操作を含む ov.Model を生成します。平均値パラメーターやスケールパラメーターは必要ありません。

  • 入力前処理操作はモデルの一部ではなく、前処理はモデルに入力データを供給するアプリケーション内で実行されます。

    この場合、平均/スケール値に関する情報を convert_model() に提供して、生成された ov.Model に埋め込む必要があります。

convert_model() で表されるモデル変換 API は、値を指定するコマンドライン・パラメーター (mean_valuesscale_valuesscale) を提供します。これらのパラメーターを使用して、モデル変換 API は入力データの平均値の正規化に対応する前処理ブロックを埋め込み、前処理にかかる時間が推論で無視できる程度になるようにブロックを最適化します。

例えば、次のコマンドは PaddlePaddle UNet モデルのモデル変換を実行し、入力データに平均スケール正規化を適用します。

from openvino.tools.mo import convert_model
ov_model = convert_model("unet.pdmodel", mean_values=[123,117,104], scale=255)
mo --input_model unet.pdmodel --mean_values [123,117,104] --scale 255

入力チャネルの反転

状況によっては、アプリケーションの入力画像が RGB (または BGR) 形式である場合があり、モデルはカラーチャネルの順序が逆である BGR (または RGB) 形式の画像でトレーニングされることがあります。この場合、推論前にカラーチャネルを元に戻すことで入力画像を前処理することが重要です。

この前処理ステップを ov.Model に埋め込むため、モデル変換 API はカラーチャネルをシャッフルする reverse_input_channels コマンドライン・パラメーターを提供します。

reverse_input_channels パラメーターは、次の場合にモデル入力の前処理に使用できます。

  • 入力形状内のサイズが 3 に等しい次元は 1 つだけです。

  • 1 つの次元のサイズは未定義で、layout パラメーターを使用して C チャネルとしてマークされます。

reverse_input_channels パラメーターを使用すると、モデル変換 API は、チャネル次元に沿って入力データを戻すため対応する前処理ブロックを埋め込み、前処理にかかる推論時間が無視できる程度になるようにブロックを最適化します。

例えば、次のコマンドは TensorFlow AlexNet モデルのモデル変換を開始し、reverse_input_channel 前処理ブロックを OpenVINO IR に埋め込みます。

from openvino.tools.mo import convert_model
ov_model = convert_model("alexnet.pb", reverse_input_channels=True)
mo --input_model alexnet.pb --reverse_input_channels

平均値とスケール値の両方が指定されている場合、コマンドラインのオプションの順序に関係なく、最初に平均値が減算され、次にスケールが適用されます。入力値はスケール値で除算されます。reverse_input_channels オプションも使用されている場合、reverse_input_channels が最初に適用され、平均値が適用されてから、スケールが適用されます。モデル内のデータフローは次のようになります: パラメーター -> ReverseInputChannels -> 平均適用 -> スケール適用 -> モデルの元のボディー