このページは Cloud Translation API によって翻訳されました。
Switch to English

TensorFlow Liteモデルへのメタデータの追加

TensorFlow Liteメタデータは、モデル記述の標準を提供します。メタデータは、モデルの機能とその入出力情報に関する重要な知識源です。メタデータは両方で構成されています

TensorFlow LiteでホストされるモデルTensorFlow Hubで公開されるすべての画像モデルには、メタデータが入力されています。

メタデータツールを設定する

モデルにメタデータを追加する前に、TensorFlowを実行するためのPythonプログラミング環境をセットアップする必要があります。これを設定する方法の詳細なガイドがここにあります

Pythonプログラミング環境をセットアップしたら、追加のツールをインストールする必要があります。

pip install tflite-support

TensorFlow Liteメタデータツールは、Python 2とPython 3の両方をサポートしています。

メタデータを追加する

スキーマのモデルメタデータには3つの部分があります

  1. モデル情報 - モデルの全体的な説明と、ライセンス条項などの項目。 ModelMetadataを参照してください。
  2. 入力情報 -正規化などの必要な入力と前処理の説明。 SubGraphMetadata.input_tensor_metadataを参照してください。
  3. 出力情報 -ラベルへのマッピングなど、必要な出力および後処理の説明。 SubGraphMetadata.output_tensor_metadataを参照してください。

TensorFlow Liteはこの点だけで、単一の部分グラフをサポートしているため、 TensorFlow LiteのコードジェネレータAndroidのメーカーMLバインド機能が使用されますModelMetadata.nameModelMetadata.description 、代わりのSubGraphMetadata.nameSubGraphMetadata.description 、メタデータを表示し、コード生成を。

サポートされる入力/出力タイプ

入力と出力のTensorFlow Liteメタデータは、特定のモデルタイプを考慮して設計されているのではなく、入力タイプと出力タイプを設計しています。入力タイプと出力タイプが以下またはその組み合わせで構成されている限り、モデルが機能的に何をするかは関係ありません。TensorFlowLiteメタデータでサポートされています。

  • 機能-符号なし整数またはfloat32の数値。
  • 画像-メタデータは現在、RGB画像とグレースケール画像をサポートしています。
  • 境界ボックス-長方形の境界ボックス。スキーマは、さまざまな番号付けスキーマをサポートしています。

関連ファイルをパックします

TensorFlow Liteモデルには、さまざまな関連ファイルが付属している場合があります。たとえば、自然言語モデルには通常、単語の断片を単語IDにマップする語彙ファイルがあります。分類モデルには、オブジェクトカテゴリを示すラベルファイルがある場合があります。関連ファイルがない場合(存在する場合)、モデルは正しく機能しません。

関連ファイルは、メタデータPythonライブラリを介してモデルにバンドルできるようになりました。新しいTensorFlow Liteモデルは、モデルと関連ファイルの両方を含むzipファイルになります。一般的なzipツールで解凍できます。この新しいモデル形式では、同じファイル拡張子.tfliteます。既存のTFLiteフレームワークおよびインタープリターと互換性があります。詳細については、 mtadataおよび関連ファイルをモデルにパックするを参照してください。

関連するファイル情報は、メタデータで再コアできます。ファイルタイプとファイルの添付場所(つまり、 ModelMetadataSubGraphMetadata 、およびTensorMetadata )に応じて、TensorFlow Lite Androidコードジェネレーターは、対応する事前/事後処理をオブジェクトに自動的に適用します。詳細について 、スキーマの各関連ファイルタイプの<Codegen usage>セクションを参照してください。

正規化および量子化パラメーター

正規化は、機械学習における一般的なデータ前処理手法です。正規化の目的は、値の範囲の違いを歪めることなく、値を共通のスケールに変更することです。

モデル量子化は、重みの精度の低い表現を可能にし、オプションで、ストレージと計算の両方のアクティブ化を可能にする手法です。

前処理と後処理に関して、正規化と量子化は2つの独立したステップです。詳細はこちら。

正規化量子化

floatモデルとquantモデルのそれぞれに対するMobileNetの入力画像のパラメーター値の例。
フロートモデル
-平均:127.5
-標準:127.5
量モデル
-平均:127.5
-標準:127.5
フロートモデル
-zeroPoint:0
-スケール:1.0
量モデル
-zeroPoint:128.0
-スケール:0.0078125f




