TensorFlow スリムイメージ分類モデル・ライブラリー・モデルの変換

危険

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

このガイドでは、非推奨となった変換方法について説明します。新しい推奨方法に関するガイドは、Python チュートリアルに記載されています。

TensorFlow-Slim 画像分類モデル・ライブラリーは、TensorFlow で分類モデルを定義、トレーニング、評価するライブラリーです。このライブラリーには、分類トポロジーを定義する Python スクリプトと、いくつかの事前トレーニングされた分類トポロジーのチェックポイント・ファイルが含まれています。TensorFlow-Slim ライブラリー・モデルを変換するには、次の手順を実行します。

  1. TensorFlow-Slim モデルの git リポジトリーをダウンロードします。

  2. 事前トレーニングされたモデルのチェックポイントをダウンロードします。

  3. 推論グラフをエクスポートします。

  4. モデル変換 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 モデルのリストを含む表で定義されています。