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

TensorFlow Lite メタデータは、モデルを記述するための標準を提供します。「 メタデータは、モデルが何を行い、どのような処理を 入出力情報です。メタデータはメタデータと

Kaggle で公開されているすべての画像モデル モデルにデータが入力されています。 提供します。

メタデータ形式のモデル

model_with_metadata
図 1.
メタデータと関連ファイルを含む TFLite モデル。

モデル メタデータは、 metadata_schema.fbs FlatBuffer 表示されます。図 1 で示すとおり、このテーブルは メタデータ TFLite モデルのフィールド スキーマ ["TFLITE_METADATA"] をクリックします。モデルによっては、関連付けられたファイル、 分類ラベルや ファイル。 これらのファイルは、ZIP として元のモデルファイルの末尾に連結されます。 ZipFile の「append」 モード'a' モード)。TFLite インタープリタは、以前と同じ方法で新しいファイル形式を使用できます。パック 関連ファイルをご覧ください。

メタデータの入力、可視化、読み取り方法については、以下の説明をご覧ください。

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

モデルにメタデータを追加する前に、Python プログラミング TensorFlow を実行するための環境設定を行います。Google Cloud オペレーションスイートの こちらで設定できます。

Python プログラミング環境を設定したら、 追加ツール:

pip install tflite-support

TensorFlow Lite メタデータ ツールは Python 3 をサポートしています。

Flatbuffers Python API を使用してメタデータを追加する

モデル メタデータは 3 つの部分からなります。 スキーマ:

  1. モデル情報 - モデルとアイテムの全体的な説明 同意します。詳しくは、 ModelMetadata
    1. 入力情報 - 入力と前処理の説明 必要があります。詳しくは、 SubGraphMetadata.input_tensor_metadata
      1. 出力情報 - 出力の説明、 ラベルへのマッピングなどの後処理が必要です。詳しくは、 SubGraphMetadata.output_tensor_metadata

現時点では TensorFlow Lite は単一のサブグラフのみをサポートしているため、 TensorFlow Lite コード生成ツール Android Studio ML Binding 機能 代わりに ModelMetadata.nameModelMetadata.description を使用します。 SubGraphMetadata.nameSubGraphMetadata.description(表示時) コードの生成を自動化できます。

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

入出力用の TensorFlow Lite メタデータは、特定の用途向けに設計されている 考慮する必要がありますが、入力型と出力型よりも重要です。データ アナリストが 入力と出力の型が次の要素で構成されている限り、モデルは機能的に 次のもの、または次の組み合わせの場合は、TensorFlow でサポートされます。 Lite メタデータ:

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

関連ファイルをパッケージ化する

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

関連ファイルをメタデータを介してモデルにバンドルできるようになりました 使用します。新しい TensorFlow Lite モデルは、次の内容を含む zip ファイルになります。 モデルと関連ファイルの両方が含まれます。一般的な zip で展開して できます。この新しいモデル形式では、引き続き同じファイル拡張子 .tflite が使用されます。これは、 は既存の TFLite フレームワークおよびインタープリタと互換性があります。パックのメタデータをご覧ください。 関連するファイルを モデルをご覧ください。