いつ呼び出すか?


入力 :入力データがトレーニングで正規化される場合、推論の入力データはそれに応じて正規化される必要があります。
出力 :出力データは一般的に正規化されません。
フロートモデルは量子化を必要としません。
量子化モデルは、前処理/後処理で量子化を必要とする場合と必要としない場合があります。これは、入力/出力テンソルのデータ型に依存します。
-浮動小数点テンソル:前後処理での量子化は必要ありません。定量演算と非定量演算がモデルグラフに組み込まれます。
-int8 / uint8テンソル:前処理/後処理で量子化が必要です。




正規化入力=(入力-平均)/ std
入力の量子化
q = f /スケール+ zeroPoint
出力の逆量子化
f =(q-zeroPoint)*スケール

パラメータはどこにありますか
モデル作成者によって入力され、 NormalizationOptionsとしてモデルメタデータに格納されます TFLiteコンバーターによって自動的に入力され、tfliteモデルファイルに保存されます。
パラメータを取得する方法は? MetadataExtractor API [2]を使用 TFLite Tensor API [1]またはMetadataExtractor API [2]を使用
floatモデルとquantモデルは同じ値を共有しますか? はい、floatモデルとquantモデルには同じ正規化パラメーターがありますいいえ、フロートモデルは量子化を必要としません。
TFLiteコードジェネレーターまたはAndroid Studio MLバインディングは、データ処理でそれを自動的に生成しますか?
はい

はい

[1] TensorFlow Lite Java APITensorFlow Lite C ++ API
[2] メタデータ抽出ライブラリー

uint8モデルの画像データを処理するときに、正規化と量子化がスキップされることがあります。ピクセル値が[0、255]の範囲内にある場合は、これで問題ありません。ただし、一般的には、該当する場合は常に正規化および量子化パラメーターに従ってデータを処理する必要があります。

さまざまなタイプのモデルにメタデータを入力する方法の例は、次の場所にあります。

画像分類

メタデータをmobilenet_v1_0.75_160_quantized.tfliteに入力するスクリプトをここからダウンロードします。次のようにスクリプトを実行します。

python ./metadata_writer_for_image_classifier.py \
    --model_file=./model_without_metadata/mobilenet_v1_0.75_160_quantized.tflite \
    --label_file=./model_without_metadata/labels.txt \
    --export_directory=model_with_metadata

他の画像分類モデルのメタデータを入力するには、 このようなモデル仕様をスクリプトに追加します。このガイドの残りの部分では、画像分類の例の主要なセクションのいくつかを強調して、主要な要素を示します。

画像分類の例の詳細

モデル情報

メタデータは、新しいモデル情報を作成することから始まります。

from tflite_support import flatbuffers
from tflite_support import metadata as _metadata
from tflite_support import metadata_schema_py_generated as _metadata_fb

""" ... """
"""Creates the metadata for an image classifier."""

# Creates model info.
model_meta = _metadata_fb.ModelMetadataT()
model_meta.name = "MobileNetV1 image classifier"
model_meta.description = ("Identify the most prominent object in the "
                          "image from a set of 1,001 categories such as "
                          "trees, animals, food, vehicles, person etc.")
model_meta.version = "v1"
model_meta.author = "TensorFlow"
model_meta.license = ("Apache License. Version 2.0 "
                      "http://www.apache.org/licenses/LICENSE-2.0.")

入出力情報

このセクションでは、モデルの入力および出力署名を説明する方法を示します。このメタデータは、前処理コードと後処理コードを作成するために自動コードジェネレーターで使用できます。テンソルに関する入力または出力情報を作成するには:

# Creates input info.
input_meta = _metadata_fb.TensorMetadataT()

# Creates output info.
output_meta = _metadata_fb.TensorMetadataT()

画像入力

画像は機械学習の一般的な入力タイプです。 TensorFlow Liteメタデータは、色空間などの情報や、正規化などの前処理情報をサポートしています。画像の寸法は、入力テンソルの形状によってすでに提供されており、自動的に推測できるため、手動で指定する必要はありません。

input_meta.name = "image"
input_meta.description = (
    "Input image to be classified. The expected image is {0} x {1}, with "
    "three channels (red, blue, and green) per pixel. Each value in the "
    "tensor is a single byte between 0 and 255.".format(160, 160))
