Bantuan melindungi Great Barrier Reef dengan TensorFlow pada Kaggle Bergabung Tantangan

Menambahkan metadata ke model TensorFlow Lite

Metadata TensorFlow Lite menyediakan standar untuk deskripsi model. Metadata adalah sumber pengetahuan penting tentang apa yang dilakukan model dan informasi input/outputnya. Metadata terdiri dari keduanya

Semua model gambar diterbitkan pada TensorFlow Lite host model dan TensorFlow Hub telah diisi dengan metadata.

Model dengan format metadata

model_with_metadata
Gambar 1. Model TFLite dengan metadata dan file terkait.

Metadata Model didefinisikan dalam metadata_schema.fbs , sebuah FlatBuffer berkas. Seperti ditunjukkan dalam Gambar 1, itu disimpan dalam metadata bidang TFLite Model skema , dengan nama, "TFLITE_METADATA" . Beberapa model mungkin datang dengan file yang terkait, seperti file label klasifikasi . File-file ini digabungkan ke akhir model asli berkas sebagai ZIP menggunakan ZipFile "append" mode ( 'a' mode). TFLite Interpreter dapat menggunakan format file baru dengan cara yang sama seperti sebelumnya. Lihat Pack file yang terkait untuk informasi lebih lanjut.

Lihat instruksi di bawah tentang cara mengisi, memvisualisasikan, dan membaca metadata.

Siapkan alat metadata

Sebelum menambahkan metadata ke model, Anda perlu menyiapkan lingkungan pemrograman Python untuk menjalankan TensorFlow. Ada panduan rinci tentang cara untuk mengatur hal ini di sini .

Setelah mengatur lingkungan pemrograman Python, Anda perlu menginstal alat tambahan:

pip install tflite-support

Alat metadata TensorFlow Lite mendukung Python 3.

Menambahkan metadata menggunakan Flatbuffers Python API

Ada tiga bagian untuk metadata model dalam skema :

  1. Informasi Model - deskripsi keseluruhan model serta barang-barang seperti persyaratan lisensi. Lihat ModelMetadata .
  2. Informasi masukan - Deskripsi input dan pra-proses yang diperlukan seperti normalisasi. Lihat SubGraphMetadata.input_tensor_metadata .
  3. Output informasi - Deskripsi output dan pengolahan pasca diperlukan seperti pemetaan untuk label. Lihat SubGraphMetadata.output_tensor_metadata .

Sejak TensorFlow Lite hanya mendukung satu Graf pada titik ini, generator kode TensorFlow Lite dan fitur Binding Android Studio ML akan menggunakan ModelMetadata.name dan ModelMetadata.description , bukan SubGraphMetadata.name dan SubGraphMetadata.description , ketika menampilkan metadata dan menghasilkan kode.

Jenis Input / Output yang Didukung

Metadata TensorFlow Lite untuk input dan output tidak dirancang dengan mempertimbangkan tipe model tertentu, melainkan tipe input dan output. Apa pun yang dilakukan model secara fungsional, selama jenis input dan output terdiri dari yang berikut atau kombinasi dari yang berikut, model ini didukung oleh metadata TensorFlow Lite:

  • Fitur - Angka yang merupakan bilangan bulat yang tidak ditandatangani atau float32.
  • Gambar - Metadata saat ini mendukung gambar RGB dan skala abu-abu.
  • Kotak pembatas - Kotak pembatas berbentuk persegi panjang. Skema mendukung berbagai skema penomoran .

Kemas file terkait

Model TensorFlow Lite mungkin datang dengan file terkait yang berbeda. Misalnya, model bahasa alami biasanya memiliki file vocab yang memetakan potongan kata ke ID kata; model klasifikasi mungkin memiliki file label yang menunjukkan kategori objek. Tanpa file terkait (jika ada), model tidak akan berfungsi dengan baik.

