TensorFlow Lite meta verileri, model açıklamaları için bir standart sağlar. Meta veriler, modelin ne yaptığı ve girdi/çıktı bilgileri hakkında önemli bir bilgi kaynağıdır. Meta veriler her ikisinden de oluşur
- modeli kullanırken en iyi uygulamayı ileten insan tarafından okunabilir parçalar ve
- TensorFlow Lite Android kod oluşturucu ve Android Studio ML Binding özelliği gibi kod oluşturucular tarafından kullanılabilen makine tarafından okunabilen parçalar.
TensorFlow Hub'da yayınlanan tüm görüntü modelleri meta verilerle dolduruldu.
Meta veri biçimine sahip model

Model meta verileri, bir FlatBuffer dosyası olan metadata_schema.fbs içinde tanımlanır. Şekil 1'de gösterildiği gibi, TFLite model şemasının metadata alanında "TFLITE_METADATA"
adı altında saklanır. Bazı modeller, sınıflandırma etiketi dosyaları gibi ilişkili dosyalarla birlikte gelebilir. Bu dosyalar, ZipFile "ekleme" modu ( 'a'
modu) kullanılarak bir ZIP olarak orijinal model dosyasının sonuna birleştirilir. TFLite Yorumlayıcı, yeni dosya biçimini eskisi gibi kullanabilir. Daha fazla bilgi için İlişkili dosyaları paketleme konusuna bakın.
Meta verilerin nasıl doldurulacağı, görselleştirileceği ve okunacağı hakkında aşağıdaki talimata bakın.
Meta veri araçlarını kurun
Modelinize meta veri eklemeden önce, TensorFlow'u çalıştırmak için bir Python programlama ortamı kurulumuna ihtiyacınız olacak. Bunun nasıl kurulacağına dair ayrıntılı bir kılavuz var burada .
Python programlama ortamını kurduktan sonra, ek araçlar yüklemeniz gerekecektir:
pip install tflite-support
TensorFlow Lite meta veri araçları Python 3'ü destekler.
Flatbuffers Python API kullanarak meta veri ekleme
Şemada model meta verilerinin üç bölümü vardır:
- Model bilgileri - Modelin genel açıklamasının yanı sıra lisans koşulları gibi öğeler. ModelMetadata'ya bakın.
- Girdi bilgileri - Normalleştirme gibi gerekli girdilerin ve ön işlemenin açıklaması. SubGraphMetadata.input_tensor_metadata'ya bakın.
- Çıktı bilgileri - Etiketlere eşleme gibi gerekli çıktı ve son işlemenin açıklaması. SubGraphMetadata.output_tensor_metadata'ya bakın.
TensorFlow Lite bu noktada yalnızca tek alt grafiği desteklediğinden, TensorFlow Lite kod oluşturucu ve Android Studio ML Binding özelliği , meta verileri görüntülerken ve kod oluştururken ModelMetadata.name
ve ModelMetadata.description
yerine SubGraphMetadata.name
ve SubGraphMetadata.description
kullanır.
Desteklenen Giriş / Çıkış türleri
Giriş ve çıkış için TensorFlow Lite meta verileri, belirli model türleri düşünülerek değil, daha çok giriş ve çıkış türleri düşünülerek tasarlanmıştır. Modelin işlevsel olarak ne yaptığı önemli değildir, giriş ve çıkış türleri aşağıdakilerden veya bunların bir kombinasyonundan oluştuğu sürece, TensorFlow Lite meta verileri tarafından desteklenir:
- Özellik - İşaretsiz tamsayılar veya float32 olan sayılar.
- Görüntü - Meta veriler şu anda RGB ve gri tonlamalı görüntüleri desteklemektedir.
- Sınırlayıcı kutu - Dikdörtgen şekilli sınırlayıcı kutular. Şema, çeşitli numaralandırma şemalarını destekler.
İlişkili dosyaları paketleyin
TensorFlow Lite modelleri, farklı ilişkili dosyalarla gelebilir. Örneğin, doğal dil modellerinde genellikle sözcük parçalarını sözcük kimlikleriyle eşleyen sözcük dosyaları bulunur; sınıflandırma modelleri, nesne kategorilerini gösteren etiket dosyalarına sahip olabilir. İlişkili dosyalar olmadan (varsa), bir model iyi çalışmayacaktır.
İlişkili dosyalar artık meta veri Python kitaplığı aracılığıyla modelle birlikte paketlenebilir. Yeni TensorFlow Lite modeli, hem modeli hem de ilişkili dosyaları içeren bir zip dosyası haline gelir. Yaygın zip araçlarıyla açılabilir. Bu yeni model biçimi, aynı dosya uzantısını kullanmaya devam ediyor, .tflite
. Mevcut TFLite çerçevesi ve Yorumlayıcı ile uyumludur. Daha fazla ayrıntı için meta verileri ve ilişkili dosyaları modele paketleme konusuna bakın.
İlişkili dosya bilgileri meta verilere kaydedilebilir. Dosya türüne ve dosyanın eklendiği yere (yani ModelMetadata
, SubGraphMetadata
ve TensorMetadata
) bağlı olarak , TensorFlow Lite Android kod oluşturucu nesneye otomatik olarak karşılık gelen ön/son işlemeyi uygulayabilir. Daha fazla ayrıntı için şemadaki her ilişkili dosya türünün <Codegen kullanımı> bölümüne bakın.
Normalizasyon ve nicemleme parametreleri
Normalleştirme, makine öğreniminde yaygın bir veri ön işleme tekniğidir. Normalleştirmenin amacı, değer aralıklarındaki farklılıkları bozmadan değerleri ortak bir ölçeğe dönüştürmektir.
Model niceleme , ağırlıkların azaltılmış kesinlik temsillerine ve isteğe bağlı olarak hem depolama hem de hesaplama için aktivasyonlara izin veren bir tekniktir.
Ön işleme ve son işleme açısından, normalleştirme ve niceleme iki bağımsız adımdır. Detaylar burada.
normalleştirme | niceleme | |
---|---|---|
Sırasıyla kayan nokta ve nicelik modelleri için MobileNet'teki giriş görüntüsünün parametre değerlerinin bir örneği. | Şamandıra modeli : - ortalama: 127.5 - standart: 127.5 Miktar modeli : - ortalama: 127.5 - standart: 127.5 | Şamandıra modeli : - sıfırNoktası: 0 - ölçek: 1.0 Miktar modeli : - sıfırNoktası: 128,0 - ölçek:0.0078125f |
Ne zaman çağrılır? | Girdiler : Eğitimde girdi verileri normalleştirilirse, çıkarımın girdi verilerinin buna göre normalleştirilmesi gerekir. Çıktılar : çıktı verileri genel olarak normalleştirilmeyecektir. | Şamandıralı modeller niceleme gerektirmez. Nicelleştirilmiş model , işlem öncesi/sonrası nicemlemeye ihtiyaç duyabilir veya gerekmeyebilir. Giriş/çıkış tensörlerinin veri tipine bağlıdır. - yüzer tensörler: ön/son işlemde nicemleme gerekmez. Quant op ve dequant op, model grafiğinde pişirilir. - int8/uint8 tensörleri: ön/son işlemde niceleme gerekir. |
formül | normalized_input = (girdi - ortalama) / standart | Girişler için niceleme : q = f / ölçek + sıfırNoktası Çıkışlar için dekuantize et : f = (q - sıfır Noktası) * ölçek |
parametreler nerede | Model yaratıcısı tarafından doldurulur ve model meta verilerinde NormalizationOptions olarak saklanır | TFLite dönüştürücü tarafından otomatik olarak doldurulur ve tflite model dosyasında saklanır. |
Parametreler nasıl alınır? | MetadataExtractor API'si aracılığıyla [2] | TFLite Tensor API'si [1] veya MetadataExtractor API'si [2] aracılığıyla |
Float ve quant modelleri aynı değeri paylaşıyor mu? | Evet, kayan nokta ve nicelik modelleri aynı Normalleştirme parametrelerine sahiptir | Hayır, şamandıra modelinin nicemlemeye ihtiyacı yoktur. |
TFLite Code oluşturucu veya Android Studio ML bağlaması, veri işlemede bunu otomatik olarak oluşturur mu? | Evet | Evet |
[1] TensorFlow Lite Java API ve TensorFlow Lite C++ API .
[2] Meta veri çıkarıcı kitaplığı
uint8 modelleri için görüntü verileri işlenirken, normalleştirme ve niceleme bazen atlanır. Piksel değerleri [0, 255] aralığında olduğunda bunu yapmak uygundur. Ancak genel olarak, uygulanabilir olduğunda verileri her zaman normalleştirme ve niceleme parametrelerine göre işlemelisiniz.
Meta verilerde NormalizationOptions
ayarlarsanız, TensorFlow Lite Görev Kitaplığı normalleştirmeyi sizin için işleyebilir. Kuantizasyon ve dekuantizasyon işlemi her zaman kapsüllenir.
Örnekler
Farklı model türleri için meta verilerin nasıl doldurulması gerektiğine ilişkin örnekleri burada bulabilirsiniz:
Görüntü sınıflandırması
Meta verileri mobilenet_v1_0.75_160_quantized.tflite dosyasına yerleştiren komut dosyasını buradan indirin. Komut dosyasını şu şekilde çalıştırın:
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
Diğer görüntü sınıflandırma modelleri için meta verileri doldurmak için, bunun gibi model özelliklerini komut dosyasına ekleyin. Bu kılavuzun geri kalanı, temel öğeleri göstermek için görüntü sınıflandırma örneğindeki bazı önemli bölümleri vurgulayacaktır.
Görüntü sınıflandırma örneğine derinlemesine dalın
Model bilgileri
Meta veriler, yeni bir model bilgisi oluşturarak başlar:
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.")
Giriş / çıkış bilgisi
Bu bölüm, modelinizin giriş ve çıkış imzasını nasıl tanımlayacağınızı gösterir. Bu meta veriler, otomatik kod oluşturucular tarafından işlem öncesi ve sonrası kod oluşturmak için kullanılabilir. Bir tensör hakkında girdi veya çıktı bilgisi oluşturmak için:
# Creates input info.
input_meta = _metadata_fb.TensorMetadataT()
# Creates output info.
output_meta = _metadata_fb.TensorMetadataT()
Görüntü girişi
Görüntü, makine öğrenimi için yaygın bir giriş türüdür. TensorFlow Lite meta verileri, renk alanı gibi bilgileri ve normalleştirme gibi ön işleme bilgilerini destekler. Görüntünün boyutu, giriş tensörünün şekli tarafından zaten sağlandığından ve otomatik olarak çıkarılabildiğinden manuel belirtim gerektirmez.
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
Etiket çıktısı
Etiket, TENSOR_AXIS_LABELS
kullanılarak ilişkili bir dosya aracılığıyla bir çıktı tensörüne eşlenebilir.
# 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]
Flatbuffers meta verilerini oluşturun
Aşağıdaki kod, model bilgilerini giriş ve çıkış bilgileriyle birleştirir:
# 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()
Modele meta verileri ve ilişkili dosyaları paketleyin
Flatbuffers meta verileri oluşturulduktan sonra, meta veriler ve etiket dosyası populate
yöntemiyle TFLite dosyasına yazılır:
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
aracılığıyla modele istediğiniz kadar ilişkili dosyayı paketleyebilirsiniz. Ancak, en azından meta verilerde belgelenen dosyaların paketlenmesi gerekir. Bu örnekte, etiket dosyasının paketlenmesi zorunludur.
Meta verileri görselleştirin
Meta verilerinizi görselleştirmek için Netron'u kullanabilir veya MetadataDisplayer
kullanarak bir TensorFlow Lite modelindeki meta verileri bir json biçiminde okuyabilirsiniz:
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 Binding özelliği aracılığıyla meta verilerin görüntülenmesini de destekler.
Meta veri sürümü oluşturma
Meta veri şeması , hem şema dosyasındaki değişiklikleri izleyen Semantik sürüm oluşturma numarasına hem de gerçek sürüm uyumluluğunu gösteren Flatbuffers dosya kimliğine göre sürümlendirilir.
Semantik sürüm numarası
Meta veri şeması, MAJOR.MINOR.PATCH gibi Semantik sürüm oluşturma numarasına göre sürümlendirilir. Buradaki kurallara göre şema değişikliklerini takip eder. 1.0.0
sürümünden sonra eklenen alanların geçmişine bakın.
Flatbuffers dosya kimliği
Anlamsal sürüm oluşturma, kurallara uyulması durumunda uyumluluğu garanti eder, ancak gerçek uyumsuzluğu ima etmez. MAJOR numarasının çarpılması, geriye dönük uyumluluğun bozulduğu anlamına gelmez. Bu nedenle, meta veri şemasının gerçek uyumluluğunu belirtmek için Flatbuffers dosya tanımlamasını ( file_identifier ) kullanırız. Dosya tanımlayıcısı tam olarak 4 karakter uzunluğundadır. Belirli bir meta veri şemasına sabitlenir ve kullanıcılar tarafından değiştirilemez. Meta veri şemasının geriye dönük uyumluluğunun herhangi bir nedenle bozulması gerekiyorsa, dosya_tanımlayıcısı örneğin "M001"den "M002"ye yükselir. File_identifier'ın metadata_version'dan çok daha az sıklıkta değiştirilmesi bekleniyor.
Minimum gerekli meta veri ayrıştırıcı sürümü
Minimum gerekli meta veri ayrıştırıcı sürümü , meta veri Flatbuffers meta verilerini tam olarak okuyabilen minimum meta veri ayrıştırıcı sürümüdür (Flatbuffers tarafından oluşturulan kod). Sürüm, doldurulan tüm alanların sürümleri arasında etkin bir şekilde en büyük sürüm numarası ve dosya tanımlayıcı tarafından belirtilen en küçük uyumlu sürümdür. Gerekli minimum meta veri ayrıştırıcı sürümü, meta veriler bir TFLite modeline yerleştirildiğinde MetadataPopulator
tarafından otomatik olarak doldurulur. Minimum gerekli meta veri ayrıştırıcı sürümünün nasıl kullanıldığı hakkında daha fazla bilgi için meta veri çıkarıcıya bakın.
Modellerden meta verileri okuyun
Metadata Extractor kitaplığı, farklı platformlardaki bir modelden meta verileri ve ilişkili dosyaları okumak için kullanışlı bir araçtır (bkz. Java sürümü ve C++ sürümü ). Flatbuffers kitaplığını kullanarak diğer dillerde kendi meta veri çıkarma aracınızı oluşturabilirsiniz.
Java'daki meta verileri okuyun
Android uygulamanızda Metadata Extractor kitaplığını kullanmak için MavenCentral'da barındırılan TensorFlow Lite Metadata AAR'ı kullanmanızı öneririz. MetadataExtractor
sınıfını ve ayrıca meta veri şeması ve model şeması için FlatBuffers Java bağlamalarını içerir.
Bunu build.gradle
bağımlılıklarınızda aşağıdaki gibi belirtebilirsiniz:
dependencies {
implementation 'org.tensorflow:tensorflow-lite-metadata:0.1.0'
}
Gecelik anlık görüntüleri kullanmak için Sonatype anlık görüntü deposunu eklediğinizden emin olun.
Modele işaret eden bir ByteBuffer
ile MetadataExtractor
nesnesini başlatabilirsiniz:
public MetadataExtractor(ByteBuffer buffer);
ByteBuffer
, MetadataExtractor
nesnesinin tüm kullanım ömrü boyunca değişmeden kalmalıdır. Model meta verilerinin Flatbuffers dosya tanımlayıcısı, meta veri ayrıştırıcısınınkiyle eşleşmezse başlatma başarısız olabilir. Daha fazla bilgi için meta veri sürümüne bakın.
Eşleşen dosya tanımlayıcıları ile, meta veri çıkarıcı, Flatbuffers'ın ileriye ve geriye dönük uyumluluk mekanizması nedeniyle tüm geçmiş ve gelecek şemalardan oluşturulan meta verileri başarıyla okuyacaktır. Ancak, gelecekteki şemalardan alanlar, eski meta veri çıkarıcılar tarafından ayıklanamaz. Meta verinin minimum gerekli ayrıştırıcı sürümü , metadata Flatbuffers'ı tam olarak okuyabilen minimum meta veri ayrıştırıcı sürümünü belirtir. Minimum gerekli ayrıştırıcı sürüm koşulunun karşılanıp karşılanmadığını doğrulamak için aşağıdaki yöntemi kullanabilirsiniz:
public final boolean isMinimumParserVersionSatisfied();
Meta veri içermeyen bir modele geçişe izin verilir. Ancak, meta verilerden okunan yöntemleri çağırmak, çalışma zamanı hatalarına neden olur. hasMetadata
yöntemini çağırarak bir modelin meta verisi olup olmadığını kontrol edebilirsiniz:
public boolean hasMetadata();
MetadataExtractor
, giriş/çıkış tensörlerinin meta verilerini almanız için uygun işlevler sağlar. Örneğin,
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 model şeması birden çok alt grafiği desteklese de, TFLite Yorumlayıcı şu anda yalnızca tek bir alt grafiği desteklemektedir. Bu nedenle, MetadataExtractor
, yöntemlerinde bir giriş argümanı olarak alt grafik indeksini atlar.
Modellerden ilişkili dosyaları okuyun
Meta verileri ve ilişkili dosyaları içeren TensorFlow Lite modeli, temel olarak, ilişkili dosyaları almak için yaygın zip araçlarıyla açılabilen bir zip dosyasıdır. Örneğin, mobilenet_v1_0.75_160_quantized dosyasını açabilir ve modeldeki etiket dosyasını aşağıdaki gibi ayıklayabilirsiniz:
$ 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
İlişkili dosyaları Metadata Extractor kitaplığı aracılığıyla da okuyabilirsiniz.
Java'da dosya adını MetadataExtractor.getAssociatedFile
yöntemine iletin:
public InputStream getAssociatedFile(String fileName);
Benzer şekilde, C++'da bu, ModelMetadataExtractor::GetAssociatedFile
yöntemiyle yapılabilir:
tflite::support::StatusOr<absl::string_view> GetAssociatedFile(
const std::string& filename) const;