input_meta.content = _metadata_fb.ContentT()
input_meta.content.contentProperties = _metadata_fb.ImagePropertiesT()
input_meta.content.contentProperties.colorSpace = (
    _metadata_fb.ColorSpaceType.RGB)
input_meta.content.contentPropertiesType = (
    _metadata_fb.ContentProperties.ImageProperties)
input_normalization = _metadata_fb.ProcessUnitT()
input_normalization.optionsType = (
    _metadata_fb.ProcessUnitOptions.NormalizationOptions)
input_normalization.options = _metadata_fb.NormalizationOptionsT()
input_normalization.options.mean = [127.5]
input_normalization.options.std = [127.5]
input_meta.processUnits = [input_normalization]
input_stats = _metadata_fb.StatsT()
input_stats.max = [255]
input_stats.min = [0]
input_meta.stats = input_stats

ラベル出力

TENSOR_AXIS_LABELSを使用して、関連ファイルを介してラベルを出力テンソルにマッピングできます。

# Creates output info.
output_meta = _metadata_fb.TensorMetadataT()
output_meta.name = "probability"
output_meta.description = "Probabilities of the 1001 labels respectively."
output_meta.content = _metadata_fb.ContentT()
output_meta.content.content_properties = _metadata_fb.FeaturePropertiesT()
output_meta.content.contentPropertiesType = (
    _metadata_fb.ContentProperties.FeatureProperties)
output_stats = _metadata_fb.StatsT()
output_stats.max = [1.0]
output_stats.min = [0.0]
output_meta.stats = output_stats
label_file = _metadata_fb.AssociatedFileT()
label_file.name = os.path.basename("your_path_to_label_file")
label_file.description = "Labels for objects that the model can recognize."
label_file.type = _metadata_fb.AssociatedFileType.TENSOR_AXIS_LABELS
output_meta.associatedFiles = [label_file]

メタデータフラットバッファを作成する

次のコードは、モデル情報と入力および出力情報を組み合わせています。

# Creates subgraph info.
subgraph = _metadata_fb.SubGraphMetadataT()
subgraph.inputTensorMetadata = [input_meta]
subgraph.outputTensorMetadata = [output_meta]
model_meta.subgraphMetadata = [subgraph]

b = flatbuffers.Builder(0)
b.Finish(
    model_meta.Pack(b),
    _metadata.MetadataPopulator.METADATA_FILE_IDENTIFIER)
metadata_buf = b.Output()

メタデータと関連ファイルをモデルにパックする

メタデータFlatbuffersが作成されると、 populateメソッドを介してメタデータとラベルファイルがTFLiteファイルに書き込まれます。

populator = _metadata.MetadataPopulator.with_model_file(model_file)
populator.load_metadata_buffer(metadata_buf)
populator.load_associated_files(["your_path_to_label_file"])
populator.populate()

load_associated_filesを使用して、必要な数の関連ファイルをモデルにパックできます。ただし、少なくともメタデータに文書化されているファイルをパックする必要があります。この例では、ラベルファイルのパッキングが必須です。

メタデータを視覚化する

あなたは使用することができますNetronをあなたのメタデータを視覚化するために、またはあなたが使用してJSON形式にTensorFlow Liteのモデルからメタデータを読み取ることができMetadataDisplayer

displayer = _metadata.MetadataDisplayer.with_model_file(export_model_path)
export_json_file = os.path.join(FLAGS.export_directory,
                    os.path.splitext(model_basename)[0] + ".json")
json_file = displayer.get_metadata_json()
# Optional: write out the metadata as a json file
with open(export_json_file, "w") as f:
  f.write(json_file)

Android Studioは、 Android Studio MLバインディング機能によるメタデータの表示もサポートしています

メタデータのバージョン管理

メタデータスキーマは、スキーマファイルの変更を追跡するセマンティックバージョン番号と、実際のバージョンの互換性を示すフラットバッファファイルIDの両方によってバージョン管理されます。

セマンティックバージョン番号

メタデータスキーマは、MAJOR.MINOR.PATCHなどのセマンティックバージョン番号によってバージョン管理されます。 ここのルールに従ってスキーマの変更を追跡します。バージョン1.0.0以降に追加されたフィールド履歴を参照してください。

Flatbuffersファイルの識別