File terkait sekarang dapat dibundel dengan model melalui pustaka metadata Python. Model TensorFlow Lite baru menjadi file zip yang berisi model dan file terkait. Itu dapat dibongkar dengan alat zip umum. Format Model baru ini membuat menggunakan ekstensi file yang sama, .tflite . Ini kompatibel dengan kerangka kerja TFLite dan Interpreter yang ada. Lihat Pack metadata dan file terkait ke dalam model untuk lebih jelasnya.

Informasi file terkait dapat direkam dalam metadata. Tergantung pada jenis file dan di mana file tersebut melekat (yaitu ModelMetadata , SubGraphMetadata , dan TensorMetadata ), kode generator yang TensorFlow Lite Android mungkin berlaku sesuai pre / post processing otomatis untuk objek. Lihat yang <penggunaan Codegen> bagian dari setiap jenis file asosiasi dalam skema untuk lebih jelasnya.

Parameter normalisasi dan kuantisasi

Normalisasi adalah teknik preprocessing data umum dalam pembelajaran mesin. Tujuan normalisasi adalah untuk mengubah nilai ke skala umum, tanpa mendistorsi perbedaan dalam rentang nilai.

Kuantisasi Model adalah teknik yang memungkinkan untuk mengurangi representasi presisi bobot dan opsional, aktivasi baik untuk penyimpanan dan komputasi.

Dalam hal preprocessing dan post-processing, normalisasi dan kuantisasi adalah dua langkah independen. Berikut rinciannya.

Normalisasi Kuantisasi

Contoh nilai parameter gambar input di MobileNet untuk model float dan quant, masing-masing.
Model float:
- rata-rata: 127,5
- std: 127,5
Model Quant:
- rata-rata: 127,5
- std: 127,5
Model float:
- titik nol: 0
- skala: 1.0
Model Quant:
- titik nol: 128.0
- skala: 0,0078125f




Kapan harus dipanggil?


Input: Jika input data dinormalkan dalam pelatihan, input data kebutuhan inferensi untuk dinormalisasi sesuai.
Output: output data tidak akan dinormalisasi pada umumnya.
Model mengambang tidak perlu kuantisasi.
Model terkuantisasi mungkin atau mungkin tidak perlu kuantisasi di pra / pengolahan pasca. Itu tergantung pada tipe data tensor input/output.
- float tensor: tidak diperlukan kuantisasi dalam pemrosesan pra/pasca. Quant op dan dequant op dimasukkan ke dalam model grafik.
- tensor int8/uint8: perlu kuantisasi dalam pemrosesan pra/pasca.


Rumus


normalisasi_input = (masukan - rata-rata) / std
Quantize untuk input:
q = f / skala + titik nol
Dequantize untuk output:
f = (q - titik nol) * skala

Dimana parameternya?
Diisi oleh Model pencipta dan disimpan dalam metadata Model, sebagai NormalizationOptions Diisi secara otomatis oleh konverter TFLite, dan disimpan dalam file model tflite.
Bagaimana cara mendapatkan parameternya? Melalui MetadataExtractor API [2] Melalui TFLite Tensor API [1] atau melalui MetadataExtractor API [2]
Apakah model float dan quant memiliki nilai yang sama? Ya, model float dan quant memiliki parameter Normalisasi yang sama Tidak, model float tidak membutuhkan kuantisasi.
Apakah pembuat Kode TFLite atau pengikatan Android Studio ML secara otomatis menghasilkannya dalam pemrosesan data?
Ya

Ya

[1] The TensorFlow Lite API Java dan TensorFlow Lite C ++ API .
[2] The extractor perpustakaan metadata

Saat memproses data gambar untuk model uint8, normalisasi dan kuantisasi terkadang dilewati. Tidak masalah jika nilai piksel berada dalam kisaran [0, 255]. Namun secara umum, Anda harus selalu memproses data sesuai dengan parameter normalisasi dan kuantisasi bila berlaku.

TensorFlow Lite Tugas Perpustakaan dapat menangani normalisasi untuk Anda jika Anda mengatur NormalizationOptions di metadata. Pemrosesan kuantisasi dan dekuantisasi selalu diringkas.

