Metadata LiteRT menyediakan standar untuk deskripsi model. Tujuan adalah sumber pengetahuan penting tentang apa yang dilakukan model dan informasi input / output. {i>Metadata<i} terdiri dari
- dan dapat dibaca manusia, yang menyampaikan praktik terbaik saat menggunakan model, dan
- komponen yang dapat dibaca mesin, yang dapat dimanfaatkan oleh generator kode, seperti Kode Android LiteRT generator dan ML Binding Android Studio baru.
Semua model gambar yang dipublikasikan di Kaggle Model telah diisi dengan {i>metadata<i}.
Model dengan format metadata
![model_with_metadata](https://ai.google.dev/edge/litert/images/convert/model_with_metadata.png?hl=id)
Metadata model didefinisikan dalam
metadata_schema.fbs,
suatu
FlatBuffer
. Seperti ditunjukkan dalam Gambar 1, data ini disimpan dalam
metadata
kolom model TFLite
skema,
dengan nama, "TFLITE_METADATA"
. Beberapa model mungkin
disertai dengan file terkait,
seperti label klasifikasi
file.
File ini digabungkan ke akhir file model asli sebagai ZIP
menggunakan file ZipFile "append"
mode (mode 'a'
). TFLite
Penerjemah dapat menggunakan format file baru dengan cara yang sama seperti sebelumnya. Lihat Paket
file terkait untuk mengetahui informasi selengkapnya.
Lihat petunjuk di bawah tentang cara mengisi, memvisualisasikan, dan membaca metadata.
Menyiapkan alat metadata
Sebelum menambahkan metadata ke model, Anda perlu melakukan pemrograman Python untuk menjalankan TensorFlow. Ada panduan terperinci tentang cara siapkan di sini.
Setelah menyiapkan lingkungan pemrograman Python, Anda harus menginstal alat tambahan:
pip install tflite-support
Alat metadata LiteRT mendukung Python 3.
Menambahkan metadata menggunakan Flatbuffers Python API
Ada tiga bagian metadata model pada skema:
- Informasi model - Deskripsi keseluruhan model serta item
seperti persyaratan lisensi. Lihat
ModelMetadata.
- Informasi input - Deskripsi input dan pra-pemrosesan
diperlukan seperti normalisasi. Lihat
SubGraphMetadata.input_tensor_metadata.
- Informasi output - Deskripsi output dan pasca-pemrosesan yang diperlukan, seperti pemetaan pada label. Lihat SubGraphMetadata.output_tensor_metadata.
- Informasi input - Deskripsi input dan pra-pemrosesan
diperlukan seperti normalisasi. Lihat
SubGraphMetadata.input_tensor_metadata.
Karena LiteRT hanya mendukung subgrafik tunggal pada titik ini,
Pembuat kode LiteRT
dan ML Binding Android Studio
utama
akan menggunakan ModelMetadata.name
dan ModelMetadata.description
, bukan
SubGraphMetadata.name
dan SubGraphMetadata.description
, saat menampilkan
metadata dan menghasilkan kode.
Jenis Input / Output yang didukung
Metadata LiteRT untuk input dan output tidak dirancang dengan jenis model saja, tetapi jenis input dan output-nya. Tidak masalah apa model akan berfungsi secara fungsional, selama jenis input dan output terdiri dari atau kombinasi dari yang berikut ini, didukung oleh TensorFlow Metadata Lite:
- Fitur - Angka yang merupakan bilangan bulat tanpa tanda tangan atau float32.
- Gambar - Metadata saat ini mendukung gambar RGB dan hitam putih.
- Kotak pembatas - Kotak pembatas bentuk persegi panjang. Skema mendukung sebuah variasi penomoran skema ini.
Mengemas file terkait
Model LiteRT mungkin dilengkapi dengan file terkait yang berbeda. Misalnya, model bahasa alami biasanya memiliki file kosakata yang memetakan potongan kata ke kata tanda pengenal; model klasifikasi mungkin memiliki file label yang menunjukkan kategori objek. Tanpa file terkait (jika ada), model tidak akan berfungsi dengan baik.
File terkait kini dapat dipaketkan dengan model melalui metadata
library Python. Model LiteRT baru menjadi file zip yang berisi
model dan file yang terkait. Kunci keamanan dapat dibuka dengan zip umum
alat. Format model baru ini tetap menggunakan ekstensi file yang sama, .tflite
. Ini
kompatibel dengan framework TFLite dan Penerjemah yang sudah ada. Lihat Metadata paket
dan file terkait ke dalam
model untuk mengetahui detail selengkapnya.
Informasi file terkait dapat direkam dalam metadata. Bergantung pada
jenis file dan tempat lampiran file (yaitu ModelMetadata
,
SubGraphMetadata
, dan TensorMetadata
), kode LiteRT Android
generator dapat menerapkan pra/pasca-yang terkait
diproses secara otomatis ke objek. Lihat <Codegen usage> bagian dari
setiap file terkait
jenis
di skema untuk detail lebih lanjut.
Parameter normalisasi dan kuantisasi
Normalisasi adalah teknik pra-pemrosesan data yang umum dalam {i>machine learning<i}. Tujuan tujuan normalisasi adalah untuk mengubah nilai-nilai ke skala yang sama, tanpa mendistorsi perbedaan dalam rentang nilai.
Kuantisasi model adalah teknik yang memungkinkan pengurangan representasi presisi bobot dan secara opsional, aktivasi untuk penyimpanan dan komputasi.
Terkait pra-pemrosesan dan pasca-pemrosesan, normalisasi dan kuantisasi adalah dua langkah independen. Berikut detailnya.
Normalisasi | Kuantisasi | |
---|---|---|
Contoh dari nilai parameter dari masukkan gambar dalam MobileNet untuk {i>float<i} dan model kuantitatif, secara berurutan. |
Model mengambang: - rata-rata: 127,5 - std: 127,5 Model kuantitas: - rata-rata: 127,5 - std: 127,5 |
Model mengambang: - zeroPoint: 0 - skala: 1.0 Model kuantitas: - zeroPoint: 128,0 - skala:0.0078125f |
Kapan harus memanggil? |
Input: Jika input data dinormalisasi dalam pelatihan, input kebutuhan data inferensi untuk dinormalisasi sebagaimana mestinya. Output: output data tidak akan dinormalkan secara umum. |
Model mengambang melakukan
tidak perlu kuantisasi. Model terkuantisasi dapat atau mungkin tidak perlu kuantisasi di pra/pasca diproses. Tergantung tipe data dari tensor input/output. - tensor float: tidak kuantisasi di pra/pasca pemrosesan data yang diperlukan. Quant op dan dequant op adalah yang dimasukkan ke dalam model grafik. - tensor int8/uint8: membutuhkan kuantisasi dalam pra/pasca-pemrosesan. |
Rumus |
normalized_input = (input - rata-rata) / std |
Menghitung kuantitas untuk input:
q = f / skala + zeroPoint Dekuantisasi untuk output: f = (q - zeroPoint) * skala |
Di mana parameter |
Diisi oleh pembuat model
dan disimpan dalam model
{i>metadata<i}, sebagai
NormalizationOptions |
Diisi otomatis oleh konverter TFLite, dan disimpan dalam model tflite . |
Cara mendapatkan parameter? | Melalui
API MetadataExtractor
[2]
|
Melalui TFLite
Tensor API [1] atau
melalui
API MetadataExtractor
[2] |
Melakukan {i>float<i} dan {i>quant<i} model memiliki kesamaan nilai? | Ya, float dan quant memiliki kesamaan Normalisasi parameter | Tidak, model {i>float <i}melakukan tidak perlu kuantisasi. |
Apakah Kode TFLite generator atau Android Binding ML Studio buat secara otomatis dalam pemrosesan data? | Ya |
Ya |
[1] Class LiteRT Java
API
dan LiteRT C++
API baru.
[2] Library ekstraktor metadata
Saat memproses data gambar untuk model uint8, normalisasi dan kuantisasi dilakukan kadang-kadang dilewati. Tidak masalah jika nilai piksel berada dalam rentang [0, 255]. Tetapi secara umum, Anda harus selalu memproses data sesuai dengan parameter normalisasi dan kuantisasi jika berlaku.
Contoh
Anda dapat menemukan contoh tentang bagaimana metadata harus diisi untuk berbagai jenis model di sini:
Klasifikasi gambar
Download skrip di sini , yang mengisi metadata untuk 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
Guna mengisi metadata untuk model klasifikasi gambar lainnya, tambahkan spesifikasi model suka ini ke dalam skrip. Bagian selanjutnya dari panduan ini akan menyoroti beberapa bagian penting dalam contoh klasifikasi gambar untuk mengilustrasikan elemen-elemen utama.
Mempelajari 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 input / output
Bagian ini menunjukkan cara mendeskripsikan tanda tangan input dan output model Anda. Metadata ini dapat digunakan oleh generator kode otomatis untuk membuat pra- dan pasca- memproses kode Anda. Untuk membuat informasi input atau output tentang tensor:
# Creates input info.
input_meta = _metadata_fb.TensorMetadataT()
# Creates output info.
output_meta = _metadata_fb.TensorMetadataT()
Input gambar
Gambar adalah jenis input umum untuk machine learning. Metadata LiteRT mendukung informasi seperti ruang warna dan informasi pra-pemrosesan seperti proses normalisasi. Dimensi gambar tidak memerlukan spesifikasi manual karena sudah disediakan oleh bentuk tensor input dan bisa secara otomatis disimpulkan.
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
Output label
Label bisa dipetakan ke tensor output 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]
Membuat Flatbuffer metadata
Kode berikut menggabungkan informasi model dengan input dan output informasi:
# 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()
Mengemas metadata dan file terkait ke dalam model
Setelah Flatbuffer metadata dibuat, metadata dan file label
yang ditulis ke dalam file TFLite melalui metode populate
:
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 bisa mengemas file terkait sebanyak yang Anda inginkan ke dalam model melalui
load_associated_files
. Namun, Anda harus mengemas setidaknya file tersebut
yang didokumentasikan dalam metadata. Dalam contoh ini, mengemas file label
bersifat wajib.
Memvisualisasikan metadata
Anda dapat menggunakan Netron untuk memvisualisasikan
metadata, atau Anda dapat membaca metadata dari model LiteRT ke 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 tampilan metadata melalui Android Studio ML Penjilidan fitur.
Pembuatan versi metadata
Metadata skema dibuat versi keduanya menggunakan nomor pembuatan versi Semantik, yang melacak perubahan file skema, dan dengan identifikasi file Flatbuffer, yang menunjukkan kompatibilitas versi sebenarnya.
Nomor pembuatan versi Semantik
Skema metadata dibuat versi oleh Pembuatan versi semantik
angka,
seperti MAJOR.MINOR.PATCH. Alat ini melacak perubahan skema sesuai dengan aturan
di sini.
Lihat sejarah
kolom
yang ditambahkan setelah versi 1.0.0
.
Identifikasi file Flatbuffers
Pembuatan versi semantik menjamin kompatibilitas jika mengikuti aturan, tetapi tidak menunjukkan ketidakcocokan yang sesungguhnya. Saat meningkatkan nomor MAJOR, tidak berarti kompatibilitas mundur itu rusak. Oleh karena itu, kami menggunakan file Flatbuffers identifikasi, file_identifier, untuk menunjukkan kompatibilitas sebenarnya dari skema metadata. ID file adalah dengan panjang tepat 4 karakter. Data ini ditetapkan ke skema metadata tertentu dan tidak dapat diubah oleh pengguna. Jika kompatibilitas mundur skema metadata harus rusak karena alasan tertentu, file_identifier akan muncul, misalnya, dari “M001” menjadi “M002”. File_identifier diharapkan akan jauh lebih jarang diubah lebih sering daripada metadata_version.
Versi parser metadata minimum yang diperlukan
Parser metadata minimum yang diperlukan
versi
adalah versi minimum parser metadata (kode yang dihasilkan Flatbuffers) yang
dapat membaca {i>
Flatbuffers metadata<i} secara penuh. Versi ini sebenarnya adalah
nomor versi terbesar di antara semua versi dari semua {i>field<i} yang telah diisi dan
versi terkecil kompatibel yang
ditunjukkan oleh ID file. Minimum
versi parser metadata yang diperlukan otomatis diisi oleh
MetadataPopulator
saat metadata diisi ke model TFLite. Lihat
pengekstrak metadata untuk informasi selengkapnya tentang cara
versi parser metadata minimum yang diperlukan akan digunakan.
Membaca metadata dari model
{i>Library <i}Pengekstrak {i>Metadata<i} adalah alat yang mudah untuk membaca {i>metadata<i} dan file terkait dari model di berbagai platform (lihat referensi Java versi dan kolom C++ versi). Anda dapat membuat alat ekstraktor metadata sendiri dalam bahasa lain menggunakan Library buffer datar.
Membaca metadata di Java
Untuk menggunakan library Ekstraktor Metadata di aplikasi Android Anda, sebaiknya gunakan
AAR Metadata LiteRT yang dihosting di
MavenCentral.
File ini berisi class MetadataExtractor
, serta Java FlatBuffers
binding untuk metadata
skema
dan model
skema.
Anda dapat menentukannya dalam dependensi build.gradle
sebagai berikut:
dependencies {
implementation 'org.tensorflow:tensorflow-lite-metadata:0.1.0'
}
Untuk menggunakan snapshot setiap malam, pastikan Anda telah menambahkan snapshot Sonatype repositori Anda.
Anda dapat melakukan inisialisasi objek MetadataExtractor
dengan ByteBuffer
yang menunjuk
pada model:
public MetadataExtractor(ByteBuffer buffer);
ByteBuffer
tidak boleh berubah sepanjang waktu
Objek MetadataExtractor
. Inisialisasi mungkin gagal jika file Flatbuffers
ID metadata model tidak cocok dengan parser metadata. Lihat
pembuatan versi metadata untuk informasi selengkapnya.
Dengan ID file yang cocok, ekstraktor metadata akan berhasil membaca metadata yang dihasilkan dari semua skema sebelumnya dan yang akan datang karena Flatbuffer mekanisme kompatibilitas maju dan mundur. Namun, bidang dari proyek skema tidak dapat diekstrak oleh ekstraktor metadata yang lebih lama. Jumlah minimum yang diperlukan versi parser metadata menunjukkan versi minimum parser metadata yang dapat membaca metadata Buffering penuh. Anda dapat menggunakan metode berikut untuk memverifikasi apakah nilai minimum kondisi versi parser yang diperlukan terpenuhi:
public final boolean isMinimumParserVersionSatisfied();
Meneruskan model tanpa metadata diizinkan. Namun, memanggil metode yang
membaca dari metadata akan
menyebabkan error runtime. Anda dapat memeriksa apakah model memiliki
metadata dengan memanggil metode hasMetadata
:
public boolean hasMetadata();
MetadataExtractor
menyediakan fungsi yang mudah digunakan untuk mendapatkan
tensor input/output {i>metadata<i}. Misalnya,
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 model LiteRT
skema
mendukung beberapa subgrafik, Penafsir TFLite saat ini hanya mendukung
subgrafik tunggal. Oleh karena itu, MetadataExtractor
menghilangkan indeks subgrafik sebagai input
dalam metodenya.
Membaca file terkait dari model
Model LiteRT dengan metadata dan file terkait pada dasarnya adalah {i>zip<i} yang dapat dibuka dengan alat {i>zip<i} umum untuk mendapatkan file-file terkait. Misalnya, Anda dapat mengekstrak 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 library Metadata Extractor.
Di Java, teruskan nama file ke MetadataExtractor.getAssociatedFile
berikut:
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;