セマンティックバージョニングは、ルールに従えば互換性を保証しますが、真の非互換性を意味するものではありません。 MAJOR番号を上げると、必ずしも下位互換性が失われるわけではありません。したがって、メタデータスキーマの真の互換性を示すために、 フラット バッファファイルID file_identifilerを使用します。ファイル識別子は正確に4文字です。これは特定のメタデータスキーマに固定されており、ユーザーによる変更の対象にはなりません。メタデータスキーマの下位互換性を何らかの理由で解除する必要がある場合、file_identifierは、たとえば「M001」から「M002」に増加します。 File_identifilerは、metadata_versionよりもはるかに少ない頻度で変更されると予想されます。

必要最低限​​のメタデータパーサーバージョン

最低限必要なメタデータパーサーバージョンは、メタデータフラットバッファーを完全に読み取ることができるメタデータパーサー(フラットバッファー生成コード)の最小バージョンです。バージョンは、入力されたすべてのフィールドのバージョンの中で最大のバージョン番号であり、ファイル識別子によって示される最小の互換バージョンです。メタデータがTFLiteモデルに入力されると、最低限必要なメタデータパーサーバージョンがMetadataPopulatorによって自動的に入力されます。最低限必要なメタデータパーサーバージョンの使用方法の詳細については、 メタデータエクストラクターを参照してください。

モデルからメタデータを読み取る

メタデータ抽出ライブラリは、さまざまなプラットフォームのモデルからメタデータと関連ファイルを読み取るための便利なツールです( JavaバージョンC ++バージョンを参照)。 Flatbuffersライブラリを使用して、他の言語で独自のメタデータ抽出ツールを構築できます。

Javaでメタデータを読み取る

Androidアプリでメタデータ抽出ライブラリを使用するには、 JCenterでホストされているTensorFlow LiteメタデータAARを使用することをお勧めします。 MetadataExtractorクラスと、 メタデータスキーマおよびモデルスキーマのFlatBuffers Javaバインディングが含まれています

これは、 build.gradle依存関係で次のように指定できます。

dependencies {
    implementation 'org.tensorflow:tensorflow-lite-metadata:0.0.0-nightly'
}

モデルを指すByteBufferMetadataExtractorオブジェクトを初期化できます。

public MetadataExtractor(ByteBuffer buffer);

ByteBufferは、 MetadataExtractorオブジェクトの存続期間全体にわたって変更されないままにする必要があります。モデルメタデータのFlatbuffersファイル識別子がメタデータパーサーの識別子と一致しない場合、初期化は失敗する可能性があります。詳細については、 メタデータのバージョン管理を参照してください。

一致するファイル識別子を使用すると、メタデータエクストラクタは、フラットバッファの前方および後方互換性メカニズムにより、過去および将来のすべてのスキーマから生成されたメタデータを正常に読み取ります。ただし、将来のスキーマのフィールドは、古いメタデータエクストラクターでは抽出できません。メタデータの最低限必要なパーサーバージョンは、メタデータフラットバッファーを完全に読み取ることができるメタデータパーサーの最低バージョンを示します。次の方法を使用して、必要最低限​​のパーサーバージョン条件が満たされているかどうかを確認できます。

public final boolean isMinimumParserVersionSatisfied();

メタデータなしでモデルを渡すことができます。ただし、メタデータから読み取るメソッドを呼び出すと、ランタイムエラーが発生します。モデルにメタデータがあるかどうかを確認するには、 hasMetadataメソッドを呼び出します。

public boolean hasMetadata();

MetadataExtractorは、入力/出力テンソルのメタデータを取得するための便利な関数を提供します。例えば、

public int getInputTensorCount();
public TensorMetadata getInputTensorMetadata(int inputIndex);
public QuantizationParams getInputTensorQuantizationParams(int inputIndex);
public int[] getInputTensorShape(int inputIndex);
public int getoutputTensorCount();
public TensorMetadata getoutputTensorMetadata(int inputIndex);
public QuantizationParams getoutputTensorQuantizationParams(int inputIndex);
public int[] getoutputTensorShape(int inputIndex);

getAssociatedFileメソッドを使用して、名前で関連ファイルを読み取ることもできます。

public InputStream getAssociatedFile(String fileName);

TensorFlow Liteモデルスキーマは複数のサブグラフをサポートしていますが、TFLiteインタープリターは現在、単一のサブグラフのみをサポートしています。したがって、 MetadataExtractorは、そのメソッドの入力引数としてサブグラフインデックスを省略します。