Contoh

Anda dapat menemukan contoh tentang bagaimana metadata harus diisi untuk berbagai jenis model di sini:

Klasifikasi gambar

Mendownload script di sini , yang populates metadata ke mobilenet_v1_0.75_160_quantized.tflite . Jalankan skrip seperti ini:

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

Untuk metadata populate untuk model klasifikasi citra lainnya, menambahkan spesifikasi model yang seperti ini ke dalam script. Sisa panduan ini akan menyoroti beberapa bagian kunci dalam contoh klasifikasi gambar untuk mengilustrasikan elemen kunci.

Selami lebih dalam contoh klasifikasi gambar

Informasi model

Metadata dimulai dengan membuat info model baru:

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.")

Informasi masukan/keluaran

Bagian ini menunjukkan cara mendeskripsikan input dan output signature model Anda. Metadata ini dapat digunakan oleh pembuat kode otomatis untuk membuat kode sebelum dan sesudah pemrosesan. Untuk membuat informasi input atau output tentang tensor:

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

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

Masukan gambar

Gambar adalah jenis input umum untuk pembelajaran mesin. Metadata TensorFlow Lite mendukung informasi seperti ruang warna dan informasi pra-pemrosesan seperti normalisasi. Dimensi gambar tidak memerlukan spesifikasi manual karena sudah disediakan oleh bentuk tensor input dan dapat disimpulkan secara otomatis.

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

Keluaran label

Label dapat dipetakan ke output tensor melalui file terkait menggunakan 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]

Buat metadata Flatbuffers

Kode berikut menggabungkan informasi model dengan informasi input dan output:

# 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()

Kemas metadata dan file terkait ke dalam model

Setelah Flatbuffers metadata dibuat, metadata dan file label ditulis ke dalam file TFLite melalui populate metode:

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

Anda dapat pak banyak file yang terkait yang Anda inginkan ke dalam model melalui load_associated_files . Namun, diperlukan untuk mengemas setidaknya file-file yang didokumentasikan dalam metadata. Dalam contoh ini, pengepakan file label adalah wajib.

Visualisasikan metadata

Anda dapat menggunakan netron untuk memvisualisasikan metadata Anda, atau Anda dapat membaca metadata dari model TensorFlow Lite ke dalam format json menggunakan 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 juga mendukung menampilkan metadata melalui fitur Binding Android Studio ML .

Versi metadata

The metadata skema ini berversi baik dengan jumlah versi Semantic, yang melacak perubahan dari file skema, dan dengan identifikasi berkas Flatbuffers, yang menunjukkan kompatibilitas versi yang benar.

Nomor versi semantik

Metadata Skema berversi dengan jumlah versi Semantic , seperti MAJOR.MINOR.PATCH. Ini trek perubahan skema sesuai dengan aturan di sini . Lihat sejarah bidang ditambahkan setelah versi 1.0.0 .

Identifikasi file Flatbuffers

Versi semantik menjamin kompatibilitas jika mengikuti aturan, tetapi itu tidak menyiratkan ketidakcocokan yang sebenarnya. Saat menaikkan nomor UTAMA, itu tidak berarti kompatibilitas mundur rusak. Oleh karena itu, kami menggunakan Flatbuffers identifikasi berkas , file_identifier , untuk menunjukkan kompatibilitas sebenarnya dari skema metadata. Pengidentifikasi file panjangnya persis 4 karakter. Itu diperbaiki pada skema metadata tertentu dan tidak dapat diubah oleh pengguna. Jika kompatibilitas mundur skema metadata harus rusak karena beberapa alasan, file_identifier akan muncul, misalnya, dari "M001" ke "M002". File_identifier diharapkan untuk diubah lebih jarang daripada metadata_version.

Versi pengurai metadata minimum yang diperlukan