関連付けられたファイルの情報をメタデータに記録できます。影響する要因 ファイル形式と添付場所(ModelMetadataSubGraphMetadataTensorMetadata など)、TensorFlow Lite の Android コード 生成ツールは、対応する事前/事後に適用できる 自動的に処理が行われます。<Codegen の使用方法>セクション( 各アソシエイト ファイル 種類 確認してください

正規化パラメータと量子化パラメータ

正規化は、ML でよく使用されるデータ前処理手法です。「 正規化の目的は、値を共通のスケールに変更することですが、 値の範囲の差をゆがめます。

モデルの量子化は、 重みの表現精度を下げられます。また、オプションとして、 ストレージとコンピューティングの両方において 有効活用できるようになります

前処理と後処理、正規化、量子化 2 つの独立したステップです詳しくは以下をご覧ください。

正規化 量子化

たとえば、 各 Pod のパラメータ値 入力画像 浮動小数点と 量子モデル できます。
浮動小数点モデル:
- 平均: 127.5
- std: 127.5
量子モデル:
- 平均: 127.5
- std: 127.5
浮動小数点モデル:
- zeroPoint: 0
- スケール: 1.0
量子モデル:
- zeroPoint: 128.0
- scale:0.0078125f




呼び出すタイミング


入力: 入力の場合 データは正規化されて 入力は、 推論ニーズのデータ 正規化され、 必要があります。
出力: output データは おおまかに説明します。
浮動小数点モデルでは、 必要ありません。
量子化モデルは、 あるいは 事前/事後の量子化 あります。場合によって異なる データ型に 入出力テンソルです。
- 浮動小数点テンソル: なし 事前/事後の量子化 必要があります。クオン op と dequant op は、 モデルに組み込まれている 表示されます。
- int8/uint8 テンソル: 量子化が必要な 前処理や後処理を行います。


数式


normalized_input = (入力 - 平均値) / std
入力の量子化:
q = f / スケール + zeroPoint
逆量子化 出力:
f = (q - ゼロポイント) * 体重計

どこで パラメータ
モデル作成者が入力 モデルに保存して メタデータであり、 NormalizationOptions 自動入力したユーザー TFLite コンバータ tflite モデルに格納されます。 表示されます。
取得方法 パラメータは? MetadataExtractor API [2]。 TFLite の使用 Tensor API [1] または から MetadataExtractor API [2]。
浮動小数点数と数値表現を行う 同じ ? はい(浮動小数点数とクオンツ) モデルは同じで、 正規化 パラメータ いいえ、浮動小数点モデルは 必要ありません。
TFLite コードを実行する Android Studio で Studio ML バインディング 自動的に生成 どうでしょうか

[1] TensorFlow Lite Java API および TensorFlow 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()

画像入力

画像は ML の一般的な入力タイプです。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()

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

メタデータ フラットバッファが作成されると、メタデータとラベルファイルが 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 を使用すると、 または、TensorFlow Lite モデルから JSON 形式でメタデータを 次のように、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 によるメタデータの表示もサポートしています。 バインディング 機能をご覧ください。

メタデータのバージョニング

メタデータ スキーマ セマンティック バージョン番号でバージョニングされ、 そして、Flatbuffers ファイル ID で、 真のバージョン互換性を維持します。

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

メタデータ スキーマは、セマンティック バージョニング 数値、 MAJOR.MINOR.PATCH などですルールに従ってスキーマの変更を追跡する こちらをご覧ください。 フィールド バージョン 1.0.0 の後に追加されました。

Flatbuffers ファイルの識別

セマンティック バージョニングはルールに従う場合互換性を保証しますが、 真の互換性がないということにはなりません。MAJOR 番号を引き上げた場合、 必ずしも下位互換性が損なわれているという意味ではありません。そのため、 フラットバッファ ファイル 識別 file_identifier メタデータ スキーマの真の互換性を示します。ファイル ID は 4 文字にする必要があります。特定のメタデータ スキーマに固定されており、 ユーザーによって変更される可能性がありますメタデータ スキーマの下位互換性が なんらかの理由で破損する必要がある場合は、file_identifier が 「M001」から「M002」に変更します。File_identifier の変更は大幅に減少すると想定されています metadata_version よりも頻繁に使用されます。

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

必要最小限のメタデータ パーサー バージョン メタデータ パーサー(Flatbuffers で生成されたコード)の最小バージョンを メタデータフラットバッファを 完全に読み取ることができますこのバージョンは、 入力されたすべてのフィールドのバージョンの中で最大のバージョン番号、 ファイル識別子で指定された最小互換バージョン。最小 必要なメタデータ パーサーのバージョンは、バージョンによって MetadataPopulator: メタデータが TFLite モデルに挿入されている場合。詳しくは、 メタデータ エクストラクタをご覧ください。 必要最小限のメタデータ パーサー バージョンが使用されます。

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

メタデータ エクストラクタ ライブラリは、メタデータを読み取り、 モデルをさまざまなプラットフォームでモデルに関連付けておけます(Java バージョン C++ バージョンをご覧ください)。 フラットバッファ ライブラリ。

Java でのメタデータの読み取り

Android アプリでメタデータ エクストラクタ ライブラリを使用する場合は、 TensorFlow Lite Metadata AAR MavenCentral. MetadataExtractor クラスと FlatBuffers Java が含まれています。 metadata スキーマ モデル

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

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

毎晩のスナップショットを使用するには、Sonatype スナップショット リポジトリをご覧ください。

MetadataExtractor オブジェクトを、次のものを指す ByteBuffer で初期化できます。 追加します。

public MetadataExtractor(ByteBuffer buffer);

ByteBuffer は、存続期間中に変更されないままにする必要があります。 MetadataExtractor オブジェクト。フラットバッファ ファイルが 識別子がメタデータ パーサーの識別子と一致しません。詳しくは、 メタデータのバージョニングをご覧ください。

ファイル識別子が一致すると、メタデータ抽出ツールは正常に フラットバッファの特性により、過去と将来のすべてのスキーマから生成されたメタデータが 互換性メカニズムを提供します。ただし将来のフィールドには 古いメタデータ エクストラクタではスキーマを抽出できません。最低限必要な金額 メタデータのパーサー バージョン メタデータを読み取ることができるメタデータ パーサーの最小バージョンを示します フラットバッファがいっぱいです。次の方法を使用して、最小値がしきい値を下回っているか 必要なパーサー バージョンの条件を満たしている場合:

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);

TensorFlow Lite モデルは、 スキーマ は複数のサブグラフをサポートしていますが、TFLite インタープリタは現在、 作成します。そのため、MetadataExtractor は入力としてサブグラフ インデックスを省略します。 渡します。

モデルから関連ファイルを読み取る

メタデータと関連ファイルを含む TensorFlow Lite モデルは、基本的には 一般的な zip ツールで展開して関連ファイルを取得できる zip ファイル。 たとえば mobilenet_v1_0.75_160_quantized 次のようにして、モデル内のラベルファイルを抽出します。

$ unzip mobilenet_v1_0.75_160_quantized_1_metadata_1.tflite
Archive:  mobilenet_v1_0.75_160_quantized_1_metadata_1.tflite
 extracting: labels.txt

関連付けられたファイルは、メタデータ エクストラクタ ライブラリから読み取ることもできます。

Java では、ファイル名を MetadataExtractor.getAssociatedFile に渡します。 メソッド:

public InputStream getAssociatedFile(String fileName);

同様に、C++ ではメソッドでこれを行うことができます。 ModelMetadataExtractor::GetAssociatedFile:

tflite::support::StatusOr<absl::string_view> GetAssociatedFile(
      const std::string& filename) const;