TensorFlow スリムイメージ分類モデル・ライブラリー・モデルの変換¶
危険
ここで説明されているコードは非推奨になりました。従来のソリューションの適用を避けるため使用しないでください。下位互換性を確保するためにしばらく保持されますが、最新のアプリケーションでは使用してはなりません。
このガイドでは、非推奨となった変換方法について説明します。新しい推奨方法に関するガイドは、Python チュートリアルに記載されています。
TensorFlow-Slim 画像分類モデル・ライブラリーは、TensorFlow で分類モデルを定義、トレーニング、評価するライブラリーです。このライブラリーには、分類トポロジーを定義する Python スクリプトと、いくつかの事前トレーニングされた分類トポロジーのチェックポイント・ファイルが含まれています。TensorFlow-Slim ライブラリー・モデルを変換するには、次の手順を実行します。
TensorFlow-Slim モデルの git リポジトリーをダウンロードします。
事前トレーニングされたモデルのチェックポイントをダウンロードします。
推論グラフをエクスポートします。
モデル変換 API でモデルを変換します。
以下の Inception V1 モデル変換の例は、Inception V1 モデルを変換するプロセスを示しています。
Inception V1 モデル変換の例¶
この例では、Linux* でモデルを変換する方法を示していますが、Windows* でも簡単に利用できます。
ステップ 1. 新しいディレクトリーを作成して、TensorFlow-Slim git リポジトリーのクローンを作成します。
mkdir tf_models
git clone https://github.com/tensorflow/models.git tf_models
ステップ 2. Inception V1 モデルのチェックポイント・ファイルをダウンロードして展開します。
wget http://download.tensorflow.org/models/inception_v1_2016_08_28.tar.gz
tar xzvf inception_v1_2016_08_28.tar.gz
ステップ 3. 推論グラフ (トポロジーのアーキテクチャを含む protobuf ファイル (.pb
) をエクスポートします。このファイルにはニューラル・ネットワークの重みが含まれていないため、推論には使用できません。
python3 tf_models/research/slim/export_inference_graph.py \ --model_name inception_v1 \ --output_file inception_v1_inference_graph.pb
モデル変換 API には、グラフの入力ノードと出力ノードを識別する集計グラフ・ユーティリティーが付属しています。ユーティリティーを実行して、Inception V1 モデルの入力/出力ノードを決定します。
python3 <PYTHON_SITE_PACKAGES>/openvino/tools/mo/utils/summarize_graph.py --input_model ./inception_v1_inference_graph.pb
出力は次のようにが表示されます。
1 input(s) detected:
Name: input, type: float32, shape: (-1,224,224,3)
1 output(s) detected:
InceptionV1/Logits/Predictions/Reshape_1
このツールは、名前が input
、タイプ float32
、固定画像サイズ (224,224,3)
、および未定義のバッチサイズ -1
を持つ 1 つの入力ノードを検索します。出力ノード名は InceptionV1/Logits/Predictions/Reshape_1
です。
ステップ 4. モデル変換 API でモデルを変換します。
mo --input_model ./inception_v1_inference_graph.pb --input_checkpoint ./inception_v1.ckpt -b 1 --mean_value [127.5,127.5,127.5] --scale 127.5
モデル変換 API は入力サイズが定義されていないモデルを変換できないため、-b
コマンドライン・パラメーターが必要です。
--mean_values
と --scale
コマンドライン・パラメーターを使用する理由については、ensorFlow-Slim モデルの平均値とスケール値を参照してください。
TensorFlow-Slim モデルの平均値とスケール値¶
TensorFlow-Slim モデルは、正規化された入力データを使用してトレーニングされました。Slim ライブラリーでは、異なる正規化アルゴリズムが使用されています。OpenVINO 分類サンプルでは、入力レイヤーサイズへのサイズ変更を除き、画像の前処理は実行されません。正しい分類結果を得るために、平均値とスケール値をモデル変換 API に渡し、生成された IR に埋め込まれるようにする必要があります。
ファイル preprocessing_factory.py には、モデルタイプと前処理関数とのマッピングを定義する辞書変数 preprocessing_fn_map
が含まれています。平均値/スケール値を把握するには、関数コードを分析する必要があります。
inception_preprocessing.py ファイルは、Inception モデルの前処理関数を定義します。preprocess_for_eval
関数には次のコードが含まれます。
...
import tensorflow as tf
if image.dtype != tf.float32:
image = tf.image.convert_image_dtype(image, dtype=tf.float32)
...
image = tf.subtract(image, 0.5)
image = tf.multiply(image, 2.0)
return image
まず、image
がデータタイプ tf.float32 に変換され、関数 tf.image.convert_image_dtype を使用してテンソルの値が [0, 1]
範囲にスケーリングされます。次に、画像値から 0.5
が減算され、値に 2.0
が掛けられます。最終的な画像の値の範囲は [-1, 1]
です。
OpenVINO 分類サンプルは、入力イメージ [0, 255]
の範囲の整数値の 3 次元配列として読み取ります。それらを [-1, 1]
の範囲にスケールするには、各イメージチャネルの平均値 127.5
とスケール係数 127.5
を指定する必要があります。
同様に、他のスリムモデルの平均値/スケール値を決定できます。
正確な平均/スケール値は、TensorFlow モデルの変換ガイドのサポートされる TensorFlow-Slim モデルのリストを含む表で定義されています。