The Versi metadata parser minimum yang diperlukan adalah versi minimum parser metadata (yang Flatbuffers kode yang dihasilkan) yang dapat membaca Flatbuffers metadata secara penuh. Versi ini secara efektif merupakan nomor versi terbesar di antara versi semua bidang yang diisi dan versi kompatibel terkecil yang ditunjukkan oleh pengidentifikasi file. Versi metadata parser minimum yang diperlukan secara otomatis diisi oleh MetadataPopulator ketika metadata dihuni menjadi model TFLite. Lihat extractor metadata untuk informasi lebih lanjut tentang bagaimana minimum yang diperlukan versi metadata parser digunakan.

Baca metadata dari model

The Metadata Extractor perpustakaan alat yang nyaman untuk membaca metadata dan file yang terkait dari model di platform yang berbeda (lihat versi Java dan C ++ versi ). Anda dapat membuat alat pengekstrak metadata Anda sendiri dalam bahasa lain menggunakan pustaka Flatbuffers.

Baca metadata di Java

Untuk menggunakan perpustakaan Metadata Extractor di aplikasi Android, kami sarankan menggunakan TensorFlow Lite Metadata AAR host di MavenCentral . Ini berisi MetadataExtractor kelas, serta binding FlatBuffers Java untuk skema metadata dan model yang skema .

Anda dapat menentukan ini dalam build.gradle dependensi sebagai berikut:

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

Untuk menggunakan snapshot malam, pastikan bahwa Anda telah menambahkan Sonatype snapshot repositori .

Anda dapat menginisialisasi MetadataExtractor objek dengan ByteBuffer yang menunjuk ke model:

public MetadataExtractor(ByteBuffer buffer);

The ByteBuffer harus tetap tidak berubah untuk seumur hidup dari MetadataExtractor objek. Inisialisasi mungkin gagal jika pengidentifikasi file Flatbuffers dari model metadata tidak cocok dengan pengurai metadata. Lihat metadata versioning untuk informasi lebih lanjut.

Dengan pengidentifikasi file yang cocok, ekstraktor metadata akan berhasil membaca metadata yang dihasilkan dari semua skema masa lalu dan masa depan karena mekanisme kompatibilitas maju dan mundur Flatbuffers. Namun, bidang dari skema masa depan tidak dapat diekstraksi oleh ekstraktor metadata yang lebih lama. The versi parser yang diperlukan minimum dari metadata menunjukkan versi minimum parser metadata yang dapat membaca Flatbuffers metadata secara penuh. Anda dapat menggunakan metode berikut untuk memverifikasi apakah kondisi versi parser minimum yang diperlukan terpenuhi:

public final boolean isMinimumParserVersionSatisfied();

Melewati model tanpa metadata diperbolehkan. Namun, memanggil metode yang membaca dari metadata akan menyebabkan kesalahan runtime. Anda dapat memeriksa apakah model memiliki metadata dengan menerapkan hasMetadata metode:

public boolean hasMetadata();

MetadataExtractor menyediakan fungsi nyaman bagi Anda untuk mendapatkan metadata input / output tensor. Sebagai contoh,

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

Meskipun TensorFlow Lite Model skema mendukung beberapa subgraphs, yang TFLite Interpreter saat ini hanya mendukung subgraph tunggal. Oleh karena itu, MetadataExtractor menghilangkan indeks Graf sebagai argumen masukan dalam metode-nya.

Baca file terkait dari model

Model TensorFlow Lite dengan metadata dan file terkait pada dasarnya adalah file zip yang dapat dibongkar dengan alat zip umum untuk mendapatkan file terkait. Misalnya, Anda dapat unzip mobilenet_v1_0.75_160_quantized dan ekstrak file label dalam model sebagai berikut:

$ 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

Anda juga dapat membaca file terkait melalui pustaka Metadata Extractor.

Di Jawa, melewati nama file ke dalam MetadataExtractor.getAssociatedFile metode:

public InputStream getAssociatedFile(String fileName);

Demikian pula, di C ++, ini dapat dilakukan dengan metode, ModelMetadataExtractor::GetAssociatedFile :

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